diff --git a/CORE/DXE/src/wlan_qct_dxe.c b/CORE/DXE/src/wlan_qct_dxe.c
index 2482c86..c12e22d 100644
--- a/CORE/DXE/src/wlan_qct_dxe.c
+++ b/CORE/DXE/src/wlan_qct_dxe.c
@@ -77,6 +77,7 @@
 #define T_WLANDXE_TX_INT_ENABLE_FCOUNT     1
 #define T_WLANDXE_MEMDUMP_BYTE_PER_LINE    16
 #define T_WLANDXE_MAX_RX_PACKET_WAIT       6000
+#define WLANDXE_MAX_REAPED_RX_FRAMES       512
 
 /* This is temporary fot the compile
  * WDI will release official version
@@ -100,7 +101,7 @@
       "H2H_TEST_RX"
 #endif /* WLANDXE_TEST_CHANNEL_ENABLE */
    };
-
+static  wpt_packet               *rx_reaped_buf[WLANDXE_MAX_REAPED_RX_FRAMES];
 
 /*-------------------------------------------------------------------------
   *  External Function Proto Type
@@ -119,7 +120,6 @@
 /*-------------------------------------------------------------------------
   *  Local Function
   *-------------------------------------------------------------------------*/
-#ifdef WLANDXE_DEBUG_CH_INFO_DUMP
 /*==========================================================================
   @  Function Name 
       dxeChannelMonitor
@@ -142,28 +142,43 @@
 {
    wpt_status                status = eWLAN_PAL_STATUS_SUCCESS;
 
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   if((NULL == monitorDescription) || (NULL == channelEntry))
+   {
+      HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
+               "INVALID Input ARG");
+      return eWLAN_PAL_STATUS_E_INVAL;
+   }
+
+   if(channelEntry->channelType > WDTS_CHANNEL_RX_HIGH_PRI)
+   {
+      HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
+               "INVALID Channel type");
+      return eWLAN_PAL_STATUS_E_INVAL;
+   }
+
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "=== %s Channel Number %d, Channel Type %s",
             monitorDescription, channelEntry->assignedDMAChannel, channelType[channelEntry->channelType]);
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, 
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, 
             "numDesc %d, numFreeDesc %d, numResvDesc %d",
                    channelEntry->numDesc, channelEntry->numFreeDesc, channelEntry->numRsvdDesc);
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "headCB 0x%x, next 0x%x,  DESC 0x%x",
                    channelEntry->headCtrlBlk, channelEntry->headCtrlBlk->nextCtrlBlk, channelEntry->headCtrlBlk->linkedDescPhyAddr);
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "tailCB 0x%x, next 0x%x,  DESC 0x%x",
                    channelEntry->tailCtrlBlk, channelEntry->tailCtrlBlk->nextCtrlBlk, channelEntry->tailCtrlBlk->linkedDescPhyAddr);
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "headCB Order %d, tailCB Order %d",
             channelEntry->headCtrlBlk->ctrlBlkOrder, channelEntry->tailCtrlBlk->ctrlBlkOrder);
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "numFragmentCurrentChain %d, numTotalFrame %d ===",
             channelEntry->numFragmentCurrentChain,    channelEntry->numTotalFrame);
 
    return status;
 }
 
+#ifdef WLANDXE_DEBUG_MEMORY_DUMP
 /*==========================================================================
   @  Function Name 
       dxeMemoryDump
@@ -189,6 +204,12 @@
    wpt_uint32                numBytes    = 0;
    wpt_uint32                idx;
 
+   if((NULL == dumpPointer) ||
+      (NULL == dumpTarget))
+   {
+      return status;
+   }
+
    HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
             "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
@@ -213,6 +234,7 @@
 
    return status;
 }
+#endif /* WLANDXE_DEBUG_MEMORY_DUMP */
 
 /*==========================================================================
   @  Function Name 
@@ -238,24 +260,23 @@
    wpt_status                status      = eWLAN_PAL_STATUS_SUCCESS;
 
 
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
-            "Descriptor Dump for channel %s, %d / %d fragment",
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
+            "Descriptor Dump for channel %s, order %d",
                    channelType[channelEntry->channelType],
-                   fragmentOrder + 1,
-                   channelEntry->numFragmentCurrentChain);
+                   fragmentOrder);
 
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "CTRL WORD 0x%x, TransferSize %d",
                    WLANDXE_U32_SWAP_ENDIAN(targetDesc->descCtrl.ctrl),
             WLANDXE_U32_SWAP_ENDIAN(targetDesc->xfrSize));
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "SRC ADD 0x%x, DST ADD 0x%x, NEXT DESC 0x%x",
                    WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.srcMemAddrL),
                    WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.dstMemAddrL),
                    WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.phyNextL));
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
 
    return status;
@@ -284,39 +305,76 @@
    wpt_status                status      = eWLAN_PAL_STATUS_SUCCESS;
    wpt_uint32                regValue    = 0;
 
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "%s Channel register dump for %s, base address 0x%x", 
                    channelType[channelEntry->channelType],
                    dumpTarget,
                    channelEntry->channelRegister.chDXEBaseAddr);
    regValue = 0;
    wpalReadRegister(channelEntry->channelRegister.chDXECtrlRegAddr, &regValue);
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "Control Register 0x%x", regValue);
 
    regValue = 0;
    wpalReadRegister(channelEntry->channelRegister.chDXEStatusRegAddr, &regValue);
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "Status Register 0x%x", regValue);
    regValue = 0;
 
    wpalReadRegister(channelEntry->channelRegister.chDXESadrlRegAddr, &regValue);
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "Source Address Register 0x%x", regValue);
    regValue = 0;
 
    wpalReadRegister(channelEntry->channelRegister.chDXEDadrlRegAddr, &regValue);
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "Destination Address Register 0x%x", regValue);
    regValue = 0;
 
    wpalReadRegister(channelEntry->channelRegister.chDXELstDesclRegAddr, &regValue);
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
             "Descriptor Address Register 0x%x", regValue);
 
    return status;
 }
-#endif /* WLANDXE_DEBUG_CH_INFO_DUMP */
+
+/*==========================================================================
+  @  Function Name 
+      dxeChannelAllDescDump
+
+  @  Description 
+      Dump all DXE descriptors within assigned channe;
+
+  @  Parameters
+      WLANDXE_ChannelCBType   *channelEntry
+
+  @  Return
+      NONE
+
+===========================================================================*/
+void dxeChannelAllDescDump
+(
+   WLANDXE_ChannelCBType   *channelEntry
+)
+{
+   wpt_uint32               channelLoop;
+   WLANDXE_DescCtrlBlkType *targetCtrlBlk;
+
+   targetCtrlBlk = channelEntry->headCtrlBlk;
+
+   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
+            "%s %d descriptor chains",
+                    channelType[channelEntry->channelType], (int)channelEntry->numDesc);
+   for(channelLoop = 0; channelLoop < channelEntry->numDesc; channelLoop++)
+   {
+      HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
+               "%5d : 0x%x", (int)targetCtrlBlk->ctrlBlkOrder,
+                                    (unsigned int)targetCtrlBlk->linkedDesc->descCtrl.ctrl);
+      targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk;
+   }
+
+   return;
+}
 
 /*==========================================================================
   @  Function Name 
@@ -1183,6 +1241,45 @@
       return eWLAN_PAL_STATUS_E_FAULT;         
    }
 
+   /* Clean up Error INT Bit */
+   if(WLANDXE_CH_STAT_INT_ERR_MASK & *chStat)
+   {
+      status = wpalWriteRegister(WLANDXE_INT_ERR_CLR_ADDRESS,
+                                      (1 << channelEntry->assignedDMAChannel));
+      if(eWLAN_PAL_STATUS_SUCCESS != status)
+      {
+         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                  "dxeChannelCleanInt Read CH STAT register fail");
+         return eWLAN_PAL_STATUS_E_FAULT;         
+      }
+   }
+
+   /* Clean up DONE INT Bit */
+   if(WLANDXE_CH_STAT_INT_DONE_MASK & *chStat)
+   {
+      status = wpalWriteRegister(WLANDXE_INT_DONE_CLR_ADDRESS,
+                                      (1 << channelEntry->assignedDMAChannel));
+      if(eWLAN_PAL_STATUS_SUCCESS != status)
+      {
+         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                  "dxeChannelCleanInt Read CH STAT register fail");
+         return eWLAN_PAL_STATUS_E_FAULT;         
+      }
+   }
+
+   /* Clean up ED INT Bit */
+   if(WLANDXE_CH_STAT_INT_ED_MASK & *chStat)
+   {
+      status = wpalWriteRegister(WLANDXE_INT_ED_CLR_ADDRESS,
+                                      (1 << channelEntry->assignedDMAChannel));
+      if(eWLAN_PAL_STATUS_SUCCESS != status)
+      {
+         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                  "dxeChannelCleanInt Read CH STAT register fail");
+         return eWLAN_PAL_STATUS_E_FAULT;         
+      }
+   }
+
    HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
             "%s Exit", __FUNCTION__);
    return status;
@@ -1299,16 +1396,6 @@
    void                     *physAddress            = NULL;
 #endif /* FEATURE_R33D */
 
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
-            "%s Enter", __FUNCTION__);
-
-   /* Sanity Check */
-   if((NULL == dxeCtxt) || (NULL == channelEntry) || (NULL == currentCtrlBlock))
-   {
-      HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
-               "dxeChannelInitProgram Channel Entry is not valid");
-      return eWLAN_PAL_STATUS_E_INVAL;
-   }
 
    currentDesc            = currentCtrlBlock->linkedDesc;
 
@@ -1336,8 +1423,6 @@
    
    if(NULL == currentPalPacketBuffer)
    {
-      HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
-               "!!! RX PAL Packet Alloc Fail, packet will be queued when the callback is invoked !!!");
       return eWLAN_PAL_STATUS_E_RESOURCES;
    }
 
@@ -1399,8 +1484,6 @@
    currentDesc->dxedesc.dxe_short_desc.dstMemAddrL =
                                        WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)currentPalPacketBuffer->pBDPhys);
 
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
-            "%s Exit", __FUNCTION__);
    return status;
 }
 
@@ -1475,6 +1558,113 @@
 }
 
 /*==========================================================================
+  @  Function Name
+      dxeRXFrameRouteUpperLayer
+
+  @  Description 
+      Test DXE descriptors and if any RX frame pending within RING,
+      Route to upper layer
+
+  @  Parameters
+      WLANDXE_CtrlBlkType     *dxeCtrlBlk,
+                               DXE host driver main control block
+      WLANDXE_ChannelCBType   *channelEntry
+                               Channel specific control block
+  @  Return
+      -1 Any error happen
+      0  No frame pulled from RX RING
+      int number of RX frames pulled from RX ring
+
+===========================================================================*/
+static wpt_int32 dxeRXFrameRouteUpperLayer
+(
+   WLANDXE_CtrlBlkType     *dxeCtxt,
+   WLANDXE_ChannelCBType   *channelEntry
+)
+{
+   wpt_status                status = eWLAN_PAL_STATUS_SUCCESS;
+   WLANDXE_DescCtrlBlkType  *currentCtrlBlk = NULL;
+   WLANDXE_DescType         *currentDesc    = NULL;
+   wpt_uint32                descCtrl, frameCount = 0, i;
+
+   currentCtrlBlk = channelEntry->headCtrlBlk;
+   currentDesc    = currentCtrlBlk->linkedDesc;
+
+   /* Descriptoe should be SWAPPED ???? */
+   descCtrl = currentDesc->descCtrl.ctrl;
+
+   /* Get frames while VALID bit is not set (DMA complete) and a data 
+    * associated with it */
+   while(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID) &&
+         (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)) &&
+         (currentCtrlBlk->xfrFrame->pInternalData != NULL) &&
+         (frameCount < WLANDXE_MAX_REAPED_RX_FRAMES) )
+   {
+      channelEntry->numTotalFrame++;
+      channelEntry->numFreeDesc++;
+#ifdef FEATURE_R33D
+      /* Transfer Size should be */
+      currentDesc->xfrSize = WLANDXE_U32_SWAP_ENDIAN(WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE);
+      status = wpalPrepareRxFrame(&currentCtrlBlk->xfrFrame,
+                                       (wpt_uint32)currentCtrlBlk->xfrFrame->pBDPhys,
+                                       currentCtrlBlk->shadowBufferVa,
+                                       WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE);
+      if(eWLAN_PAL_STATUS_SUCCESS != status)
+      {
+         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                  "dxeRXFrameReady Prepare RX Frame fail");
+         return -1;
+      }
+      status = wpalFreeRxFrame(currentCtrlBlk->shadowBufferVa);
+      if(eWLAN_PAL_STATUS_SUCCESS != status)
+      {
+         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                  "dxeRXFrameReady Free Shadow RX Frame fail");
+         return -1;
+      }
+
+#else /* FEATURE_R33D */
+      status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
+      if (eWLAN_PAL_STATUS_SUCCESS != status)
+      {
+         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                  "dxeRXFrameReady unable to unlock packet");
+         return -1;
+      }
+#endif /* FEATURE_R33D */
+      /* This Descriptor is valid, so linked Control block is also valid
+       * Linked Control block has pre allocated packet buffer
+       * So, just let upper layer knows preallocated frame pointer will be OK */
+      /* Reap Rx frames */ 
+      rx_reaped_buf[frameCount] = currentCtrlBlk->xfrFrame;
+      frameCount++;
+
+      /* Now try to refill the ring with empty Rx buffers to keep DXE busy */
+      dxeRXFrameRefillRing(dxeCtxt,channelEntry);
+
+      /* Test next contorl block
+       * if valid, this control block also has new RX frame must be handled */
+      currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk;
+      currentDesc    = currentCtrlBlk->linkedDesc;
+      descCtrl       = currentDesc->descCtrl.ctrl;
+   }
+
+   /* Update head control block
+    * current control block's valid bit was 0
+    * next trial first control block must be current control block */
+   channelEntry->headCtrlBlk = currentCtrlBlk;
+
+   /* Deliver all the reaped RX frames to upper layers */
+   i = 0;
+   while(i < frameCount) {
+      dxeCtxt->rxReadyCB(dxeCtxt->clientCtxt, rx_reaped_buf[i], channelEntry->channelType);
+      i++;
+   }
+
+   return frameCount;
+}
+
+/*==========================================================================
   @  Function Name 
       dxeRXFrameReady
 
@@ -1503,7 +1693,10 @@
    WLANDXE_DescCtrlBlkType  *currentCtrlBlk = NULL;
    WLANDXE_DescType         *currentDesc    = NULL;
    wpt_uint32                descCtrl;
-   wpt_uint32                frameCount = 0;
+   wpt_int32                 frameCount = 0;
+
+   wpt_uint32                descLoop;
+   wpt_uint32                invalidatedFound = 0;
 
    HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
             "%s Enter", __FUNCTION__);
@@ -1516,79 +1709,89 @@
       return eWLAN_PAL_STATUS_E_INVAL;
    }
 
-   currentCtrlBlk = channelEntry->headCtrlBlk;
-   currentDesc    = currentCtrlBlk->linkedDesc;
+   frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry);
 
-   /* Descriptoe should be SWAPPED ???? */
-   descCtrl = currentDesc->descCtrl.ctrl;
-
-   /* Get frames while VALID bit is not set (DMA complete) and a data 
-    * associated with it */
-   while(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID) &&
-         (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)))
-   {
-      channelEntry->numTotalFrame++;
-      channelEntry->numFreeDesc++;
-#ifdef FEATURE_R33D
-      /* Transfer Size should be */
-      currentDesc->xfrSize = WLANDXE_U32_SWAP_ENDIAN(WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE);
-      status = wpalPrepareRxFrame(&currentCtrlBlk->xfrFrame,
-                                       (wpt_uint32)currentCtrlBlk->xfrFrame->pBDPhys,
-                                       currentCtrlBlk->shadowBufferVa,
-                                       WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE);
-      if(eWLAN_PAL_STATUS_SUCCESS != status)
+   if(0 > frameCount)
       {
          HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
-                  "dxeRXFrameReady Prepare RX Frame fail");
-         return status;
-      }
-      status = wpalFreeRxFrame(currentCtrlBlk->shadowBufferVa);
-      if(eWLAN_PAL_STATUS_SUCCESS != status)
-      {
-         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
-                  "dxeRXFrameReady Free Shadow RX Frame fail");
-         return status;
-      }
-
-#else /* FEATURE_R33D */
-      status = wpalUnlockPacket(currentCtrlBlk->xfrFrame);
-      if (eWLAN_PAL_STATUS_SUCCESS != status)
-      {
-         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
-                  "dxeRXFrameReady unable to unlock packet");
-         return status;
-      }
-#endif /* FEATURE_R33D */
-      if(NULL == dxeCtxt->rxReadyCB)
-      {
-         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
-                  "dxeRXFrameReady rxReadyCB function is not registered");
+               "dxeRXFrameReady RX frame route fail");
          return eWLAN_PAL_STATUS_E_INVAL;
       }
-      /* This Descriptor is valid, so linked Control block is also valid
-       * Linked Control block has pre allocated packet buffer
-       * So, just let upper layer knows preallocated frame pointer will be OK */
-      frameCount++;
-      dxeCtxt->rxReadyCB(dxeCtxt->clientCtxt,
-                         currentCtrlBlk->xfrFrame,
-                         channelEntry->channelType);
 
-      /* Now try to refill the ring with empty Rx buffers to keep DXE busy */
-      dxeRXFrameRefillRing(dxeCtxt,channelEntry);
-
-      /* Test next contorl block
-       * if valid, this control block also has new RX frame must be handled */
-      currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk;
+  if((0 == frameCount) &&
+      ((WLANDXE_POWER_STATE_BMPS == dxeCtxt->hostPowerState) ||
+       (WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState)))
+   {
+      currentCtrlBlk = channelEntry->headCtrlBlk;
       currentDesc    = currentCtrlBlk->linkedDesc;
       descCtrl       = currentDesc->descCtrl.ctrl;
+
+      if(WLANDXE_POWER_STATE_BMPS != dxeCtxt->hostPowerState)
+      {
+          HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
+                   "RX ISR called but no frame handled PWS %d, channel %s",
+                   (int)dxeCtxt->hostPowerState,
+                   channelType[channelEntry->channelType]);
+      }
+
+      /* Current interupt empty and previous interrupt also empty
+       * detected successive empty interrupt
+       * or first interrupt empty, this should not happen */
+      if(0 == channelEntry->numFragmentCurrentChain)
+      {
+         dxeChannelMonitor("RX Ready", channelEntry);
+         dxeDescriptorDump(channelEntry, channelEntry->headCtrlBlk->linkedDesc, 0);
+         dxeChannelRegisterDump(channelEntry, "RX successive empty interrupt");
+         dxeChannelAllDescDump(channelEntry);
+
+         /* Abnormal interrupt detected, try to find not validated descriptor */
+         for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++)
+         {
+            if(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID))
+            {
+               HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                        "Found Invalidated Descriptor %d", (int)descLoop);
+               if(eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame))
+               {
+                  HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                           "Packet locked, Resync Host and HW");
+                  channelEntry->headCtrlBlk = currentCtrlBlk;
+                  invalidatedFound = 1;
+                  break;
+               }
+               else
+               {
+                  HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                           "Packet Not Locked, cannot transfer frame");
+               }
+            }
+            currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk;
+            currentDesc    = currentCtrlBlk->linkedDesc;
+            descCtrl       = currentDesc->descCtrl.ctrl;
+         }
+
+         if(invalidatedFound)
+         {
+            HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                     "Found New Sync location with HW, handle frames from there");
+            frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry);
+            HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                     "re-sync routed %d frames to upper layer", (int)frameCount);
+            frameCount = 0;
+         }
+         else
+         {
+            HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                     "Could not found invalidated descriptor");
+            HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                     "RX successive empty interrupt, Could not find invalidated DESC reload driver");
+            dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE;
+            wpalWlanReload();
+         }
+      }
    }
 
    channelEntry->numFragmentCurrentChain = frameCount;
-   /* Update head control block
-    * current control block's valid bit was 0
-    * next trial first control block must be current control block */
-   channelEntry->headCtrlBlk = currentCtrlBlk;
-
    HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
             "%s Exit", __FUNCTION__);
    return status;
@@ -1743,20 +1946,21 @@
    wpt_status                status     = eWLAN_PAL_STATUS_SUCCESS;
    wpt_uint32                intSrc     = 0;
    WLANDXE_ChannelCBType    *channelCb  = NULL;
-   wpt_uint32                chHighStat;
-   wpt_uint32                chLowStat;
+   wpt_uint32                chHighStat = 0;
+   wpt_uint32                chLowStat  = 0;
 
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
-            "%s Enter", __FUNCTION__);
+   dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
 
-   /* Sanity Check */
-   if(NULL == rxReadyMsg)
+   if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing)
    {
       HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
-               "dxeRXEventHandler Channel Entry is not valid");
-      return;
+               "RX Ready WLAN Driver re-loading in progress");
    }
 
+   /* Now try to refill the ring with empty Rx buffers to keep DXE busy */
+   dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI]);
+   dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI]);
+
    dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
       
    if((!dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chEnabled) ||
@@ -1826,7 +2030,6 @@
                   "dxeRXEventHandler INT Clean up fail");
          return;         
       }
-
       if(WLANDXE_CH_STAT_INT_ERR_MASK & chHighStat)
       {
          /* Error Happen during transaction, Handle it */
@@ -1844,6 +2047,16 @@
       }
       HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
                "RX HIGH CH EVNT STAT 0x%x, %d frames handled", chHighStat, channelCb->numFragmentCurrentChain);
+      /* Update the Rx DONE histogram */
+      channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
+      if(WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat)
+      {
+         channelCb->rxDoneHistogram |= 1;
+      }
+      else
+      {
+         channelCb->rxDoneHistogram &= ~1;
+      }
    }
 #else
    /* Test H2H Test interrupt is enabled or not */
@@ -1885,7 +2098,7 @@
 #endif /* WLANDXE_TEST_CHANNEL_ENABLE */
 
    /* Test Low Priority Channel interrupt is enabled or not */
-   channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
+       channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI];
    if(intSrc & (1 << channelCb->assignedDMAChannel))
    {
       status = dxeChannelCleanInt(channelCb, &chLowStat);
@@ -1905,16 +2118,13 @@
          /* Handle RX Ready for low priority channel */
          status = dxeRXFrameReady(dxeCtxt,
                                   channelCb);
-      }
+       }
 
       /* Update the Rx DONE histogram */
       channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1);
       if(WLANDXE_CH_STAT_INT_DONE_MASK & chLowStat)
       {
          channelCb->rxDoneHistogram |= 1;
-         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO,
-            "DXE Channel Number %d, Rx DONE Histogram 0x%016llx",
-            channelCb->assignedDMAChannel, channelCb->rxDoneHistogram);
       }
       else
       {
@@ -2082,16 +2292,6 @@
    wpt_uint32                regValue;
 #endif /* FEATURE_R33D */
 
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
-            "%s Enter", __FUNCTION__);
-
-   /* Sanity Check */
-   if(NULL == hostCtxt)
-   {
-      HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
-               "dxeRXFrameReadyISR input is not valid");
-      return;
-   }
 
 #ifdef FEATURE_R33D
    status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
@@ -2134,8 +2334,6 @@
                "dxeRXFrameReadyISR interrupt serialize fail");
    }
 
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
-            "%s Exit", __FUNCTION__);
    return;
 }
 
@@ -2176,14 +2374,16 @@
 #else
    wpt_iterator                iterator;
 #endif /* FEATURE_R33D */
+    
+   wpt_uint32                  isEmpty = 0;
 
    HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
             "%s Enter", __FUNCTION__);
 
-   if(WLANDXE_POWER_STATE_BMPS == tempDxeCtrlBlk->hostPowerState)
+   if((0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc) &&
+      (0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc))
    {
-      tempDxeCtrlBlk->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN;
-      dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE);
+     isEmpty = 1;
    }
 
    channelEntry->numFragmentCurrentChain = 0;
@@ -2326,10 +2526,14 @@
    {
       /* Update channel head as next avaliable linked slot */
       channelEntry->headCtrlBlk = currentCtrlBlk;
-      tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE;
-      HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "SMSM_ret LO=%d HI=%d", tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc,
-               tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc );
-      dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
+      
+      if( isEmpty )
+      {
+          tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE;
+          HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "SMSM_ret LO=%d HI=%d", tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc,
+                   tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc );
+          dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE);
+      }
 	  return status;
    }
 
@@ -2559,7 +2763,7 @@
    {
       HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
                "dxeTXCompFrame TXCompCB is not registered");
-      return eWLAN_PAL_STATUS_E_EMPTY;
+      return eWLAN_PAL_STATUS_SUCCESS;
    }
 
    wpalMutexAcquire(&channelEntry->dxeChannelLock);
@@ -2570,7 +2774,7 @@
    if( currentCtrlBlk == channelEntry->headCtrlBlk )
    {
       wpalMutexRelease(&channelEntry->dxeChannelLock);
-      return eWLAN_PAL_STATUS_E_EMPTY;
+      return eWLAN_PAL_STATUS_SUCCESS;
    }
 
    /*  */
@@ -2695,11 +2899,38 @@
             "%s Enter", __FUNCTION__);
 
    dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext);
+   dxeCtxt->ucTxMsgCnt = 0;
+   
+   if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing)
+   {
+      HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+               "wlan: TX COMP WLAN Driver re-loading in progress");
+      return;
+   }
+
    /* Return from here if the RIVA is in IMPS, to avoid register access */
    if(WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState)
    {
-      HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
-         "%s Riva is in %d, return from here ", __FUNCTION__, dxeCtxt->hostPowerState);
+      HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+               "dxeTXEventHandler TX COMP INT");
+      status = dxeTXCompFrame(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI]);
+      if(eWLAN_PAL_STATUS_SUCCESS != status)
+      {
+         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                  "dxeTXEventHandler IMPS COMP interrupt fail");
+      }
+      if((dxeCtxt->txCompletedFrames) &&
+         (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable))
+      {
+         dxeCtxt->txIntEnable =  eWLAN_PAL_TRUE; 
+         wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
+         HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
+                  "TX COMP INT Enabled, remain TX frame count on ring %d",
+                  dxeCtxt->txCompletedFrames);
+         /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid 
+           the posibility of a race*/
+         dxePsComplete(dxeCtxt, eWLAN_PAL_TRUE);
+      }
       return;
    }
 
@@ -2711,8 +2942,6 @@
       return;
    }
 
-   dxeCtxt->ucTxMsgCnt = 0;   
-   
    /* Disable device interrupt */
    /* Read whole interrupt mask register and exclusive only this channel int */
    status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS,
@@ -2749,12 +2978,14 @@
          /* Handle TX complete for high priority channel */
          status = dxeTXCompFrame(dxeCtxt,
                                  channelCb);
+         bEnableISR = 1;
       }
       else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
       {
          /* Handle TX complete for high priority channel */
          status = dxeTXCompFrame(dxeCtxt,
                                  channelCb);
+         bEnableISR = 1;
       }
       else
       {
@@ -2795,12 +3026,14 @@
          /* Handle TX complete for low priority channel */
          status = dxeTXCompFrame(dxeCtxt,
                                  channelCb);
+         bEnableISR = 1;
       }
       else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat)
       {
          /* Handle TX complete for low priority channel */
          status = dxeTXCompFrame(dxeCtxt,
                                  channelCb);
+         bEnableISR = 1;
       }
       else
       {
@@ -2971,9 +3204,9 @@
             "%s Enter", __FUNCTION__);
 
    /* Return from here if the RIVA is in IMPS, to avoid register access */
-   if((WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) ||
-      (WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState))
+   if(WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState)
    {
+      dxeCtxt->txIntEnable = eWLAN_PAL_FALSE;
       /* Disable interrupt at here,
          IMPS or IMPS Pending state should not access RIVA register */
       status = wpalDisableInterrupt(DXE_INTERRUPT_TX_COMPLE);
@@ -3207,6 +3440,7 @@
    tempDxeCtrlBlk->dxeCookie    = WLANDXE_CTXT_COOKIE;
    tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_FALSE;
    tempDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE;
+   tempDxeCtrlBlk->driverReloadInProcessing = eWLAN_PAL_FALSE;
 
    /* Initialize SMSM state
     * Init State is
@@ -3989,8 +4223,6 @@
    }
    pDxeCtrlBlk = (WLANDXE_CtrlBlkType *)pDXEContext;
 
-   HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
-            "Set DXE Power state %d", powerState);
    switch(powerState)
    {
       case WDTS_POWER_STATE_FULL:
@@ -4076,6 +4308,7 @@
             if(eWLAN_PAL_TRUE == pDxeCtrlBlk->txIntDisabledByIMPS)
             {
                pDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE;
+               pDxeCtrlBlk->txIntEnable =  eWLAN_PAL_TRUE;
                /* Enable RX interrupt at here, if new PS is not IMPS */
                status = wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE);
                if(eWLAN_PAL_STATUS_SUCCESS != status)
diff --git a/CORE/DXE/src/wlan_qct_dxe_cfg_i.c b/CORE/DXE/src/wlan_qct_dxe_cfg_i.c
index 6bb0d42..398bd67 100644
--- a/CORE/DXE/src/wlan_qct_dxe_cfg_i.c
+++ b/CORE/DXE/src/wlan_qct_dxe_cfg_i.c
@@ -176,7 +176,7 @@
    WLANDXE_CHANNEL_HANDLE_CIRCULA,
 
    /* Number of Descriptor, NOT CLEAR YET !!! */
-   256,
+   512,
 
    /* MAX num RX Buffer, NOT CLEAR YET !!! */
    1,
diff --git a/CORE/DXE/src/wlan_qct_dxe_i.h b/CORE/DXE/src/wlan_qct_dxe_i.h
index aebb686..e29e18a 100644
--- a/CORE/DXE/src/wlan_qct_dxe_i.h
+++ b/CORE/DXE/src/wlan_qct_dxe_i.h
@@ -70,22 +70,31 @@
 #define WLANDXE_CTXT_COOKIE              0xC00CC111
 
 
-/* From here RIVA DXE register information
+/* From here WCNSS DXE register information
  * This is temporary definition location to make compile and unit test
  * If official msmreg.h integrated, this part will be eliminated */
 /* Start with base address */
-
+#ifdef WCN_PRONTO
+#define WLANDXE_CCU_DXE_INT_SELECT       0xfb2050dc
+#define WLANDXE_CCU_DXE_INT_SELECT_STAT  0xfb2050e0
+#define WLANDXE_CCU_ASIC_INT_ENABLE      0xfb2050e4
+#else
 #define WLANDXE_CCU_DXE_INT_SELECT       0x03200b10
 #define WLANDXE_CCU_DXE_INT_SELECT_STAT  0x03200b14
 #define WLANDXE_CCU_ASIC_INT_ENABLE      0x03200b18
+#endif
 
 #ifdef PAL_OS_TYPE_BMP
-#define WLANDXE_RIVA_BASE_ADDRESS        0xCDD00000
+#define WLANDXE_WCNSS_BASE_ADDRESS        0xCDD00000
 #else
-#define WLANDXE_RIVA_BASE_ADDRESS        0x03000000
+#ifdef WCN_PRONTO
+#define WLANDXE_WCNSS_BASE_ADDRESS        0xfb000000
+#else
+#define WLANDXE_WCNSS_BASE_ADDRESS        0x03000000
+#endif
 #endif /* PAL_OS_TYPE_BMP */
 
-#define WLANDXE_REGISTER_BASE_ADDRESS    WLANDXE_RIVA_BASE_ADDRESS + 0x202000
+#define WLANDXE_REGISTER_BASE_ADDRESS    WLANDXE_WCNSS_BASE_ADDRESS + 0x202000
 
 /* Common over the channels register addresses */
 #define WALNDEX_DMA_CSR_ADDRESS          WLANDXE_REGISTER_BASE_ADDRESS + 0x00
@@ -345,7 +354,7 @@
 #define WLANDXE_CH_STAT_INT_ED_MASK     0x00002000
 
 #define WLANDXE_CH_STAT_MASKED_MASK     0x00000008
-/* Till here RIVA DXE register information
+/* Till here WCNSS DXE register information
  * This is temporary definition location to make compile and unit test
  * If official msmreg.h integrated, this part will be eliminated */
 
@@ -605,6 +614,7 @@
    wpt_uint32                      dxeCookie;
    wpt_packet                     *freeRXPacket;
    wpt_boolean                     rxPalPacketUnavailable;
+   wpt_boolean                     driverReloadInProcessing;
 } WLANDXE_CtrlBlkType;
 
 /*==========================================================================
diff --git a/CORE/HDD/inc/qc_sap_ioctl.h b/CORE/HDD/inc/qc_sap_ioctl.h
index 1bb8b65..6efa7ad 100644
--- a/CORE/HDD/inc/qc_sap_ioctl.h
+++ b/CORE/HDD/inc/qc_sap_ioctl.h
@@ -231,6 +231,7 @@
 
 #define QCSAP_IOCTL_MODIFY_ACL          (SIOCIWFIRSTPRIV+18)
 #define QCSAP_IOCTL_GET_CHANNEL_LIST    (SIOCIWFIRSTPRIV+19)
+#define QCSAP_IOCTL_SET_TX_POWER        (SIOCIWFIRSTPRIV+20) 
 
 #define MAX_VAR_ARGS         7
 #define QCSAP_IOCTL_PRIV_GET_SOFTAP_LINK_SPEED (SIOCIWFIRSTPRIV + 31)
diff --git a/CORE/HDD/inc/wlan_hdd_assoc.h b/CORE/HDD/inc/wlan_hdd_assoc.h
index f3e73c4..d748cf3 100644
--- a/CORE/HDD/inc/wlan_hdd_assoc.h
+++ b/CORE/HDD/inc/wlan_hdd_assoc.h
@@ -39,8 +39,11 @@
    eConnectionState_IbssDisconnected,
 
    /** Participating in an IBSS network with partner stations also present*/
-   eConnectionState_IbssConnected
+   eConnectionState_IbssConnected,
 
+   /** Disconnecting in an Infrastructure network.*/
+   eConnectionState_Disconnecting
+	
 }eConnectionState;
 /**This structure stores the connection information */
 typedef struct connection_info_s
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 50a450e..554b857 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -260,12 +260,21 @@
     eHDD_DOT11_MODE_11g_ONLY,
     eHDD_DOT11_MODE_11n_ONLY,
     eHDD_DOT11_MODE_11b_ONLY,
+#ifdef WLAN_FEATURE_11AC
+    eHDD_DOT11_MODE_11ac_ONLY,
+    eHDD_DOT11_MODE_11ac,
+#endif
 }eHddDot11Mode;
 
 #define CFG_DOT11_MODE_NAME                    "gDot11Mode"
 #define CFG_DOT11_MODE_MIN                     eHDD_DOT11_MODE_AUTO
+#ifdef WLAN_FEATURE_11AC
+#define CFG_DOT11_MODE_MAX                     eHDD_DOT11_MODE_11ac
+#define CFG_DOT11_MODE_DEFAULT                 eHDD_DOT11_MODE_11ac
+#else
 #define CFG_DOT11_MODE_MAX                     eHDD_DOT11_MODE_11b_ONLY
 #define CFG_DOT11_MODE_DEFAULT                 eHDD_DOT11_MODE_11n
+#endif
 
 #define CFG_CHANNEL_BONDING_MODE_24GHZ_NAME    "gChannelBondingMode24GHz"
 #define CFG_CHANNEL_BONDING_MODE_MIN           WNI_CFG_CHANNEL_BONDING_MODE_STAMIN 
@@ -1050,6 +1059,23 @@
     eHDD_LINK_SPEED_REPORT_MAX = 1,
     eHDD_LINK_SPEED_REPORT_MAX_SCALED = 2,
 }eHddLinkSpeedReportType;
+#ifdef WLAN_FEATURE_11AC
+#define CFG_VHT_CHANNEL_WIDTH                "gVhtChannelWidth"
+#define CFG_VHT_CHANNEL_WIDTH_MIN            ( 0 )
+#define CFG_VHT_CHANNEL_WIDTH_MAX            ( 2 )
+#define CFG_VHT_CHANNEL_WIDTH_DEFAULT        ( 2 )
+
+#define CFG_VHT_ENABLE_RX_MCS_8_9               "gVhtRxMCS"
+#define CFG_VHT_ENABLE_RX_MCS_8_9_MIN           ( 0 )
+#define CFG_VHT_ENABLE_RX_MCS_8_9_MAX           ( 2 )
+#define CFG_VHT_ENABLE_RX_MCS_8_9_DEFAULT       ( 0 )
+
+#define CFG_VHT_ENABLE_TX_MCS_8_9               "gVhtTxMCS"
+#define CFG_VHT_ENABLE_TX_MCS_8_9_MIN           ( 0 )
+#define CFG_VHT_ENABLE_TX_MCS_8_9_MAX           ( 2 )
+#define CFG_VHT_ENABLE_TX_MCS_8_9_DEFAULT       ( 0 )
+
+#endif
 
 #define CFG_REPORT_MAX_LINK_SPEED                  "gReportMaxLinkSpeed"
 #define CFG_REPORT_MAX_LINK_SPEED_MIN              ( eHDD_LINK_SPEED_REPORT_ACTUAL )
@@ -1146,6 +1172,40 @@
 #define CFG_ENABLE_DYNAMIC_DTIM_MAX        ( 5 )
 #define CFG_ENABLE_DYNAMIC_DTIM_DEFAULT    ( 0 )
 
+/*
+ * Enable First Scan 2G Only
+ * Options
+ * 0 - Disable First Scan 2G Option
+ * 1 - Enable First Scan 2G Option
+ */
+#define CFG_ENABLE_FIRST_SCAN_2G_ONLY_NAME            "gEnableFirstScan2GOnly"
+#define CFG_ENABLE_FIRST_SCAN_2G_ONLY_MIN        ( 0 )
+#define CFG_ENABLE_FIRST_SCAN_2G_ONLY_MAX        ( 1 )
+#define CFG_ENABLE_FIRST_SCAN_2G_ONLY_DEFAULT    ( 0 )
+
+/*
+ * Skip DFS Channel in case of P2P Search
+ * Options
+ * 0 - Don't Skip DFS Channel in case of P2P Search
+ * 1 - Skip DFS Channel in case of P2P Search
+ */
+#define CFG_ENABLE_SKIP_DFS_IN_P2P_SEARCH_NAME       "gSkipDfsChannelInP2pSearch"
+#define CFG_ENABLE_SKIP_DFS_IN_P2P_SEARCH_MIN        ( 0 )
+#define CFG_ENABLE_SKIP_DFS_IN_P2P_SEARCH_MAX        ( 1 )
+#define CFG_ENABLE_SKIP_DFS_IN_P2P_SEARCH_DEFAULT    ( 0 )
+
+/*
+ * Ignore Dynamic Dtim in case of P2P
+ * Options
+ * 0 - Consider Dynamic Dtim incase of P2P
+ * 1 - Ignore Dynamic Dtim incase of P2P
+ */
+#define CFG_IGNORE_DYNAMIC_DTIM_IN_P2P_MODE_NAME       "gIgnoreDynamicDtimInP2pMode"
+#define CFG_IGNORE_DYNAMIC_DTIM_IN_P2P_MODE_MIN        ( 0 )
+#define CFG_IGNORE_DYNAMIC_DTIM_IN_P2P_MODE_MAX        ( 1 )
+#define CFG_IGNORE_DYNAMIC_DTIM_IN_P2P_MODE_DEFAULT    ( 0 )
+
+
 #define CFG_ENABLE_AUTOMATIC_TX_POWER_CONTROL_NAME  "gEnableAutomaticTxPowerControl"
 #define CFG_ENABLE_AUTOMATIC_TX_POWER_CONTROL_MIN        ( 0 )
 #define CFG_ENABLE_AUTOMATIC_TX_POWER_CONTROL_MAX        ( 1 )
@@ -1461,9 +1521,16 @@
 #ifdef WLAN_FEATURE_PACKET_FILTERING
    v_BOOL_t                    isMcAddrListFilter;
 #endif
+#ifdef WLAN_FEATURE_11AC
+   v_U8_t                      vhtChannelWidth;
+   v_U8_t                      vhtRxMCS;
+   v_U8_t                      vhtTxMCS;
+#endif
    v_U8_t                      enableModulatedDTIM;
    v_U32_t                     fEnableMCAddrList;
-   
+   v_BOOL_t                    enableFirstScan2GOnly;
+   v_BOOL_t                    skipDfsChnlInP2pSearch;
+   v_BOOL_t                    ignoreDynamicDtimInP2pMode;
 } hdd_config_t;
 /*--------------------------------------------------------------------------- 
   Function declarations and documenation
diff --git a/CORE/HDD/inc/wlan_hdd_includes.h b/CORE/HDD/inc/wlan_hdd_includes.h
index 522405d..07155e3 100644
--- a/CORE/HDD/inc/wlan_hdd_includes.h
+++ b/CORE/HDD/inc/wlan_hdd_includes.h
@@ -63,5 +63,10 @@
 #include "wlan_hdd_version.h"
 #include "wlan_hdd_tx_rx.h"
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/*include for oem data req specific structures*/
+/*and function declarations*/
+#include "wlan_hdd_oemdata.h" 
+#endif
 
 #endif    // end #if !defined( HDD_INCLUDES_H__ )
diff --git a/CORE/HDD/inc/wlan_hdd_innav.h b/CORE/HDD/inc/wlan_hdd_innav.h
deleted file mode 100644
index 1e9b029..0000000
--- a/CORE/HDD/inc/wlan_hdd_innav.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2012, Code Aurora Forum. 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.
- */
-
diff --git a/CORE/HDD/inc/wlan_hdd_keep_alive.h b/CORE/HDD/inc/wlan_hdd_keep_alive.h
index 910a46f..7e19833 100644
--- a/CORE/HDD/inc/wlan_hdd_keep_alive.h
+++ b/CORE/HDD/inc/wlan_hdd_keep_alive.h
@@ -49,6 +49,7 @@
     v_U8_t  hostIpv4Addr[4]; 
     v_U8_t  destIpv4Addr[4];
     v_U8_t  destMacAddr [6];
+    v_U8_t  bssIdx;
 } tKeepAliveRequest, *tpKeepAliveRequest;
 
 #endif // __WLAN_HDD_KEEP_ALIVE_H__
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index ff544e5..c333556 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -50,6 +50,9 @@
 #include <wlan_hdd_wmm.h>
 #include <wlan_hdd_cfg.h>
 #include <linux/spinlock.h>
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+#include <linux/wakelock.h>
+#endif
 #ifdef ANI_MANF_DIAG
 #include <wlan_hdd_ftm.h>
 #endif
@@ -129,6 +132,15 @@
 
 #define MAX_NO_OF_2_4_CHANNELS 14
 
+#define WLAN_HDD_PUBLIC_ACTION_FRAME 4
+#define WLAN_HDD_PUBLIC_ACTION_FRAME_OFFSET 24
+#define WLAN_HDD_PUBLIC_ACTION_FRAME_TYPE_OFFSET 30
+#define WLAN_HDD_P2P_SOCIAL_CHANNELS 3
+
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+#define HDD_WAKE_LOCK_DURATION 50
+#endif
+
 typedef struct hdd_tx_rx_stats_s
 {
    // start_xmit stats
@@ -350,6 +362,7 @@
 #ifdef ANI_MANF_DIAG
    ,WLAN_HDD_FTM,
 #endif
+   WLAN_HDD_P2P_DEVICE
 }device_mode_t;
 
 typedef enum rem_on_channel_request_type
@@ -404,6 +417,25 @@
   rem_on_channel_request_type_t rem_on_chan_request;
 }hdd_remain_on_chan_ctx_t;
 
+typedef enum{
+    HDD_IDLE,
+    HDD_PD_REQ_ACK_PENDING,
+    HDD_GO_NEG_REQ_ACK_PENDING,
+    HDD_INVALID_STATE,
+}eP2PActionFrameState;
+
+typedef enum {
+    WLAN_HDD_GO_NEG_REQ,
+    WLAN_HDD_GO_NEG_RESP,
+    WLAN_HDD_GO_NEG_CNF,
+    WLAN_HDD_INVITATION_REQ,
+    WLAN_HDD_INVITATION_RESP,
+    WLAN_HDD_DEV_DIS_REQ,
+    WLAN_HDD_DEV_DIS_RESP,
+    WLAN_HDD_PROV_DIS_REQ,
+    WLAN_HDD_PROV_DIS_RESP,
+}tActionFrmType;
+
 typedef struct hdd_cfg80211_state_s 
 {
   tANI_U16 current_freq;
@@ -412,6 +444,7 @@
   size_t len;
   struct sk_buff *skb;
   hdd_remain_on_chan_ctx_t* remain_on_chan_ctx;
+  eP2PActionFrameState actionFrmState;
 }hdd_cfg80211_state_t;
 
 #endif
@@ -541,7 +574,7 @@
    v_U32_t waitScanResult;
 
 #ifdef WLAN_FEATURE_P2P
-   v_BOOL_t p2pSearch;
+  v_BOOL_t flushP2pScanResults;
 #endif
 
    /* Additional IE for scan */
@@ -599,12 +632,6 @@
    sHddMib_t  hdd_mib;
            
    tANI_U8 sessionId;
-#ifdef WLAN_FEATURE_P2P   
-   /** p2pSessionId required to open new SME session for P2P 
-    *  Device address which is different from STA MAC Address
-    */ 
-   tANI_U8 p2pSessionId;
-#endif
 
    /* Completion variable for session close */
    struct completion session_close_comp_var;
@@ -858,6 +885,22 @@
 #ifdef WLAN_FEATURE_PACKET_FILTERING
    t_multicast_add_list mc_addr_list;
 #endif
+
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+   struct wake_lock rx_wake_lock;
+#endif
+
+   /* 
+    * Framework initiated driver restarting 
+    *    hdd_reload_timer   : Restart retry timer
+    *    isRestartInProgress: Restart in progress
+    *    hdd_restart_retries: Restart retries
+    *
+    */
+   vos_timer_t hdd_restart_timer;
+   atomic_t isRestartInProgress;
+   u_int8_t hdd_restart_retries;
+   
 };
 
 
@@ -929,4 +972,5 @@
 VOS_STATUS hdd_disable_bmps_imps(hdd_context_t *pHddCtx, tANI_U8 session_type);
 
 eHalStatus hdd_smeCloseSessionCallback(void *pContext);
+VOS_STATUS wlan_hdd_restart_driver(hdd_context_t *pHddCtx);
 #endif    // end #if !defined( WLAN_HDD_MAIN_H )
diff --git a/CORE/HDD/inc/wlan_hdd_oemdata.h b/CORE/HDD/inc/wlan_hdd_oemdata.h
new file mode 100644
index 0000000..e6815d6
--- /dev/null
+++ b/CORE/HDD/inc/wlan_hdd_oemdata.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2012, Code Aurora Forum. 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.
+ */
+
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+/**===========================================================================
+  
+  \file  wlan_hdd_oemdata.h
+  
+  \brief Internal includes for the oem data
+  
+               Copyright 2008 (c) Qualcomm, Incorporated.
+               All Rights Reserved.
+               Qualcomm Confidential and Proprietary.
+  
+  ==========================================================================*/
+
+
+#ifndef __WLAN_HDD_OEM_DATA_H__
+#define __WLAN_HDD_OEM_DATA_H__
+
+#ifndef OEM_DATA_REQ_SIZE
+#define OEM_DATA_REQ_SIZE 70
+#endif
+
+#ifndef OEM_DATA_RSP_SIZE
+#define OEM_DATA_RSP_SIZE 968
+#endif
+
+struct iw_oem_data_req
+{
+    v_U8_t                  oemDataReq[OEM_DATA_REQ_SIZE];
+};
+
+int iw_set_oem_data_req(
+        struct net_device *dev,
+        struct iw_request_info *info,
+        union iwreq_data *wrqu,
+        char *extra);
+
+int iw_get_oem_data_rsp(
+        struct net_device *dev,
+        struct iw_request_info *info,
+        union iwreq_data *wrqu,
+        char *extra);
+
+struct iw_oem_data_rsp
+{
+    tANI_U8           oemDataRsp[OEM_DATA_RSP_SIZE];
+};
+
+#endif //__WLAN_HDD_OEM_DATA_H__
+
+#endif //FEATURE_OEM_DATA_SUPPORT
diff --git a/CORE/HDD/inc/wlan_hdd_p2p.h b/CORE/HDD/inc/wlan_hdd_p2p.h
index 63d47b1..ec256ff 100644
--- a/CORE/HDD/inc/wlan_hdd_p2p.h
+++ b/CORE/HDD/inc/wlan_hdd_p2p.h
@@ -33,10 +33,12 @@
 ==========================================================================*/
 #ifdef CONFIG_CFG80211
 #define ACTION_FRAME_TX_TIMEOUT 1000
-#define WAIT_CANCEL_REM_CHAN    100
-#define WAIT_REM_CHAN_READY     100
+#define WAIT_CANCEL_REM_CHAN    1000
+#define WAIT_REM_CHAN_READY     1000
 #define WAIT_CHANGE_CHANNEL_FOR_OFFCHANNEL_TX 3000
 
+#define ACTION_FRAME_DEFAULT_WAIT 200
+
 #define WLAN_HDD_GET_TYPE_FRM_FC(__fc__)         (((__fc__) & 0x0F) >> 2)
 #define WLAN_HDD_GET_SUBTYPE_FRM_FC(__fc__)      (((__fc__) & 0xF0) >> 4)
 #define WLAN_HDD_80211_FRM_DA_OFFSET             4
diff --git a/CORE/HDD/inc/wlan_hdd_packet_filtering.h b/CORE/HDD/inc/wlan_hdd_packet_filtering.h
index d42c091..f4c2109 100644
--- a/CORE/HDD/inc/wlan_hdd_packet_filtering.h
+++ b/CORE/HDD/inc/wlan_hdd_packet_filtering.h
@@ -87,6 +87,7 @@
     v_U8_t            filterId;
     v_U8_t            numParams;
     struct PacketFilterParamsCfg paramsData [HDD_MAX_CMP_PER_PACKET_FILTER];
+    v_U8_t            bssIdx;
 }tPacketFilterCfg, *tpPacketFilterCfg;
 
 #endif
diff --git a/CORE/HDD/inc/wlan_hdd_wext.h b/CORE/HDD/inc/wlan_hdd_wext.h
index 1c1399a..2e0a7ac 100644
--- a/CORE/HDD/inc/wlan_hdd_wext.h
+++ b/CORE/HDD/inc/wlan_hdd_wext.h
@@ -53,6 +53,8 @@
 #define HDD_WLAN_WMM_PARAM_MAX_SERVICE_INTERVAL        17
 #define HDD_WLAN_WMM_PARAM_COUNT                       18
 
+#define MHZ 6
+
 typedef enum
 {
    HDD_WLAN_WMM_DIRECTION_UPSTREAM      = 0,
@@ -270,6 +272,14 @@
    /**Completion Variable*/
    struct completion completion_var;
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+   /* oem data req in Progress */
+   v_BOOL_t oemDataReqInProgress;
+
+   /* oem data req ID */
+   v_U32_t oemDataReqID;
+#endif
+
 #ifdef FEATURE_WLAN_CCX
    /* CCX state variables */
    v_BOOL_t isCCXConnection;
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 526218c..01e53cc 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -99,7 +99,7 @@
 #define BEACON_FRAME_IES_OFFSET 12
 
 #ifdef WLAN_FEATURE_PACKET_FILTERING
-extern void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set);
+extern void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set, v_U8_t sessionId);
 #endif
 
 void hdd_ResetCountryCodeAfterDisAssoc(hdd_adapter_t *pAdapter);
@@ -655,7 +655,8 @@
     netif_tx_disable(dev);
     netif_carrier_off(dev);
     
-    hdd_connSetConnectionState( pHddStaCtx, eConnectionState_NotConnected );
+    INIT_COMPLETION(pAdapter->disconnect_comp_var);
+    hdd_connSetConnectionState( pHddStaCtx, eConnectionState_Disconnecting );
     /* If only STA mode is on */
     if((pHddCtx->concurrency_mode <= 1) && (pHddCtx->no_of_sessions[WLAN_HDD_INFRA_STATION] <=1))
     {
@@ -679,7 +680,13 @@
             /* To avoid wpa_supplicant sending "HANGED" CMD to ICS UI */
             if( eCSR_ROAM_LOSTLINK == roamStatus )
             {
-                cfg80211_disconnected(dev, WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY, NULL, 0, GFP_KERNEL);
+                /* TODO: Need to pass proper reason code
+                   currently we are passing only one reason code.
+                   Currently we are passing WLAN_REASON_DISASSOC_STA_HAS_LEFT
+                   rather than WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY
+                   to avoid the supplicant fast reconnect */
+
+                cfg80211_disconnected(dev, WLAN_REASON_DISASSOC_STA_HAS_LEFT, NULL, 0, GFP_KERNEL);
             }
             else
             {
@@ -689,7 +696,11 @@
             //If the Device Mode is Station
             // and the P2P Client is Connected
             //Enable BMPS
-            if((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) &&
+
+            // In case of JB, as Change-Iface may or maynot be called for p2p0
+            // Enable BMPS/IMPS in case P2P_CLIENT disconnected   
+            if(((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
+                (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode)) &&
                 (vos_concurrent_sessions_running()))
             {
                //Enable BMPS only of other Session is P2P Client
@@ -704,8 +715,7 @@
                    {
                        //Only P2P Client is there Enable Bmps back
                        if((0 == pHddCtx->no_of_sessions[VOS_STA_SAP_MODE]) &&
-                          (0 == pHddCtx->no_of_sessions[VOS_P2P_GO_MODE]) &&
-                          (1 == pHddCtx->no_of_sessions[VOS_P2P_CLIENT_MODE]))
+                          (0 == pHddCtx->no_of_sessions[VOS_P2P_GO_MODE]))
                        {
                            hdd_enable_bmps_imps(pHddCtx);
                        }
@@ -1130,7 +1140,11 @@
         //If the Device Mode is Station
         // and the P2P Client is Connected
         //Enable BMPS
-        if((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) &&
+
+        // In case of JB, as Change-Iface may or maynot be called for p2p0
+        // Enable BMPS/IMPS in case P2P_CLIENT disconnected   
+        if(((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
+            (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode)) &&
             (vos_concurrent_sessions_running()))
         {
            //Enable BMPS only of other Session is P2P Client
@@ -1145,8 +1159,7 @@
                {
                    //Only P2P Client is there Enable Bmps back
                    if((0 == pHddCtx->no_of_sessions[VOS_STA_SAP_MODE]) &&
-                      (0 == pHddCtx->no_of_sessions[VOS_P2P_GO_MODE]) &&
-                      (1 == pHddCtx->no_of_sessions[VOS_P2P_CLIENT_MODE]))
+                      (0 == pHddCtx->no_of_sessions[VOS_P2P_GO_MODE]))
                    {
                        hdd_enable_bmps_imps(pHddCtx);
                    }
@@ -1156,18 +1169,31 @@
 
 #ifdef CONFIG_CFG80211
         /* inform association failure event to nl80211 */
-        cfg80211_connect_result(dev, pWextState->req_bssId,
+        if(eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL == roamResult)
+        {
+           cfg80211_connect_result(dev, pWextState->req_bssId,
+                NULL, 0, NULL, 0,
+                WLAN_STATUS_ASSOC_DENIED_UNSPEC, 
+                GFP_KERNEL);
+        }
+        else
+        {
+           cfg80211_connect_result(dev, pWextState->req_bssId,
                 NULL, 0, NULL, 0,
                 WLAN_STATUS_UNSPECIFIED_FAILURE, 
                 GFP_KERNEL);
+        }
 #endif 
 
         netif_tx_disable(dev);
         netif_carrier_off(dev);
-
-        /* Association failed; Reset the country code information
-         * so that it re-initialize the valid channel list*/
-        hdd_ResetCountryCodeAfterDisAssoc(pAdapter);
+        
+        if (WLAN_HDD_P2P_CLIENT != pAdapter->device_mode)
+        {
+            /* Association failed; Reset the country code information
+             * so that it re-initialize the valid channel list*/
+            hdd_ResetCountryCodeAfterDisAssoc(pAdapter);
+        }
     }
 
     return eHAL_STATUS_SUCCESS;
@@ -1634,14 +1660,17 @@
                     {
                         /*Filter applied during suspend mode*/
                         /*Clear it here*/
-                        wlan_hdd_set_mc_addr_list(pHddCtx, FALSE);
+                        wlan_hdd_set_mc_addr_list(pHddCtx, FALSE, pAdapter->sessionId);
                     }
                 }
 #endif
-                /* Disconnected from current AP. Reset the country code information
-                 * so that it re-initialize the valid channel list*/
-                hdd_ResetCountryCodeAfterDisAssoc(pAdapter);
 
+                if (WLAN_HDD_P2P_CLIENT != pAdapter->device_mode)
+                {
+                    /* Disconnected from current AP. Reset the country code information
+                     * so that it re-initialize the valid channel list*/
+                    hdd_ResetCountryCodeAfterDisAssoc(pAdapter);
+                }
             }
             break;
         case eCSR_ROAM_IBSS_LEAVE:
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 83e3788..9eea30f 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -1472,6 +1472,50 @@
               CFG_MC_ADDR_LIST_ENABLE_MIN,
               CFG_MC_ADDR_LIST_ENABLE_MAX ),
 
+#ifdef WLAN_FEATURE_11AC              
+REG_VARIABLE( CFG_VHT_CHANNEL_WIDTH, WLAN_PARAM_Integer,
+              hdd_config_t, vhtChannelWidth, 
+              VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK, 
+              CFG_VHT_CHANNEL_WIDTH_DEFAULT, 
+              CFG_VHT_CHANNEL_WIDTH_MIN, 
+              CFG_VHT_CHANNEL_WIDTH_MAX),
+
+REG_VARIABLE( CFG_VHT_ENABLE_RX_MCS_8_9, WLAN_PARAM_Integer,
+              hdd_config_t, vhtRxMCS, 
+              VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK, 
+              CFG_VHT_ENABLE_RX_MCS_8_9_DEFAULT, 
+              CFG_VHT_ENABLE_RX_MCS_8_9_MIN, 
+              CFG_VHT_ENABLE_RX_MCS_8_9_MAX),
+
+REG_VARIABLE( CFG_VHT_ENABLE_TX_MCS_8_9, WLAN_PARAM_Integer,
+              hdd_config_t, vhtTxMCS, 
+              VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK, 
+              CFG_VHT_ENABLE_TX_MCS_8_9_DEFAULT, 
+              CFG_VHT_ENABLE_TX_MCS_8_9_MIN, 
+              CFG_VHT_ENABLE_TX_MCS_8_9_MAX),
+#endif
+
+REG_VARIABLE( CFG_ENABLE_FIRST_SCAN_2G_ONLY_NAME, WLAN_PARAM_Integer,
+              hdd_config_t, enableFirstScan2GOnly, 
+              VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, 
+              CFG_ENABLE_FIRST_SCAN_2G_ONLY_DEFAULT, 
+              CFG_ENABLE_FIRST_SCAN_2G_ONLY_MIN, 
+              CFG_ENABLE_FIRST_SCAN_2G_ONLY_MAX ),
+
+REG_VARIABLE( CFG_ENABLE_SKIP_DFS_IN_P2P_SEARCH_NAME, WLAN_PARAM_Integer,
+              hdd_config_t, skipDfsChnlInP2pSearch, 
+              VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, 
+              CFG_ENABLE_SKIP_DFS_IN_P2P_SEARCH_DEFAULT, 
+              CFG_ENABLE_SKIP_DFS_IN_P2P_SEARCH_MIN, 
+              CFG_ENABLE_SKIP_DFS_IN_P2P_SEARCH_MAX ),
+
+REG_VARIABLE( CFG_IGNORE_DYNAMIC_DTIM_IN_P2P_MODE_NAME, WLAN_PARAM_Integer,
+              hdd_config_t, ignoreDynamicDtimInP2pMode, 
+              VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, 
+              CFG_IGNORE_DYNAMIC_DTIM_IN_P2P_MODE_DEFAULT, 
+              CFG_IGNORE_DYNAMIC_DTIM_IN_P2P_MODE_MIN, 
+              CFG_IGNORE_DYNAMIC_DTIM_IN_P2P_MODE_MAX ),
+
 };
 
 /*
@@ -1834,6 +1878,12 @@
   VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableDFSChnlScan] Value = [%u] ",pHddCtx->cfg_ini->enableDFSChnlScan);
   VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gReportMaxLinkSpeed] Value = [%u] ",pHddCtx->cfg_ini->reportMaxLinkSpeed);
   VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [thermalMitigationEnable] Value = [%u] ",pHddCtx->cfg_ini->thermalMitigationEnable);
+#ifdef WLAN_FEATURE_11AC
+  VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gVhtChannelWidth] value = [%u]\n",pHddCtx->cfg_ini->vhtChannelWidth);
+#endif
+  VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [enableFirstScan2GOnly] Value = [%u] ",pHddCtx->cfg_ini->enableFirstScan2GOnly);
+  VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [skipDfsChnlInP2pSearch] Value = [%u] ",pHddCtx->cfg_ini->skipDfsChnlInP2pSearch);
+  VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [ignoreDynamicDtimInP2pMode] Value = [%u] ",pHddCtx->cfg_ini->ignoreDynamicDtimInP2pMode);
 }
 
 
@@ -2216,6 +2266,12 @@
          return eCSR_DOT11_MODE_11n_ONLY;
       case (eHDD_DOT11_MODE_11b_ONLY):
          return eCSR_DOT11_MODE_11b_ONLY;
+#ifdef WLAN_FEATURE_11AC
+      case (eHDD_DOT11_MODE_11ac_ONLY):
+         return eCSR_DOT11_MODE_11ac_ONLY;
+      case (eHDD_DOT11_MODE_11ac):
+         return eCSR_DOT11_MODE_11ac;
+#endif
       case (eHDD_DOT11_MODE_AUTO):
          return eCSR_DOT11_MODE_AUTO;
    }
@@ -2769,6 +2825,53 @@
         hddLog(LOGE, "Could not pass on WNI_CFG_ENABLE_MC_ADDR_LIST to CCM\n");
      }
 
+#ifdef WLAN_FEATURE_11AC
+   /* Based on cfg.ini, update the Basic MCS set, RX/TX MCS map in the cfg.dat */
+   /* valid values are 0(MCS0-7), 1(MCS0-8), 2(MCS0-9) */
+   /* we update only the least significant 2 bits in the corresponding fields */
+   if( (pConfig->dot11Mode == eHDD_DOT11_MODE_AUTO) ||
+       (pConfig->dot11Mode == eHDD_DOT11_MODE_11ac_ONLY) ||
+       (pConfig->dot11Mode == eHDD_DOT11_MODE_11ac) )
+   {
+       {
+           tANI_U32 temp = 0;
+
+           ccmCfgGetInt(pHddCtx->hHal, WNI_CFG_VHT_BASIC_MCS_SET, &temp);
+           temp = (temp & 0xFFFC) | pConfig->vhtRxMCS; 
+
+           if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_VHT_BASIC_MCS_SET, 
+                           temp, NULL, eANI_BOOLEAN_FALSE)
+               ==eHAL_STATUS_FAILURE)
+           {
+               fStatus = FALSE;
+               hddLog(LOGE, "Could not pass on WNI_CFG_VHT_BASIC_MCS_SET to CCM\n");
+           }
+
+           ccmCfgGetInt(pHddCtx->hHal, WNI_CFG_VHT_RX_MCS_MAP, &temp);
+           temp = (temp & 0xFFFC) | pConfig->vhtRxMCS; 
+
+           if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_VHT_RX_MCS_MAP, 
+                           temp, NULL, eANI_BOOLEAN_FALSE)
+               ==eHAL_STATUS_FAILURE)
+           {
+              fStatus = FALSE;
+              hddLog(LOGE, "Could not pass on WNI_CFG_VHT_RX_MCS_MAP to CCM\n");
+           }
+
+           ccmCfgGetInt(pHddCtx->hHal, WNI_CFG_VHT_TX_MCS_MAP, &temp);
+           temp = (temp & 0xFFFC) | pConfig->vhtTxMCS; 
+
+           if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_VHT_TX_MCS_MAP, 
+                           temp, NULL, eANI_BOOLEAN_FALSE)
+               ==eHAL_STATUS_FAILURE)
+           {
+               fStatus = FALSE;
+               hddLog(LOGE, "Could not pass on WNI_CFG_VHT_TX_MCS_MAP to CCM\n");
+           }
+       }
+   }
+#endif
+
    return fStatus;
 }
 
@@ -2839,18 +2942,13 @@
 #endif
    //Remaining config params not obtained from registry
    // On RF EVB beacon using channel 1.
-   
+#ifdef WLAN_FEATURE_11AC
+    smeConfig.csrConfig.nVhtChannelWidth = pConfig->vhtChannelWidth;
+#endif
    smeConfig.csrConfig.AdHocChannel5G            = 44; 
    smeConfig.csrConfig.ProprietaryRatesEnabled   = 0;  
    smeConfig.csrConfig.HeartbeatThresh50         = 40; 
-   if( smeConfig.csrConfig.Is11dSupportEnabled )
-   {
-      smeConfig.csrConfig.Is11hSupportEnabled    = 1;
-   }
-   else
-   {
-      smeConfig.csrConfig.Is11hSupportEnabled    = 0;
-   }
+   smeConfig.csrConfig.Is11hSupportEnabled       = 1;
    smeConfig.csrConfig.bandCapability            = pConfig->nBandCapability; 
    smeConfig.csrConfig.cbChoice                  = 0;   
    smeConfig.csrConfig.bgScanInterval            = 0; 
@@ -2858,7 +2956,8 @@
    smeConfig.csrConfig.nTxPowerCap = pConfig->nTxPowerCap;
    smeConfig.csrConfig.fEnableBypass11d          = pConfig->enableBypass11d;
    smeConfig.csrConfig.fEnableDFSChnlScan        = pConfig->enableDFSChnlScan;
-   
+   smeConfig.csrConfig.fFirstScanOnly2GChnl      = pConfig->enableFirstScan2GOnly;
+
    //FIXME 11d config is hardcoded
 #ifdef WLAN_SOFTAP_FEATURE
    if ( VOS_STA_SAP_MODE != hdd_get_conparam()){
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 6088825..ef35511 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -410,6 +410,7 @@
  */
 int wlan_hdd_cfg80211_update_band(struct wiphy *wiphy, eCsrBand eBand)
 {
+    ENTER();
     switch(eBand)
     {
         case eCSR_BAND_24:
@@ -438,6 +439,8 @@
                                hdd_config_t *pCfg
                                )
 {
+    ENTER();
+
     /* Now bind the underlying wlan device with wiphy */
     set_wiphy_dev(wiphy, dev);
 
@@ -448,7 +451,8 @@
                     | WIPHY_FLAG_CUSTOM_REGULATORY;
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0))
-    wiphy->flags |=   WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
+    wiphy->flags |=   WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL 
+                    | WIPHY_FLAG_OFFCHAN_TX;
 #endif
 
     wiphy->max_scan_ssids = MAX_SCAN_SSID; 
@@ -536,6 +540,8 @@
     /* Register for all P2P action, public action etc frames */
     v_U16_t type = (SIR_MAC_MGMT_FRAME << 2) | ( SIR_MAC_MGMT_ACTION << 4);
 
+    ENTER();
+
    /* Right now we are registering these frame when driver is getting
       initialized. Once we will move to 2.6.37 kernel, in which we have
       frame register ops, we will move this code as a part of that */
@@ -574,6 +580,8 @@
     /* Register for all P2P action, public action etc frames */
     v_U16_t type = (SIR_MAC_MGMT_FRAME << 2) | ( SIR_MAC_MGMT_ACTION << 4);
 
+    ENTER();
+
    /* Right now we are registering these frame when driver is getting
       initialized. Once we will move to 2.6.37 kernel, in which we have
       frame register ops, we will move this code as a part of that */
@@ -676,6 +684,7 @@
     beacon_data_t *old = NULL;
     int head_len,tail_len;
 
+    ENTER();
     if (params->head && !params->head_len)
         return -EINVAL;
 
@@ -882,6 +891,7 @@
     v_U8_t *pIe = NULL;
     v_U8_t addIE[1] = {0};
     beacon_data_t *pBeacon = pHostapdAdapter->sessionCtx.ap.beacon;
+    int ret = 0;
 
     genie = vos_mem_malloc(MAX_GENIE_LEN);
 
@@ -903,7 +913,8 @@
         else 
         {
             hddLog( VOS_TRACE_LEVEL_ERROR, "**Wps Ie Length is too big***\n");
-            return -EINVAL;
+            ret = -EINVAL;
+            goto done;
         }
         total_ielen = ielen;
     }
@@ -919,7 +930,8 @@
         }
         else {
            hddLog( VOS_TRACE_LEVEL_ERROR, "**Wps Ie + P2p Ie + Wfd Ie Length is too big***\n");
-           return -EINVAL;
+           ret = -EINVAL;
+           goto done;
         }
         total_ielen += ielen; 
     }
@@ -939,7 +951,8 @@
         {
             hddLog( VOS_TRACE_LEVEL_ERROR, 
                     "**Wps Ie+ P2pIE Length is too big***\n");
-            return -EINVAL;
+            ret = -EINVAL;
+            goto done;
         }
         total_ielen += ielen;
     }
@@ -951,7 +964,8 @@
     {
         hddLog(LOGE,
                "Could not pass on WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA to CCM");
-        return -EINVAL;
+        ret = -EINVAL;
+        goto done;
     }
 
     if (ccmCfgSetInt((WLAN_HDD_GET_CTX(pHostapdAdapter))->hHal,
@@ -962,7 +976,8 @@
     {
         hddLog(LOGE,
             "Could not pass on WNI_CFG_PROBE_RSP_BCN_ADDNIE_FLAG to CCM");
-        return -EINVAL;
+        ret = -EINVAL;
+        goto done;
     }
 
     // Added for ProResp IE
@@ -1002,7 +1017,8 @@
             {
                  hddLog(LOGE,
                        "Could not pass on WNI_CFG_PROBE_RSP_ADDNIE_DATA1 to CCM");
-                 return -EINVAL;
+                 ret = -EINVAL;
+                 goto done;
             }
             rem_probe_resp_ie_len += probe_rsp_ie_len[0];
         }
@@ -1017,7 +1033,8 @@
             {
                  hddLog(LOGE,
                        "Could not pass on WNI_CFG_PROBE_RSP_ADDNIE_DATA2 to CCM");
-                 return -EINVAL;
+                 ret = -EINVAL;
+                 goto done;
             }
             rem_probe_resp_ie_len += probe_rsp_ie_len[1];
         }
@@ -1032,7 +1049,8 @@
             {
                  hddLog(LOGE,
                        "Could not pass on WNI_CFG_PROBE_RSP_ADDNIE_DATA3 to CCM");
-                 return -EINVAL;
+                 ret = -EINVAL;
+                 goto done;
             }
             rem_probe_resp_ie_len += probe_rsp_ie_len[2];
         }
@@ -1067,7 +1085,8 @@
         {
            hddLog(LOGE,
              "Could not pass on WNI_CFG_PROBE_RSP_ADDNIE_FLAG to CCM");
-           return -EINVAL;
+           ret = -EINVAL;
+           goto done;
         }
     }
     else
@@ -1090,7 +1109,8 @@
        {
             hddLog(LOGE,
                   "Could not pass on WNI_CFG_ASSOC_RSP_ADDNIE_DATA to CCM");
-            return -EINVAL;
+            ret = -EINVAL;
+            goto done;
        }
 
        if (ccmCfgSetInt((WLAN_HDD_GET_CTX(pHostapdAdapter))->hHal,
@@ -1101,7 +1121,8 @@
        {
           hddLog(LOGE,
             "Could not pass on WNI_CFG_ASSOC_RSP_ADDNIE_FLAG to CCM");
-          return -EINVAL;
+          ret = -EINVAL;
+          goto done;
        }
     }
     else
@@ -1119,6 +1140,7 @@
         }
     }
 
+done:
     vos_mem_free(genie);
     return 0;
 }
@@ -1445,6 +1467,15 @@
     }
     wlan_hdd_set_sapHwmode(pHostapdAdapter);
 
+#ifdef WLAN_FEATURE_11AC
+    if(((WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->dot11Mode == eHDD_DOT11_MODE_AUTO) || 
+       ((WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->dot11Mode == eHDD_DOT11_MODE_11ac) ||
+       ((WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->dot11Mode == eHDD_DOT11_MODE_11ac_ONLY) )
+    {
+        pConfig->SapHw_mode = eSAP_DOT11_MODE_11ac;
+    }
+#endif
+
     // ht_capab is not what the name conveys,this is used for protection bitmap
     pConfig->ht_capab =
                  (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apProtection;
@@ -1625,9 +1656,23 @@
 #endif
 {
     hdd_adapter_t *pAdapter =  WLAN_HDD_GET_PRIV_PTR(dev);
-    hdd_context_t *pHddCtx;
+    hdd_context_t  *pHddCtx    = NULL;
+    hdd_scaninfo_t *pScanInfo  = NULL;
+    hdd_adapter_t  *staAdapter = NULL;
     VOS_STATUS status = 0;
 
+    staAdapter = hdd_get_adapter(pAdapter->pHddCtx, WLAN_HDD_INFRA_STATION);
+
+    if (!staAdapter)
+    {
+        staAdapter = hdd_get_adapter(pAdapter->pHddCtx, WLAN_HDD_P2P_CLIENT);
+    }
+
+    if (staAdapter != NULL)
+    {
+        pScanInfo =  &staAdapter->scan_info;
+    }
+
     ENTER();
 
     if (NULL == pAdapter)
@@ -1647,6 +1692,23 @@
     hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d\n",
                               __func__,pAdapter->device_mode);
 
+    if ((pScanInfo != NULL) && pScanInfo->mScanPending)
+    {
+        INIT_COMPLETION(staAdapter->abortscan_event_var);
+        hdd_abort_mac_scan(staAdapter->pHddCtx);
+        status = wait_for_completion_interruptible_timeout(
+                           &staAdapter->abortscan_event_var,
+                           msecs_to_jiffies(WLAN_WAIT_TIME_ABORTSCAN));
+        if (!status)
+        {
+            VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
+                         "%s: Timeout occured while waiting for abortscan" ,
+                         __FUNCTION__);
+            VOS_ASSERT(pScanInfo->mScanPending);
+            return 0;
+        }
+    }
+
     if ((pAdapter->device_mode == WLAN_HDD_SOFTAP)
 #ifdef WLAN_FEATURE_P2P
      || (pAdapter->device_mode == WLAN_HDD_P2P_GO)
@@ -1892,6 +1954,7 @@
     if( (pAdapter->device_mode == WLAN_HDD_INFRA_STATION)
 #ifdef WLAN_FEATURE_P2P
       || (pAdapter->device_mode == WLAN_HDD_P2P_CLIENT)
+      || (pAdapter->device_mode == WLAN_HDD_P2P_DEVICE)
 #endif
       )
     {
@@ -1908,8 +1971,14 @@
                 hddLog(VOS_TRACE_LEVEL_INFO,
                    "%s: setting interface Type to INFRASTRUCTURE", __func__);
                 pRoamProfile->BSSType = eCSR_BSS_TYPE_INFRASTRUCTURE;
-                pRoamProfile->phyMode =
-                   hdd_cfg_xlate_to_csr_phy_mode(pConfig->dot11Mode);
+#ifdef WLAN_FEATURE_11AC
+                if(pConfig->dot11Mode == eHDD_DOT11_MODE_AUTO)
+                {
+                    pConfig->dot11Mode = eHDD_DOT11_MODE_11ac;
+                }
+#endif
+                pRoamProfile->phyMode = 
+                hdd_cfg_xlate_to_csr_phy_mode(pConfig->dot11Mode);
                 wdev->iftype = type;
 #ifdef WLAN_FEATURE_P2P
                 pAdapter->device_mode = (type == NL80211_IFTYPE_STATION) ?
@@ -2005,6 +2074,10 @@
                 status = hdd_init_station_mode( pAdapter );
                 if( VOS_STATUS_SUCCESS != status )
                     return -EOPNOTSUPP;
+                /* In case of JB, for P2P-GO, only change interface will be called,
+                 * This is the right place to enable back bmps_imps()
+                 */
+                hdd_enable_bmps_imps(pHddCtx);
                 goto done;
             case NL80211_IFTYPE_AP:
 #ifdef WLAN_FEATURE_P2P
@@ -2082,6 +2155,8 @@
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev );
     v_MACADDR_t STAMacAddress;
 
+    ENTER();
+
     if ( (WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress )
     {
         VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
@@ -2108,6 +2183,7 @@
         }
     }
     
+    EXIT();
     return status;
 }
 
@@ -2711,6 +2787,7 @@
         }
     }
 #endif
+    EXIT();
     return status;
 }
 
@@ -3048,12 +3125,27 @@
     struct cfg80211_bss *bss_status = NULL;
     size_t frame_len = sizeof (struct ieee80211_mgmt) + ie_length;
     int rssi = 0;
+#ifdef WLAN_OPEN_SOURCE
+    struct timespec ts;
+#endif
 
     ENTER();
 
     memcpy(mgmt->bssid, bss_desc->bssId, ETH_ALEN);
+
+#ifdef WLAN_OPEN_SOURCE
+    /* Android does not want the timestamp from the frame.
+       Instead it wants a monotonic increasing value */
+    get_monotonic_boottime(&ts);
+    mgmt->u.probe_resp.timestamp =
+         ((u64)ts.tv_sec * 1000000) + (ts.tv_nsec / 1000);
+#else
+    /* keep old behavior for non-open source (for now) */
     memcpy(&mgmt->u.probe_resp.timestamp, bss_desc->timeStamp,
             sizeof (bss_desc->timeStamp));
+
+#endif
+
     mgmt->u.probe_resp.beacon_int = bss_desc->beaconInterval;
     mgmt->u.probe_resp.capab_info = bss_desc->capabilityInfo;
     memcpy(mgmt->u.probe_resp.variable, ie, ie_length);
@@ -3242,16 +3334,16 @@
 
 #define dump_bssid(bssid) \
     { \
-        hddLog(VOS_TRACE_LEVEL_FATAL, "BSSID (MAC) address:\t"); \
-        hddPrintMacAddr(bssid, VOS_TRACE_LEVEL_FATAL);\
-        hddLog(VOS_TRACE_LEVEL_FATAL, "\n"); \
+        hddLog(VOS_TRACE_LEVEL_INFO, "BSSID (MAC) address:\t"); \
+        hddPrintMacAddr(bssid, VOS_TRACE_LEVEL_INFO);\
+        hddLog(VOS_TRACE_LEVEL_INFO, "\n"); \
     }
 
 #define dump_pmkid(pMac, pmkid) \
     { \
-        hddLog(VOS_TRACE_LEVEL_FATAL, "PMKSA-ID:\t"); \
-        hddPrintPmkId(pmkid, VOS_TRACE_LEVEL_FATAL);\
-        hddLog(VOS_TRACE_LEVEL_FATAL, "\n"); \
+        hddLog(VOS_TRACE_LEVEL_INFO, "PMKSA-ID:\t"); \
+        hddPrintPmkId(pmkid, VOS_TRACE_LEVEL_INFO);\
+        hddLog(VOS_TRACE_LEVEL_INFO, "\n"); \
     }
 
 #ifdef FEATURE_WLAN_LFR
@@ -3263,10 +3355,11 @@
                     hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo, 
                     int index, bool preauth )
 {
+#ifdef FEATURE_WLAN_OKC
     struct net_device *dev = pAdapter->dev;
 
     ENTER();
-    printk("%s is going to notify supplicant of:", __func__);
+    hddLog(VOS_TRACE_LEVEL_INFO, "%s is going to notify supplicant of:", __func__);
 
     if( NULL == pRoamInfo )
     {
@@ -3277,7 +3370,7 @@
     dump_bssid(pRoamInfo->bssid);
     cfg80211_pmksa_candidate_notify(dev, index,
                                     pRoamInfo->bssid, preauth, GFP_KERNEL);
-
+#endif  /* FEATURE_WLAN_OKC */
     return 0; 
 }
 #endif //FEATURE_WLAN_LFR
@@ -3294,7 +3387,6 @@
     //struct wireless_dev *wdev = dev->ieee80211_ptr;    
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev );
     hdd_scaninfo_t *pScanInfo = &pAdapter->scan_info;
-    hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
     struct cfg80211_scan_request *req = NULL;
     int ret = 0;
 
@@ -3312,13 +3404,13 @@
     if (!ret)
     {
        VOS_ASSERT(pScanInfo->mScanPending);
-       return 0;
+       goto allow_suspend;
     }
 
     if(pScanInfo->mScanPending != VOS_TRUE)
     {
         VOS_ASSERT(pScanInfo->mScanPending);
-        return 0;
+        goto allow_suspend;
     }
 
     /* Check the scanId */
@@ -3330,9 +3422,6 @@
                 (int) scanId);
     }
 
-    /* Scan is no longer pending */
-    pScanInfo->mScanPending = VOS_FALSE;
-
     ret = wlan_hdd_cfg80211_update_bss((WLAN_HDD_GET_CTX(pAdapter))->wiphy, 
                                         pAdapter);
 
@@ -3372,7 +3461,7 @@
     if (!req)
     {
         hddLog(VOS_TRACE_LEVEL_ERROR, "request is became NULL\n");
-        return 0;
+        goto allow_suspend;
     }
 
     /*
@@ -3389,21 +3478,27 @@
     cfg80211_scan_done(req, false);
     complete(&pAdapter->abortscan_event_var);
     pAdapter->request = NULL;
+    /* Scan is no longer pending */
+    pScanInfo->mScanPending = VOS_FALSE;
 
 #ifdef WLAN_FEATURE_P2P
     /* Flush out scan result after p2p_serach is done */
-    if(pScanInfo->p2pSearch )
+    if(pScanInfo->flushP2pScanResults)
     {
         tANI_U8 sessionId = pAdapter->sessionId;
-        if (pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated)
-        { 
-            sessionId = pAdapter->p2pSessionId;
-        } 
         sme_ScanFlushResult(WLAN_HDD_GET_HAL_CTX(pAdapter), sessionId);
-        pScanInfo->p2pSearch = 0;
+        pScanInfo->flushP2pScanResults = 0;
     }
 #endif
 
+allow_suspend:
+    /* release the wake lock */
+    if((eConnectionState_NotConnected == 
+         (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState))
+    {
+        hdd_allow_suspend();
+    }
+
     EXIT();
     return 0;
 }
@@ -3425,6 +3520,7 @@
     v_U32_t scanId = 0;
     int status = 0;
     hdd_scaninfo_t *pScanInfo = &pAdapter->scan_info;
+    v_U8_t preventSuspend = 0;
 #ifdef WLAN_FEATURE_P2P
     v_U8_t* pP2pIe = NULL;
 #endif
@@ -3585,7 +3681,8 @@
             pScanInfo->scanAddIE.length = request->ie_len;
 
             if((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
-                (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode)
+                (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode) ||
+                (WLAN_HDD_P2P_DEVICE == pAdapter->device_mode)
               )
             {
                pwextBuf->roamProfile.pAddIEScan = pScanInfo->scanAddIE.addIEdata;
@@ -3600,25 +3697,38 @@
                                                        request->ie_len);
             if (pP2pIe != NULL)
             {
-                if ( (request->n_ssids == 1) && 
-                     (request->ssids[0].ssid_len == P2P_WILDCARD_SSID_LEN) &&
-                     !memcmp(request->ssids[0].ssid, P2P_WILDCARD_SSID,
-                             P2P_WILDCARD_SSID_LEN ))
+                /* no_cck will be set during p2p find to disable 11b rates */
+                if(TRUE == request->no_cck)
                 {
                     tANI_U8 sessionId = pAdapter->sessionId;
                     hddLog(VOS_TRACE_LEVEL_INFO,
                            "%s: This is a P2P Search", __func__);
                     scanRequest.p2pSearch = 1;
-                    pScanInfo->p2pSearch = 1;
+
+                    /* Flush the scan results only for P2P search.
+                       P2P search happens on 3 social channels (1, 6, 11) */
+                    if( request->n_channels == WLAN_HDD_P2P_SOCIAL_CHANNELS )
+                    {
+                         pScanInfo->flushP2pScanResults = 1;
+                         sme_ScanFlushResult( WLAN_HDD_GET_HAL_CTX(pAdapter),
+                                          sessionId );
+                    }
+
+                    /*
+                       Skip Dfs Channel in case of P2P Search
+                       if it is set in ini file
+                    */
+                    if(cfg_param->skipDfsChnlInP2pSearch)
+                    {
+                       scanRequest.skipDfsChnlInP2pSearch = 1;
+                    }
+                    else
+                    {
+                       scanRequest.skipDfsChnlInP2pSearch = 0;
+                    }
 
                     /* set requestType to P2P Discovery */
                     scanRequest.requestType = eCSR_SCAN_P2P_DISCOVERY;
-                    if (pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated)
-                    {
-                        sessionId = pAdapter->p2pSessionId;
-                    }
-                    sme_ScanFlushResult( WLAN_HDD_GET_HAL_CTX(pAdapter),
-                                          sessionId );
                 }
             }
 #endif
@@ -3627,26 +3737,29 @@
 
     INIT_COMPLETION(pScanInfo->scan_req_completion_event);
 
-    if ((pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated) &&
-        (scanRequest.p2pSearch))
+    /*If the station is not connected and recieved a scan request, acquire the 
+     * wake lock to not request the suspend from Android*/
+    if((eConnectionState_NotConnected == 
+         (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState))
     {
-        status = sme_ScanRequest( WLAN_HDD_GET_HAL_CTX(pAdapter),
-                              pAdapter->p2pSessionId, &scanRequest, &scanId,
-                              &hdd_cfg80211_scan_done_callback, dev );
+        preventSuspend = 1;
+        hdd_prevent_suspend();
     }
-    else
-    {
-        status = sme_ScanRequest( WLAN_HDD_GET_HAL_CTX(pAdapter),
+
+    status = sme_ScanRequest( WLAN_HDD_GET_HAL_CTX(pAdapter),
                               pAdapter->sessionId, &scanRequest, &scanId,
                               &hdd_cfg80211_scan_done_callback, dev );
-    }
-    
+
     if (eHAL_STATUS_SUCCESS != status)
     {
         hddLog(VOS_TRACE_LEVEL_ERROR,
                 "%s: sme_ScanRequest returned error %d", __func__, status);
         complete(&pScanInfo->scan_req_completion_event);
         status = -EIO;
+        if(preventSuspend)
+        {
+            hdd_allow_suspend();
+        }
         goto free_mem;
     }
 
@@ -3698,9 +3811,14 @@
 
     if (pRoamProfile) 
     {
-        if (hdd_connGetConnectedBssType(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter),
-            &connectedBssType ) || ( eMib_dot11DesiredBssType_independent == 
-              connectedBssType))
+        int ret = 0;
+        hdd_station_ctx_t *pHddStaCtx;
+        pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+        hdd_connGetConnectedBssType(pHddStaCtx,&connectedBssType );
+
+        if((eMib_dot11DesiredBssType_independent == connectedBssType) ||
+           (eConnectionState_Associated == pHddStaCtx->conn_info.connState) ||
+           (eConnectionState_IbssConnected == pHddStaCtx->conn_info.connState))
         {
             /* Issue disconnect to CSR */
             INIT_COMPLETION(pAdapter->disconnect_comp_var);
@@ -3709,9 +3827,23 @@
                             pAdapter->sessionId,
                             eCSR_DISCONNECT_REASON_UNSPECIFIED ) )
             {
-                wait_for_completion_interruptible_timeout(
-                        &pAdapter->disconnect_comp_var,
-                        msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT));
+                ret = wait_for_completion_interruptible_timeout(
+                             &pAdapter->disconnect_comp_var,
+                             msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT));
+                if (0 == ret)
+                {
+                    VOS_ASSERT(0);
+                }
+            }
+        }
+        else if(eConnectionState_Disconnecting == pHddStaCtx->conn_info.connState)
+        {
+            ret = wait_for_completion_interruptible_timeout(
+                         &pAdapter->disconnect_comp_var,
+                         msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT));
+            if (0 == ret)
+            {
+                VOS_ASSERT(0);
             }
         }
 
@@ -4952,6 +5084,8 @@
     hdd_adapter_t *pAdapter;
     hdd_context_t *pHddCtx = (hdd_context_t*) wiphy_priv(wiphy);
 
+    ENTER();
+
     if (NULL == pHddCtx)
     {
         hddLog(VOS_TRACE_LEVEL_FATAL,"%s: HDD context is Null",__func__);
@@ -4976,6 +5110,7 @@
     wlan_hdd_get_classAstats(pAdapter);
     *dbm = pAdapter->hdd_stats.ClassA_stat.max_pwr;
 
+    EXIT();
     return 0;
 }
 
@@ -5005,6 +5140,8 @@
     tANI_U8  rateFlag = 1;
     tANI_U8  i, j, rssidx;
 
+    ENTER();
+
     if ((eConnectionState_Associated != pHddStaCtx->conn_info.connState) ||
             (0 == ssidlen))
     {
@@ -5081,7 +5218,7 @@
         ccmCfgGetStr(hHal, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates, &ORLeng);
         for (i = 0; i < ORLeng; i++)
         {
-            for (j = 0; j < sizeof(supported_data_rate); j ++)
+            for (j = 0; j < (sizeof(supported_data_rate) / sizeof(supported_data_rate[0])); j ++)
             {
                 /* Validate Rate Set */
                 if (supported_data_rate[j].beacon_rate_index == (OperationalRates[i] & 0x7F))
@@ -5098,7 +5235,7 @@
         ccmCfgGetStr(hHal, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedRates, &ERLeng);
         for (i = 0; i < ERLeng; i++)
         {
-            for (j = 0; j < sizeof(supported_data_rate); j ++)
+            for (j = 0; j < (sizeof(supported_data_rate) / sizeof(supported_data_rate[0])); j ++)
             {
                 if (supported_data_rate[j].beacon_rate_index == (ExtendedRates[i] & 0x7F))
                 {
@@ -5128,7 +5265,7 @@
 
             for (i = 0; i < MCSLeng; i++)
             {
-                for (j = 0; j < sizeof(supported_mcs_rate); j++)
+                for (j = 0; j < (sizeof(supported_mcs_rate) / sizeof(supported_mcs_rate[0])); j++)
                 {
                     if (supported_mcs_rate[j].beacon_rate_index == MCSRates[i])
                     {
@@ -5220,6 +5357,7 @@
     }
     sinfo->filled |= STATION_INFO_TX_BITRATE;
 
+    EXIT();
     return 0;
 }
 
@@ -5229,6 +5367,8 @@
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
     VOS_STATUS vos_status;
 
+    ENTER();
+
     if (NULL == pAdapter)
     {
         hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL\n", __func__);
@@ -5247,6 +5387,7 @@
      **/
     vos_status =  wlan_hdd_enter_bmps(pAdapter, !mode);
 
+    EXIT();
     if (VOS_STATUS_E_FAILURE == vos_status)
     {
         return -EINVAL;
@@ -5260,6 +5401,7 @@
                          struct net_device *netdev,
                          u8 key_index)
 {
+    ENTER();
     return 0;
 }
 #endif //LINUX_VERSION_CODE 
@@ -5269,12 +5411,14 @@
                    struct net_device *dev,
                    struct ieee80211_txq_params *params)
 {
+    ENTER();
     return 0;
 }
 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
 static int wlan_hdd_set_txq_params(struct wiphy *wiphy,
                    struct ieee80211_txq_params *params)
 {
+    ENTER();
     return 0;
 }
 #endif //LINUX_VERSION_CODE
@@ -5284,6 +5428,7 @@
 {
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 
+    ENTER();
     if ( NULL == pAdapter || NULL == pAdapter->pHddCtx)
     {
         hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Invalid Adapter or HDD Context " ,__func__);
@@ -5349,6 +5494,7 @@
           struct net_device *dev, u8 *mac, struct station_parameters *params)
 {
     // TODO: Implement this later.
+    ENTER();
     return 0;
 }
 
@@ -5366,6 +5512,8 @@
     eHalStatus result; 
     tANI_U8  BSSIDMatched = 0;
    
+    ENTER();
+
     // Validate pAdapter  
     if ( NULL == pAdapter || NULL == pAdapter->pHddCtx)
     {
@@ -5444,12 +5592,14 @@
 static int wlan_hdd_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *dev,
             struct cfg80211_pmksa *pmksa)
 {
+    ENTER();
     // TODO: Implement this later.
     return 0;
 }
 
 static int wlan_hdd_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device *dev)
 {
+    ENTER();
     // TODO: Implement this later.
     return 0;
 }
diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c
index 47ea1d6..3ad6fd0 100644
--- a/CORE/HDD/src/wlan_hdd_early_suspend.c
+++ b/CORE/HDD/src/wlan_hdd_early_suspend.c
@@ -40,7 +40,6 @@
 #include <linux/pm.h>
 #include <linux/wait.h>
 #include <linux/earlysuspend.h>
-#include <linux/wcnss_wlan.h>
 #include <wlan_hdd_includes.h>
 #include <wlan_qct_driver.h>
 #include <linux/wakelock.h>
@@ -81,6 +80,7 @@
 #include "bap_hdd_misc.h"
 #endif
 
+#include <linux/wcnss_wlan.h>
 #include <linux/inetdevice.h>
 #include <wlan_hdd_cfg.h>
 /**-----------------------------------------------------------------------------
@@ -118,7 +118,7 @@
 #endif
 
 #ifdef WLAN_FEATURE_PACKET_FILTERING
-extern void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set);
+extern void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set, v_U8_t sessionId);
 #endif
 
 //Callback invoked by PMC to report status of standby request
@@ -698,7 +698,8 @@
                   offLoadRequest.params.hostIpv4Addr[3]);
 
           if (eHAL_STATUS_SUCCESS != 
-                    sme_SetHostOffload(WLAN_HDD_GET_HAL_CTX(pAdapter) , &offLoadRequest))
+                    sme_SetHostOffload(WLAN_HDD_GET_HAL_CTX(pAdapter), 
+                                       pAdapter->sessionId, &offLoadRequest))
           {
               hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Failed to enable HostOffload "
                       "feature\n", __func__);
@@ -718,7 +719,8 @@
        offLoadRequest.enableOrDisable = SIR_OFFLOAD_DISABLE;
        offLoadRequest.offloadType =  SIR_IPV4_ARP_REPLY_OFFLOAD;
 
-       if (eHAL_STATUS_SUCCESS != sme_SetHostOffload(WLAN_HDD_GET_HAL_CTX(pAdapter), &offLoadRequest))
+       if (eHAL_STATUS_SUCCESS != sme_SetHostOffload(WLAN_HDD_GET_HAL_CTX(pAdapter), pAdapter->sessionId, 
+                                                     &offLoadRequest))
        {
             hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Failure to disable host "
                              "offload feature\n", __func__);
@@ -764,6 +766,7 @@
        pHddCtx->hdd_mcastbcast_filter_set = TRUE;
 }
 
+#ifdef CONFIG_HAS_EARLYSUSPEND
 #ifdef FEATURE_WLAN_INTEGRATED_SOC
 static void hdd_conf_suspend_ind(hdd_context_t* pHddCtx,
                                  hdd_adapter_t *pAdapter)
@@ -871,7 +874,7 @@
                     (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState))
            {
               /*set the filter*/
-              wlan_hdd_set_mc_addr_list(pHddCtx, TRUE);
+              wlan_hdd_set_mc_addr_list(pHddCtx, TRUE, pAdapter->sessionId);
            }
         }
 #endif
@@ -884,7 +887,7 @@
     }
 }
 
-static void hdd_conf_resume_ind(hdd_context_t* pHddCtx)
+static void hdd_conf_resume_ind(hdd_context_t* pHddCtx, v_U8_t sessionId)
 {
     VOS_STATUS vstatus;
     tpSirWlanResumeParam wlanResumeParam =
@@ -929,14 +932,13 @@
        {
           /*Filter applied during suspend mode*/
           /*Clear it here*/
-          wlan_hdd_set_mc_addr_list(pHddCtx, FALSE);
+          wlan_hdd_set_mc_addr_list(pHddCtx, FALSE, sessionId);
        }
     }
 #endif
 }
 #endif
 
-#ifdef CONFIG_HAS_EARLYSUSPEND
 //Suspend routine registered with Android OS
 void hdd_suspend_wlan(struct early_suspend *wlan_suspend)
 {
@@ -1030,8 +1032,13 @@
        }
 #endif
 
+   //Apply Dynamic Dtim For P2P
+   //Only if ignoreDynamicDtimInP2pMode is not set in ini
    if((pHddCtx->cfg_ini->enableDynamicDTIM ||
-       pHddCtx->cfg_ini->enableModulatedDTIM) && 
+       pHddCtx->cfg_ini->enableModulatedDTIM) &&
+       ((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
+        ((WLAN_HDD_P2P_CLIENT == pAdapter->device_mode) &&
+         !(pHddCtx->cfg_ini->ignoreDynamicDtimInP2pMode))) &&
        (eANI_BOOLEAN_TRUE == pAdapter->higherDtimTransition) &&
       (eConnectionState_Associated == 
          (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState) &&
@@ -1312,7 +1319,7 @@
 
          if(pHddCtx->hdd_mcastbcast_filter_set == TRUE) {
 #ifdef FEATURE_WLAN_INTEGRATED_SOC
-           hdd_conf_resume_ind(pHddCtx);
+           hdd_conf_resume_ind(pHddCtx, pAdapter->sessionId);
 #else
                   hdd_conf_mcastbcast_filter(pHddCtx, FALSE);
                               pHddCtx->hdd_mcastbcast_filter_set = FALSE;
@@ -2182,11 +2189,13 @@
       hddLog(VOS_TRACE_LEVEL_FATAL,"%s: hddRegisterPmOps failed",__func__);
       goto err_bap_stop;
    }
+#ifdef CONFIG_HAS_EARLYSUSPEND
    // Register suspend/resume callbacks
    if(pHddCtx->cfg_ini->nEnableSuspend)
    {
       register_wlan_suspend();
    }
+#endif
    /* Allow the phone to go to sleep */
    hdd_allow_suspend();
    /* register for riva power on lock */
diff --git a/CORE/HDD/src/wlan_hdd_ftm.c b/CORE/HDD/src/wlan_hdd_ftm.c
index f3122db..b6ba3d5 100644
--- a/CORE/HDD/src/wlan_hdd_ftm.c
+++ b/CORE/HDD/src/wlan_hdd_ftm.c
@@ -2607,6 +2607,9 @@
 
     ENTER();
 
+    //Delay to fix NV write failure on JB
+    vos_busy_wait(10000); //10ms
+
     if (!pRequestBuf) {
 
         hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null\n",__func__);
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 83b5eb6..b7e5166 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -203,7 +203,7 @@
        goto exit;
     }
 
-    if ((!ifr) && (!ifr->ifr_data))
+    if ((!ifr) || (!ifr->ifr_data))
     {
         ret = -EINVAL;
         goto exit;
@@ -1057,6 +1057,43 @@
     return 0;
 }
 
+int
+static iw_softap_set_tx_power(struct net_device *dev,
+                        struct iw_request_info *info,
+                        union iwreq_data *wrqu, char *extra)
+{
+    hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
+    tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
+    int cmd_len = wrqu->data.length;
+    int *value = (int *) kmalloc(cmd_len+1, GFP_KERNEL);
+    int set_value;
+    tSirMacAddr bssid = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
+    tSirMacAddr selfMac = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
+
+    if(value == NULL)
+        return -ENOMEM;
+
+    if(copy_from_user((char *) value, (char*)(wrqu->data.pointer), cmd_len)) {
+        hddLog(VOS_TRACE_LEVEL_FATAL, "%s -- copy_from_user --data pointer failed! bailing",
+                __FUNCTION__);
+        kfree(value);
+        return -EFAULT;
+    }
+
+    set_value = value[0];
+    kfree(value);
+
+    if( sme_SetMaxTxPower(hHal, bssid, selfMac, set_value) !=
+            eHAL_STATUS_SUCCESS )
+    {
+        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Setting maximum tx power failed",
+                __func__);
+        return -EIO;
+    }
+
+    return 0;
+}
+
 #define IS_BROADCAST_MAC(x) (((x[0] & x[1] & x[2] & x[3] & x[4] & x[5]) == 0xff) ? 1 : 0)
 
 int
@@ -1833,11 +1870,11 @@
 static int iw_get_ap_freq(struct net_device *dev, struct iw_request_info *info,
              struct iw_freq *fwrq, char *extra)
 {
-   v_U32_t status = 0,channel,freq;
+   v_U32_t status = FALSE, channel = 0, freq = 0;
    hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
    tHalHandle hHal;
    hdd_hostapd_state_t *pHostapdState;
-   hdd_ap_ctx_t *pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);  
+   hdd_ap_ctx_t *pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
 
    ENTER();
 
@@ -1860,18 +1897,30 @@
        else
        {
           status = hdd_wlan_get_freq(channel, &freq);
-          fwrq->m = freq;
-          fwrq->e = 0;
+          if( TRUE == status)
+          {
+              /* Set Exponent parameter as 6 (MHZ) in struct iw_freq
+               * iwlist & iwconfig command shows frequency into proper
+               * format (2.412 GHz instead of 246.2 MHz)*/
+              fwrq->m = freq;
+              fwrq->e = MHZ;
+          }
        }
     }
     else
     {
        channel = pHddApCtx->operatingChannel;
        status = hdd_wlan_get_freq(channel, &freq);
-       fwrq->m = freq;
-       fwrq->e = 0;
+       if( TRUE == status)
+       {
+          /* Set Exponent parameter as 6 (MHZ) in struct iw_freq
+           * iwlist & iwconfig command shows frequency into proper
+           * format (2.412 GHz instead of 246.2 MHz)*/
+           fwrq->m = freq;
+           fwrq->e = MHZ;
+       }
     }
-   return status;
+   return 0;
 }
 
 static int iw_softap_setwpsie(struct net_device *dev,
@@ -2518,7 +2567,13 @@
         IW_PRIV_TYPE_BYTE | sizeof(tChannelListInfo),
         "getChannelList" },
 
+    /* handlers for main ioctl */
+    {   QCSAP_IOCTL_SET_TX_POWER,
+        IW_PRIV_TYPE_INT| IW_PRIV_SIZE_FIXED | 1,
+        0,
+        "" },
 };
+
 static const iw_handler hostapd_private[] = {
    [QCSAP_IOCTL_SETPARAM - SIOCIWFIRSTPRIV] = iw_softap_setparam,  //set priv ioctl
    [QCSAP_IOCTL_GETPARAM - SIOCIWFIRSTPRIV] = iw_softap_getparam,  //get priv ioctl   
@@ -2538,7 +2593,8 @@
    [QCSAP_IOCTL_SET_CHANNEL_RANGE - SIOCIWFIRSTPRIV] = iw_softap_set_channel_range,
    [QCSAP_IOCTL_MODIFY_ACL - SIOCIWFIRSTPRIV]   = iw_softap_modify_acl,
    [QCSAP_IOCTL_GET_CHANNEL_LIST - SIOCIWFIRSTPRIV]   = iw_softap_get_channel_list,
-   [QCSAP_IOCTL_PRIV_GET_SOFTAP_LINK_SPEED - SIOCIWFIRSTPRIV]     = iw_get_softap_linkspeed
+   [QCSAP_IOCTL_PRIV_GET_SOFTAP_LINK_SPEED - SIOCIWFIRSTPRIV]     = iw_get_softap_linkspeed,
+   [QCSAP_IOCTL_SET_TX_POWER - SIOCIWFIRSTPRIV]   = iw_softap_set_tx_power,
 };
 const struct iw_handler_def hostapd_handler_def = {
    .num_standard     = sizeof(hostapd_handler) / sizeof(hostapd_handler[0]),
@@ -2641,20 +2697,11 @@
             ( pAdapter->device_mode == WLAN_HDD_SOFTAP ) && 
             ( !strncmp( pAdapter->dev->name, "wlan", 4 )) )
     {
-        hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
-        if (pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated)
-        {
-            INIT_COMPLETION(pAdapter->session_close_comp_var);
-            if( eHAL_STATUS_SUCCESS == sme_CloseSession( pHddCtx->hHal,
-                        pAdapter->p2pSessionId,
-                        hdd_smeCloseSessionCallback, pAdapter ) )
-            {
-                //Block on a completion variable. Can't wait forever though.
-                wait_for_completion_interruptible_timeout(
-                        &pAdapter->session_close_comp_var,
-                        msecs_to_jiffies(WLAN_WAIT_TIME_SESSIONOPENCLOSE));
-            }
-        }
+       /* TODO: Revisit this later, either unregister p2p0 
+                interface here or make change in wifi.c file to pass 
+                information, that driver is getting loaded for SAP interface, 
+                in that case, during load time don't start p2p0 interface 
+        */
     }
 #endif
     EXIT();
diff --git a/CORE/HDD/src/wlan_hdd_innav.c b/CORE/HDD/src/wlan_hdd_innav.c
deleted file mode 100644
index 1e9b029..0000000
--- a/CORE/HDD/src/wlan_hdd_innav.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2012, Code Aurora Forum. 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.
- */
-
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 9e64d20..9f59945 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -144,11 +144,25 @@
 module_param_string(fwpath, fwpath, BUF_LEN,
                     S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
 
+/*
+ * The rate at which the driver sends RESTART event to supplicant
+ * once the function 'vos_wlanRestart()' is called
+ *
+ */
+#define WLAN_HDD_RESTART_RETRY_DELAY_MS 5000  /* 5 second */
+#define WLAN_HDD_RESTART_RETRY_MAX_CNT  5     /* 5 retries */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,5))
 static struct wake_lock wlan_wake_lock;
+#endif
 /* set when SSR is needed after unload */
 static v_U8_t      isSsrRequired;
 
 //internal function declaration
+static VOS_STATUS wlan_hdd_framework_restart(hdd_context_t *pHddCtx);
+static void wlan_hdd_restart_init(hdd_context_t *pHddCtx);
+static void wlan_hdd_restart_deinit(hdd_context_t *pHddCtx);
+void wlan_hdd_restart_timer_cb(v_PVOID_t usrDataForCallback);
+
 v_U16_t hdd_select_queue(struct net_device *dev,
     struct sk_buff *skb);
 
@@ -173,7 +187,7 @@
 
    //Make sure that this callback corresponds to our device.
    if((strncmp( dev->name, "wlan", 4 )) && 
-      (strncmp( dev->name, "p2p-wlan", 8))
+      (strncmp( dev->name, "p2p", 3))
      )
       return NOTIFY_DONE;
 
@@ -207,11 +221,8 @@
         break;
 
    case NETDEV_CHANGE:
-        if(VOS_STA_MODE == hdd_get_conparam()) 
-        {
-            if(TRUE == pAdapter->isLinkUpSvcNeeded)
-               complete(&pAdapter->linkup_event_var);
-           }
+        if(TRUE == pAdapter->isLinkUpSvcNeeded)
+           complete(&pAdapter->linkup_event_var);
         break;
 
    case NETDEV_GOING_DOWN:
@@ -342,7 +353,7 @@
       goto exit; 
    }
 
-   if ((!ifr) && (!ifr->ifr_data))
+   if ((!ifr) || (!ifr->ifr_data))
    {
        ret = -EINVAL;
        goto exit; 
@@ -1268,65 +1279,6 @@
    return status;
 }
 
-#ifdef WLAN_FEATURE_P2P
-/**
- * hdd_init_p2p_device_mode
- *
- *FUNCTION:
- * This function is called from hdd_wlan_startup function when wlan 
- * driver module is loaded. 
- *
- *LOGIC:
- * Open New SME session with P2P Device Mac Address which is different 
- * from STA Mac Address SME session. When driver receive any frame on STA Mac 
- * Address then we divert all the frame using P2P Device Mac Address instaed of 
- * STA Mac address. 
- *
- *ASSUMPTIONS:
- *
- *
- *NOTE:
- *
- * @param  pAdapter   Pointer to pAdapter structure
- *
- * @return None
- */
-VOS_STATUS hdd_init_p2p_device_mode( hdd_adapter_t *pAdapter)
-{
-   hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
-   eHalStatus halStatus = eHAL_STATUS_SUCCESS;
-   VOS_STATUS status = VOS_STATUS_E_FAILURE;
-   int rc = 0;
-
-   INIT_COMPLETION(pAdapter->session_open_comp_var);
-   //Open a SME session for future operation
-   halStatus = sme_OpenSession( pHddCtx->hHal, hdd_smeRoamCallback, pAdapter,
-               (tANI_U8 *)&pHddCtx->p2pDeviceAddress, &pAdapter->p2pSessionId);
-   if ( !HAL_STATUS_SUCCESS( halStatus ) )
-   {
-      hddLog(VOS_TRACE_LEVEL_FATAL,
-             "sme_OpenSession() failed with status code %08d [x%08lx]",
-                                                 halStatus, halStatus );
-      status = VOS_STATUS_E_FAILURE;
-      return status;
-   }
-   
-   //Block on a completion variable. Can't wait forever though.
-   rc = wait_for_completion_interruptible_timeout(
-                        &pAdapter->session_open_comp_var,
-                        msecs_to_jiffies(WLAN_WAIT_TIME_SESSIONOPENCLOSE));
-   if (!rc)
-   {
-      hddLog(VOS_TRACE_LEVEL_FATAL,
-             "Session is not opened within timeout period code %08d", rc );
-      status = VOS_STATUS_E_FAILURE;
-      return status;
-   }
-
-   return VOS_STATUS_SUCCESS;
-}
-#endif
-
 #ifdef CONFIG_CFG80211
 void hdd_cleanup_actionframe( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter )
 {
@@ -1358,6 +1310,7 @@
    {
       case WLAN_HDD_INFRA_STATION:
       case WLAN_HDD_P2P_CLIENT:
+      case WLAN_HDD_P2P_DEVICE:
       {
          if(test_bit(INIT_TX_RX_SUCCESS, &pAdapter->event_flags))
          {
@@ -1598,6 +1551,7 @@
       case WLAN_HDD_INFRA_STATION:
 #ifdef WLAN_FEATURE_P2P
       case WLAN_HDD_P2P_CLIENT:
+      case WLAN_HDD_P2P_DEVICE:
 #endif
       {
          pAdapter = hdd_alloc_station_adapter( pHddCtx, macAddr, iface_name );
@@ -1606,12 +1560,11 @@
             return NULL;
 
 #ifdef CONFIG_CFG80211
-         pAdapter->wdev.iftype = (session_type == WLAN_HDD_INFRA_STATION) ?
-                                  NL80211_IFTYPE_STATION :
-                                  NL80211_IFTYPE_P2P_CLIENT;
+         pAdapter->wdev.iftype = (session_type == WLAN_HDD_P2P_CLIENT) ?
+                                  NL80211_IFTYPE_P2P_CLIENT:
+                                  NL80211_IFTYPE_STATION;
 #endif
 
-
          pAdapter->device_mode = session_type;
 
          status = hdd_init_station_mode( pAdapter );
@@ -1900,6 +1853,7 @@
    {
       case WLAN_HDD_INFRA_STATION:
       case WLAN_HDD_P2P_CLIENT:
+      case WLAN_HDD_P2P_DEVICE:
          if( hdd_connIsConnected( WLAN_HDD_GET_STATION_CTX_PTR( pAdapter )) )
          {
             if (pWextState->roamProfile.BSSType == eCSR_BSS_TYPE_START_IBSS)
@@ -2085,6 +2039,7 @@
       {
          case WLAN_HDD_INFRA_STATION:
          case WLAN_HDD_P2P_CLIENT:
+         case WLAN_HDD_P2P_DEVICE:
             hdd_init_station_mode(pAdapter);
             /* Open the gates for HDD to receive Wext commands */
             pAdapter->isLinkUpSvcNeeded = FALSE; 
@@ -2677,6 +2632,9 @@
 
    ENTER();
 
+   // Unloading, restart logic is no more required.
+   wlan_hdd_restart_deinit(pHddCtx);
+
 #ifdef CONFIG_CFG80211
 #ifdef WLAN_SOFTAP_FEATURE
    if (VOS_STA_SAP_MODE != hdd_get_conparam())
@@ -2820,26 +2778,6 @@
    // Unregister the Net Device Notifier
    unregister_netdevice_notifier(&hdd_netdev_notifier);
    
-#ifdef WLAN_FEATURE_P2P
-   if (pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated)
-   {
-       hdd_adapter_t* pAdapter = hdd_get_adapter(pHddCtx,
-                                    WLAN_HDD_INFRA_STATION);
-       if (pAdapter != NULL)
-       {
-          INIT_COMPLETION(pAdapter->session_close_comp_var);
-          if( eHAL_STATUS_SUCCESS == sme_CloseSession( pHddCtx->hHal,
-                                        pAdapter->p2pSessionId,
-                                        hdd_smeCloseSessionCallback, pAdapter ) )
-          {
-              //Block on a completion variable. Can't wait forever though.
-              wait_for_completion_interruptible_timeout(
-                         &pAdapter->session_close_comp_var,
-                         msecs_to_jiffies(WLAN_WAIT_TIME_SESSIONOPENCLOSE));
-          }
-       }
-   }
-#endif
    hdd_stop_all_adapters( pHddCtx );
 
 #ifdef ANI_BUS_TYPE_SDIO
@@ -2939,7 +2877,11 @@
          "%s: Failed to close VOSS Scheduler",__func__);
       VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
    }
-   
+
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+   /* Destroy the wake lock */
+   wake_lock_destroy(&pHddCtx->rx_wake_lock);
+#endif
 
    //Close VOSS
    //This frees pMac(HAL) context. There should not be any call that requires pMac access after this.
@@ -3182,12 +3124,20 @@
 /* wake lock APIs for HDD */
 void hdd_prevent_suspend(void)
 {
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,5))
     wake_lock(&wlan_wake_lock);
+#else
+    wcnss_prevent_suspend();
+#endif
 }
 
 void hdd_allow_suspend(void)
 {
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,5))
     wake_unlock(&wlan_wake_lock);
+#else
+    wcnss_allow_suspend();
+#endif
 }
 
 /**---------------------------------------------------------------------------
@@ -3206,6 +3156,7 @@
 {
    VOS_STATUS status;
    hdd_adapter_t *pAdapter = NULL;
+   hdd_adapter_t *pP2pAdapter = NULL;
    hdd_context_t *pHddCtx = NULL;
    v_CONTEXT_t pVosContext= NULL;
 #ifdef WLAN_BTAMP_FEATURE
@@ -3420,6 +3371,17 @@
       goto err_vosclose;
    }
 
+#ifdef FEATURE_WLAN_INTEGRATED_SOC
+      /* Vos preStart is calling */
+      /* vos preStart which does cfg download should be called before set sme config which accesses/sets some cfgs */
+      status = vos_preStart( pHddCtx->pvosContext );
+      if ( !VOS_IS_STATUS_SUCCESS( status ) )
+      {
+         hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
+         goto err_vosclose;
+      }
+#endif
+
    // Set the SME configuration parameters...
    status = hdd_set_sme_config( pHddCtx );
 
@@ -3438,16 +3400,6 @@
    }
 
 #ifdef FEATURE_WLAN_INTEGRATED_SOC
-   /* Vos preStart is calling */
-   status = vos_preStart( pHddCtx->pvosContext );
-   if ( !VOS_IS_STATUS_SUCCESS( status ) )
-   {
-      hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
-      goto err_vosclose;
-   }
-#endif
-
-#ifdef FEATURE_WLAN_INTEGRATED_SOC
    /* In the integrated architecture we update the configuration from
       the INI file and from NV before vOSS has been started so that
       the final contents are available to send down to the cCPU   */
@@ -3627,11 +3579,20 @@
       pr_info("%s: WCNSS hardware version %s\n",
               WLAN_MODULE_NAME, versionString);
 
-      /* Check if FW version is greater than 0.1.1.0. Only then send host-FW capability exchange message */
-      if ((versionReported.major>0) || (versionReported.minor>1) || ((versionReported.minor>=1) && (versionReported.version>=1)))
+      /* 1.Check if FW version is greater than 0.1.1.0. Only then send host-FW capability exchange message 
+              2.Host-FW capability exchange message  is only present on riva 1.1 so 
+                send the message only if it the riva is 1.1
+                minor numbers for different riva branches:
+                0 -> (1.0)Mainline Build
+                1 -> (1.1)Mainline Build
+                2->(1.04) Stability Build
+         */
+      if (((versionReported.major>0) || (versionReported.minor>1) || 
+         ((versionReported.minor>=1) && (versionReported.version>=1)))
+         && ((versionReported.major == 1) && (versionReported.minor >= 1)))
          fwFeatCapsMsgSupported = 1;
       if (fwFeatCapsMsgSupported)
-        sme_featureCapsExchange(pHddCtx->hHal);
+         sme_featureCapsExchange(pHddCtx->hHal);
    } while (0);
 
 #endif // FEATURE_WLAN_INTEGRATED_SOC
@@ -3658,26 +3619,44 @@
      if (pAdapter != NULL)
      {
 #ifdef WLAN_FEATURE_P2P
-         vos_mem_copy( pHddCtx->p2pDeviceAddress.bytes, 
-                       pHddCtx->cfg_ini->intfMacAddr[0].bytes,
-                       sizeof(tSirMacAddr));
          if ( pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated )
          {
+             vos_mem_copy( pHddCtx->p2pDeviceAddress.bytes,
+                       pHddCtx->cfg_ini->intfMacAddr[0].bytes,
+                       sizeof(tSirMacAddr));
              /* Generate the P2P Device Address.  This consists of the device's
               * primary MAC address with the locally administered bit set.
               */
              pHddCtx->p2pDeviceAddress.bytes[0] |= 0x02;
-             status = hdd_init_p2p_device_mode(pAdapter);
-             if ( VOS_STATUS_SUCCESS != status )
+         }
+         else
+         {
+             tANI_U8* p2p_dev_addr = wlan_hdd_get_intf_addr(pHddCtx);
+             if (p2p_dev_addr != NULL)
              {
-                 hddLog(VOS_TRACE_LEVEL_FATAL,
-                         "%s: Init Session fail for P2P Device Address Mode ",
-                          __FUNCTION__);
-                 goto err_close_adapter;
+                vos_mem_copy(&pHddCtx->p2pDeviceAddress.bytes[0],
+                             p2p_dev_addr, VOS_MAC_ADDR_SIZE);
+             }
+             else
+             {
+                hddLog(VOS_TRACE_LEVEL_FATAL,
+                    "%s: Failed to allocate mac_address for p2p_device",
+                    __FUNCTION__);
+                goto err_close_adapter;
              }
          }
+
+         pP2pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_P2P_DEVICE, "p2p%d",
+                           &pHddCtx->p2pDeviceAddress.bytes[0], FALSE );
+         if ( NULL == pP2pAdapter )
+         {
+             hddLog(VOS_TRACE_LEVEL_FATAL,
+                "%s: Failed to do hdd_open_adapter for P2P Device Interface",
+                __FUNCTION__);
+             goto err_close_adapter;
+         }
 #endif
-    }
+     }
 #ifdef WLAN_SOFTAP_FEATURE
    }
 #endif
@@ -3691,15 +3670,14 @@
      goto err_clkvote;
 #endif
    }
-   
-     
+
 #ifdef WLAN_BTAMP_FEATURE
    vStatus = WLANBAP_Open(pVosContext);
    if(!VOS_IS_STATUS_SUCCESS(vStatus))
    {
      VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
         "%s: Failed to open BAP",__func__);
-      goto err_p2psession_close;
+      goto err_close_adapter;
    }
 
    vStatus = BSL_Init(pVosContext);
@@ -3722,7 +3700,7 @@
    status = WLANBAP_SetConfig(&btAmpConfig);
 
 #endif //WLAN_BTAMP_FEATURE
- 
+
 #ifdef FEATURE_WLAN_SCAN_PNO
    /*SME must send channel update configuration to RIVA*/
    sme_UpdateChannelConfig(pHddCtx->hHal); 
@@ -3737,7 +3715,7 @@
 #ifdef WLAN_BTAMP_FEATURE
       goto err_bap_stop;
 #else
-      goto err_p2psession_close; 
+      goto err_close_adapter; 
 #endif //WLAN_BTAMP_FEATURE
    }
 
@@ -3813,7 +3791,7 @@
    if (VOS_STA_SAP_MODE != hdd_get_conparam())
 #endif
    {
-      wlan_hdd_cfg80211_post_voss_start(pAdapter);
+      wlan_hdd_cfg80211_post_voss_start(pP2pAdapter);
    }
 #endif
 
@@ -3821,11 +3799,21 @@
 
    pHddCtx->isLoadUnloadInProgress = FALSE;
 
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+   /* Initialize the wake lcok */
+   wake_lock_init(&pHddCtx->rx_wake_lock,
+           WAKE_LOCK_SUSPEND,
+           "qcom_rx_wakelock");
+#endif
+
    vos_event_init(&pAdapter->scan_info.scan_finished_event);
    pAdapter->scan_info.scan_pending_option = WEXT_SCAN_PENDING_GIVEUP;
 
    vos_set_load_unload_in_progress(VOS_MODULE_ID_VOSS, FALSE);
    hdd_allow_suspend();
+   
+   // Initialize the restart logic
+   wlan_hdd_restart_init(pHddCtx);
   
    goto success;
 
@@ -3852,29 +3840,6 @@
    WLANBAP_Close(pVosContext);
 #endif
 
-err_p2psession_close:
-#ifdef WLAN_FEATURE_P2P
-   if (pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated)
-   {
-       hdd_adapter_t* pAdapter = hdd_get_adapter(pHddCtx,
-                                    WLAN_HDD_INFRA_STATION);
-
-       if (pAdapter != NULL)
-       {
-          INIT_COMPLETION(pAdapter->session_close_comp_var);
-          if( eHAL_STATUS_SUCCESS == sme_CloseSession( pHddCtx->hHal,
-                                        pAdapter->p2pSessionId,
-                                        hdd_smeCloseSessionCallback, pAdapter ) )
-          {
-              //Block on a completion variable. Can't wait forever though.
-              wait_for_completion_interruptible_timeout(
-                         &pAdapter->session_close_comp_var,
-                         msecs_to_jiffies(WLAN_WAIT_TIME_SESSIONOPENCLOSE));
-          }
-       }
-   }
-#endif
-
 err_close_adapter:
    hdd_close_all_adapters( pHddCtx );
 
@@ -3968,7 +3933,9 @@
 
    ENTER();
 
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,5))
    wake_lock_init(&wlan_wake_lock, WAKE_LOCK_SUSPEND, "wlan");
+#endif
 
    pr_info("%s: loading driver v%s\n", WLAN_MODULE_NAME,
            QWLAN_VERSIONSTR TIMER_MANAGER_STR MEMORY_DEBUG_STR);
@@ -4146,7 +4113,9 @@
       vos_mem_exit();
 #endif
 
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,5))
       wake_lock_destroy(&wlan_wake_lock);
+#endif
       pr_err("%s: driver load failure\n", WLAN_MODULE_NAME);
    }
    else
@@ -4179,7 +4148,6 @@
 {
    hdd_context_t *pHddCtx = NULL;
    v_CONTEXT_t pVosContext = NULL;
-   int attempts = 0;
 
    pr_info("%s: unloading driver v%s\n", WLAN_MODULE_NAME, QWLAN_VERSIONSTR);
 
@@ -4201,13 +4169,10 @@
    }
    else
    {
+      /* module exit should never proceed if SSR is not completed */
       while(isWDresetInProgress()){
-         VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Reset in Progress by LOGP. Block rmmod for 500ms!!!",__func__);
-         VOS_ASSERT(0);
-         msleep(500);
-         attempts++;
-         if(attempts==MAX_EXIT_ATTEMPTS_DURING_LOGP)
-           break;
+         VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:SSR in Progress; block rmmod for 1 second!!!",__func__);
+         msleep(1000);
        }
 
       pHddCtx->isLoadUnloadInProgress = TRUE;
@@ -4231,7 +4196,9 @@
 #endif
 
 done:
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,5))
    wake_lock_destroy(&wlan_wake_lock);
+#endif
    pr_info("%s: driver unloaded\n", WLAN_MODULE_NAME);
 }
 
@@ -4426,8 +4393,8 @@
        case WLAN_HDD_P2P_GO:
 #endif
        case WLAN_HDD_SOFTAP:
-    pHddCtx->concurrency_mode |= (1 << mode);
-    pHddCtx->no_of_sessions[mode]++;
+            pHddCtx->concurrency_mode |= (1 << mode);
+            pHddCtx->no_of_sessions[mode]++;
             break;
        default:
             break;
@@ -4459,6 +4426,189 @@
     __func__,pHddCtx->concurrency_mode,mode,pHddCtx->no_of_sessions[mode]);
 }
 
+/**---------------------------------------------------------------------------
+ *
+ *   \brief wlan_hdd_restart_init
+ *
+ *   This function initalizes restart timer/flag. An internal function.
+ *
+ *   \param  - pHddCtx
+ *
+ *   \return - None
+ *             
+ * --------------------------------------------------------------------------*/
+
+static void wlan_hdd_restart_init(hdd_context_t *pHddCtx)
+{
+   /* Initialize */
+   pHddCtx->hdd_restart_retries = 0;
+   atomic_set(&pHddCtx->isRestartInProgress, 0);
+   vos_timer_init(&pHddCtx->hdd_restart_timer, 
+                     VOS_TIMER_TYPE_SW, 
+                     wlan_hdd_restart_timer_cb,
+                     pHddCtx);
+}
+/**---------------------------------------------------------------------------
+ *
+ *   \brief wlan_hdd_restart_deinit
+ *
+ *   This function cleans up the resources used. An internal function.
+ *
+ *   \param  - pHddCtx
+ *
+ *   \return - None
+ *             
+ * --------------------------------------------------------------------------*/
+
+static void wlan_hdd_restart_deinit(hdd_context_t* pHddCtx)
+{
+ 
+   VOS_STATUS vos_status;
+   /* Block any further calls */
+   atomic_set(&pHddCtx->isRestartInProgress, 1);
+   /* Cleanup */
+   vos_status = vos_timer_stop( &pHddCtx->hdd_restart_timer );
+   if (!VOS_IS_STATUS_SUCCESS(vos_status))
+          hddLog(LOGE, FL("Failed to stop HDD restart timer\n"));
+   vos_status = vos_timer_destroy(&pHddCtx->hdd_restart_timer);
+   if (!VOS_IS_STATUS_SUCCESS(vos_status))
+          hddLog(LOGE, FL("Failed to destroy HDD restart timer\n"));
+
+}
+
+/**---------------------------------------------------------------------------
+ *
+ *   \brief wlan_hdd_framework_restart
+ *
+ *   This function uses a cfg80211 API to start a framework initiated WLAN
+ *   driver module unload/load.
+ *
+ *   Also this API keep retrying (WLAN_HDD_RESTART_RETRY_MAX_CNT).
+ *
+ *
+ *   \param  - pHddCtx
+ *
+ *   \return - VOS_STATUS_SUCCESS: Success
+ *             VOS_STATUS_E_EMPTY: Adapter is Empty
+ *             VOS_STATUS_E_NOMEM: No memory
+
+ * --------------------------------------------------------------------------*/
+
+static VOS_STATUS wlan_hdd_framework_restart(hdd_context_t *pHddCtx) 
+{
+   VOS_STATUS status = VOS_STATUS_SUCCESS;
+   hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
+   int len = (sizeof (struct ieee80211_mgmt));
+   struct ieee80211_mgmt *mgmt = NULL; 
+   
+   /* Prepare the DEAUTH managment frame with reason code */
+   mgmt =  kzalloc(len, GFP_KERNEL);
+   if(mgmt == NULL) 
+   {
+      VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, 
+            "%s: memory allocatoin failed (%d bytes)", __func__, len);
+      return VOS_STATUS_E_NOMEM;
+   }
+   mgmt->u.deauth.reason_code = WLAN_REASON_DISASSOC_LOW_ACK;
+
+   /* Iterate over all adapters/devices */
+   status =  hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
+   do 
+   {
+      if( (status == VOS_STATUS_SUCCESS) && 
+                           pAdapterNode  && 
+                           pAdapterNode->pAdapter)
+      {
+         VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, 
+               "restarting the driver(intf:\'%s\' mode:%d :try %d)",
+               pAdapterNode->pAdapter->dev->name,
+               pAdapterNode->pAdapter->device_mode,
+               pHddCtx->hdd_restart_retries + 1);
+         /* 
+          * CFG80211 event to restart the driver
+          * 
+          * 'cfg80211_send_unprot_deauth' sends a 
+          * NL80211_CMD_UNPROT_DEAUTHENTICATE event to supplicant at any state 
+          * of SME(Linux Kernel) state machine.
+          *
+          * Reason code WLAN_REASON_DISASSOC_LOW_ACK is currently used to restart
+          * the driver.
+          *
+          */
+         
+         cfg80211_send_unprot_deauth(pAdapterNode->pAdapter->dev, (u_int8_t*)mgmt, len );  
+      }
+      status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
+      pAdapterNode = pNext;
+   } while((NULL != pAdapterNode) && (VOS_STATUS_SUCCESS == status));
+
+
+   /* Free the allocated management frame */
+   kfree(mgmt);
+
+   /* Retry until we unload or reach max count */
+   if(++pHddCtx->hdd_restart_retries < WLAN_HDD_RESTART_RETRY_MAX_CNT) 
+      vos_timer_start(&pHddCtx->hdd_restart_timer, WLAN_HDD_RESTART_RETRY_DELAY_MS);
+
+   return status;
+
+}
+/**---------------------------------------------------------------------------
+ *
+ *   \brief wlan_hdd_restart_timer_cb
+ *
+ *   Restart timer callback. An internal function.
+ *
+ *   \param  - User data:
+ *
+ *   \return - None
+ *             
+ * --------------------------------------------------------------------------*/
+
+void wlan_hdd_restart_timer_cb(v_PVOID_t usrDataForCallback)
+{
+   hdd_context_t *pHddCtx = usrDataForCallback;
+   wlan_hdd_framework_restart(pHddCtx);
+   return;
+
+}
+
+
+/**---------------------------------------------------------------------------
+ *
+ *   \brief wlan_hdd_restart_driver
+ *
+ *   This function sends an event to supplicant to restart the WLAN driver. 
+ *   
+ *   This function is called from vos_wlanRestart.
+ *
+ *   \param  - pHddCtx
+ *
+ *   \return - VOS_STATUS_SUCCESS: Success
+ *             VOS_STATUS_E_EMPTY: Adapter is Empty
+ *             VOS_STATUS_E_ALREADY: Request already in progress
+
+ * --------------------------------------------------------------------------*/
+VOS_STATUS wlan_hdd_restart_driver(hdd_context_t *pHddCtx) 
+{
+   VOS_STATUS status = VOS_STATUS_SUCCESS;
+
+   /* A tight check to make sure reentrancy */
+   if(atomic_xchg(&pHddCtx->isRestartInProgress, 1))
+   {
+      VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN, 
+            "%s: WLAN restart is already in progress", __func__);
+
+      return VOS_STATUS_E_ALREADY;
+   }
+
+   /* Restart API */
+   status = wlan_hdd_framework_restart(pHddCtx);
+   
+   return status;
+}
+
+
 //Register the module init/exit functions
 module_init(hdd_module_init);
 module_exit(hdd_module_exit);
diff --git a/CORE/HDD/src/wlan_hdd_oemdata.c b/CORE/HDD/src/wlan_hdd_oemdata.c
new file mode 100644
index 0000000..6243662
--- /dev/null
+++ b/CORE/HDD/src/wlan_hdd_oemdata.c
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 2012, Code Aurora Forum. 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.
+ */
+
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+/*================================================================================ 
+    \file wlan_hdd_oemdata.c
+  
+    \brief Linux Wireless Extensions for oem data req/rsp
+  
+    $Id: wlan_hdd_oemdata.c,v 1.34 2010/04/15 01:49:23 -- VINAY
+  
+    Copyright (C) Qualcomm Inc.
+    
+================================================================================*/
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/wireless.h>
+#include <wlan_hdd_includes.h>
+#include <net/arp.h>
+
+/*---------------------------------------------------------------------------------------------
+
+  \brief hdd_OemDataReqCallback() - 
+
+  This function also reports the results to the user space
+
+  \return - 0 for success, non zero for failure
+
+-----------------------------------------------------------------------------------------------*/
+static eHalStatus hdd_OemDataReqCallback(tHalHandle hHal, 
+        void *pContext,
+        tANI_U32 oemDataReqID,
+        eOemDataReqStatus oemDataReqStatus)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    struct net_device *dev = (struct net_device *) pContext;
+    union iwreq_data wrqu;
+    char buffer[IW_CUSTOM_MAX+1];
+
+    memset(&wrqu, '\0', sizeof(wrqu));
+    memset(buffer, '\0', sizeof(buffer));
+
+    //now if the status is success, then send an event up
+    //so that the application can request for the data
+    //else no need to send the event up
+    if(oemDataReqStatus == eOEM_DATA_REQ_FAILURE)
+    {
+        snprintf(buffer, IW_CUSTOM_MAX, "QCOM: OEM-DATA-REQ-FAILED");
+        hddLog(LOGW, "%s: oem data req %d failed\n", __FUNCTION__, oemDataReqID);
+    }
+    else if(oemDataReqStatus == eOEM_DATA_REQ_INVALID_MODE)
+    {
+        snprintf(buffer, IW_CUSTOM_MAX, "QCOM: OEM-DATA-REQ-INVALID-MODE");
+        hddLog(LOGW, "%s: oem data req %d failed because the driver is in invalid mode (IBSS|BTAMP|AP)\n", __FUNCTION__, oemDataReqID);
+    }
+    else
+    {
+        snprintf(buffer, IW_CUSTOM_MAX, "QCOM: OEM-DATA-REQ-SUCCESS");
+        //everything went alright
+    }
+    
+    wrqu.data.pointer = buffer;
+    wrqu.data.length = strlen(buffer);
+        
+    wireless_send_event(dev, IWEVCUSTOM, &wrqu, buffer);
+
+    return status;
+}
+
+/**--------------------------------------------------------------------------------------------
+
+  \brief iw_get_oem_data_rsp() - 
+
+  This function gets the oem data response. This invokes
+  the respective sme functionality. Function for handling the oem data rsp 
+  IOCTL 
+
+  \param - dev  - Pointer to the net device
+         - info - Pointer to the iw_oem_data_req
+         - wrqu - Pointer to the iwreq data
+         - extra - Pointer to the data
+
+  \return - 0 for success, non zero for failure
+
+-----------------------------------------------------------------------------------------------*/
+int iw_get_oem_data_rsp(
+        struct net_device *dev, 
+        struct iw_request_info *info,
+        union iwreq_data *wrqu,
+        char *extra)
+{
+    eHalStatus                            status = eHAL_STATUS_SUCCESS;
+    struct iw_oem_data_rsp*               pHddOemDataRsp;
+    tOemDataRsp*                          pSmeOemDataRsp;
+
+    hdd_adapter_t *pAdapter = (netdev_priv(dev));
+
+    do
+    {
+        //get the oem data response from sme
+        status = sme_getOemDataRsp(WLAN_HDD_GET_HAL_CTX(pAdapter), &pSmeOemDataRsp);
+        if(status != eHAL_STATUS_SUCCESS)
+        {
+            hddLog(LOGE, "%s: failed in sme_getOemDataRsp\n", __FUNCTION__);
+            break;
+        }
+        else
+        {
+            if(pSmeOemDataRsp != NULL)
+            {
+                pHddOemDataRsp = (struct iw_oem_data_rsp*)(extra);
+                vos_mem_copy(pHddOemDataRsp->oemDataRsp, pSmeOemDataRsp->oemDataRsp, OEM_DATA_RSP_SIZE); 
+            }
+            else
+            {
+                hddLog(LOGE, "%s: pSmeOemDataRsp = NULL\n", __FUNCTION__);
+                status = eHAL_STATUS_FAILURE;
+                break;
+            }
+        }
+    } while(0);
+
+    return eHAL_STATUS_SUCCESS;
+}
+
+/**--------------------------------------------------------------------------------------------
+
+  \brief iw_set_oem_data_req() - 
+
+  This function sets the oem data req configuration. This invokes
+  the respective sme oem data req functionality. Function for 
+  handling the set IOCTL for the oem data req configuration
+
+  \param - dev  - Pointer to the net device
+     - info - Pointer to the iw_oem_data_req
+     - wrqu - Pointer to the iwreq data
+     - extra - Pointer to the data
+
+  \return - 0 for success, non zero for failure
+
+-----------------------------------------------------------------------------------------------*/
+int iw_set_oem_data_req(
+        struct net_device *dev, 
+        struct iw_request_info *info,
+        union iwreq_data *wrqu,
+        char *extra)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    struct iw_oem_data_req *pOemDataReq = NULL;
+    tOemDataReqConfig oemDataReqConfig;
+
+    tANI_U32 oemDataReqID = 0;
+
+    hdd_adapter_t *pAdapter = (netdev_priv(dev));
+    hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
+
+
+    do
+    {
+        if(NULL != wrqu->data.pointer)
+        {
+            pOemDataReq = (struct iw_oem_data_req *)wrqu->data.pointer;
+        }
+
+        if(pOemDataReq == NULL)
+        {
+            hddLog(LOGE, "in %s oemDataReq == NULL\n", __FUNCTION__);
+            status = eHAL_STATUS_FAILURE;
+            break;
+        }
+
+        vos_mem_zero(&oemDataReqConfig, sizeof(tOemDataReqConfig));
+
+        vos_mem_copy((&oemDataReqConfig)->oemDataReq, pOemDataReq->oemDataReq, OEM_DATA_REQ_SIZE);
+    
+        status = sme_OemDataReq(WLAN_HDD_GET_HAL_CTX(pAdapter), 
+                                                pAdapter->sessionId,
+                                                &oemDataReqConfig, 
+                                                &oemDataReqID, 
+                                                &hdd_OemDataReqCallback, 
+                                                dev);
+    
+        pwextBuf->oemDataReqID = oemDataReqID;
+        pwextBuf->oemDataReqInProgress = TRUE;
+
+    } while(0);
+    
+    return status;
+}
+
+
+#endif
diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c
index 5a08e10..418cc70 100644
--- a/CORE/HDD/src/wlan_hdd_p2p.c
+++ b/CORE/HDD/src/wlan_hdd_p2p.c
@@ -63,7 +63,6 @@
                                                 eHalStatus status )
 {
     hdd_adapter_t *pAdapter = (hdd_adapter_t*) pCtx;
-    hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
     hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
     hdd_remain_on_chan_ctx_t *pRemainChanCtx = cfgState->remain_on_chan_ctx;
 
@@ -95,15 +94,11 @@
     vos_mem_free( pRemainChanCtx );
 
     if ( ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode ) ||
-         ( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode )
+         ( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode ) ||
+         ( WLAN_HDD_P2P_DEVICE == pAdapter->device_mode )
        )
     {
         tANI_U8 sessionId = pAdapter->sessionId;
-        if (pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated)
-        {
-            if ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode )
-                sessionId = pAdapter->p2pSessionId;
-        }
         sme_DeregisterMgmtFrame(
                    hHal, sessionId,
                    (SIR_MAC_MGMT_FRAME << 2) | ( SIR_MAC_MGMT_PROBE_REQ << 4),
@@ -131,7 +126,6 @@
                                    rem_on_channel_request_type_t request_type )
 {
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
-    hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
     hdd_remain_on_chan_ctx_t *pRemainChanCtx;
     hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
     int status = 0;
@@ -144,9 +138,9 @@
 
     if( cfgState->remain_on_chan_ctx != NULL)
     {
-        /* Wait till remain on channel ready indication before issuing cancel 
-         * remain on channel request, otherwise if remain on channel not 
-         * received and if the driver issues cancel remain on channel then lim 
+        /* Wait till remain on channel ready indication before issuing cancel
+         * remain on channel request, otherwise if remain on channel not
+         * received and if the driver issues cancel remain on channel then lim
          * will be in unknown state.
          */
         status = wait_for_completion_interruptible_timeout(&pAdapter->rem_on_chan_ready_event,
@@ -159,13 +153,14 @@
         }
 
         INIT_COMPLETION(pAdapter->cancel_rem_on_chan_var);
-        
+
         /* Issue abort remain on chan request to sme.
          * The remain on channel callback will make sure the remain_on_chan
          * expired event is sent.
         */
         if ( ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode ) ||
-             ( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode )
+             ( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode ) ||
+             ( WLAN_HDD_P2P_DEVICE == pAdapter->device_mode )
            )
         {
             sme_CancelRemainOnChannel( WLAN_HDD_GET_HAL_CTX( pAdapter ),
@@ -178,14 +173,14 @@
             WLANSAP_CancelRemainOnChannel(
                                      (WLAN_HDD_GET_CTX(pAdapter))->pvosContext);
         }
-        
+
         wait_for_completion_interruptible_timeout(&pAdapter->cancel_rem_on_chan_var,
                msecs_to_jiffies(WAIT_CANCEL_REM_CHAN));
     }
 
-    /* When P2P-GO and if we are trying to unload the driver then 
+    /* When P2P-GO and if we are trying to unload the driver then
      * wlan driver is keep on receiving the remain on channel command
-     * and which is resulting in crash. So not allowing any remain on 
+     * and which is resulting in crash. So not allowing any remain on
      * channel requets when Load/Unload is in progress*/
     if (((hdd_context_t*)pAdapter->pHddCtx)->isLoadUnloadInProgress)
     {
@@ -219,15 +214,11 @@
 
     //call sme API to start remain on channel.
     if ( ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode ) ||
-         ( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode )
+         ( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode ) ||
+         ( WLAN_HDD_P2P_DEVICE == pAdapter->device_mode )
        )
     {
-        tANI_U8 sessionId = pAdapter->sessionId; 
-        if (pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated)
-        {
-            if ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode )
-                sessionId = pAdapter->p2pSessionId;
-        }
+        tANI_U8 sessionId = pAdapter->sessionId;
         //call sme API to start remain on channel.
         sme_RemainOnChannel(
                        WLAN_HDD_GET_HAL_CTX(pAdapter), sessionId,
@@ -253,7 +244,7 @@
            VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
                     "%s: WLANSAP_RemainOnChannel returned fail", __func__);
            cfgState->remain_on_chan_ctx = NULL;
-           vos_mem_free (pRemainChanCtx);             
+           vos_mem_free (pRemainChanCtx);
            return -EINVAL;
         }
 
@@ -320,7 +311,6 @@
                                       struct net_device *dev, u64 cookie )
 {
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
-    hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
     hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
     int status = 0;
 
@@ -354,15 +344,11 @@
      * expired event is sent.
      */
     if ( ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode ) ||
-         ( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode )
+         ( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode ) ||
+         ( WLAN_HDD_P2P_DEVICE == pAdapter->device_mode )
        )
     {
         tANI_U8 sessionId = pAdapter->sessionId; 
-        if (pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated)
-        {
-            if ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode )
-                sessionId = pAdapter->p2pSessionId;
-        }
         sme_CancelRemainOnChannel( WLAN_HDD_GET_HAL_CTX( pAdapter ),
                                             sessionId );
     }
@@ -407,11 +393,25 @@
 {
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev );
     hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
-    hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
+    tANI_U16 extendedWait = 0;
+    tANI_U8 type = WLAN_HDD_GET_TYPE_FRM_FC(buf[0]);
+    tANI_U8 subType = WLAN_HDD_GET_SUBTYPE_FRM_FC(buf[0]);
+    tActionFrmType actionFrmType;
+    bool noack = 0;
+
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
     hdd_adapter_t *goAdapter;
 #endif
 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))
+    noack = dont_wait_for_ack;
+#endif
+
+    //If the wait is coming as 0 with off channel set
+    //then set the wait to 200 ms
+    if (offchan && !wait)
+        wait = ACTION_FRAME_DEFAULT_WAIT;
+
     hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d",
                             __func__,pAdapter->device_mode);
 
@@ -422,8 +422,6 @@
          ( WLAN_HDD_P2P_GO == pAdapter->device_mode )
        )
     {
-        tANI_U8 type = WLAN_HDD_GET_TYPE_FRM_FC(buf[0]);
-        tANI_U8 subType = WLAN_HDD_GET_SUBTYPE_FRM_FC(buf[0]);
         if (type == SIR_MAC_MGMT_FRAME)
         {
             if (subType == SIR_MAC_MGMT_PROBE_RSP)
@@ -436,23 +434,21 @@
             else if ((subType == SIR_MAC_MGMT_DISASSOC) ||
                     (subType == SIR_MAC_MGMT_DEAUTH))
             {
-                /* Deauth/Disassoc received from supplicant, If we simply 
-                 * transmit the frame over air, driver doesn't come to know 
-                 * about the deauth/disassoc. Because of this reason the 
-                 * supplicant and driver will be out of sync.
-                 * Drop the frame here and initiate the disassoc procedure 
-                 * from driver, the core stack will take care of sending
-                 * disassoc frame and indicating corresponding events to supplicant.
+                /* During EAP failure or P2P Group Remove supplicant
+                 * is sending del_station command to driver. From
+                 * del_station function, Driver will send deauth frame to
+                 * p2p client. No need to send disassoc frame from here.
+                 * so Drop the frame here and send tx indication back to
+                 * supplicant.
                  */
                 tANI_U8 dstMac[ETH_ALEN] = {0};
                 memcpy(&dstMac, &buf[WLAN_HDD_80211_FRM_DA_OFFSET], ETH_ALEN);
-                hddLog(VOS_TRACE_LEVEL_INFO, 
+                hddLog(VOS_TRACE_LEVEL_INFO,
                         "%s: Deauth/Disassoc received for STA:"
-                        "%02x:%02x:%02x:%02x:%02x:%02x", 
-                        __func__, 
-                        dstMac[0], dstMac[1], dstMac[2], 
+                        "%02x:%02x:%02x:%02x:%02x:%02x",
+                        __func__,
+                        dstMac[0], dstMac[1], dstMac[2],
                         dstMac[3], dstMac[4], dstMac[5]);
-                hdd_softap_sta_disassoc(pAdapter, (v_U8_t *)&dstMac);
                 goto err_rem_channel;
             }
         }
@@ -487,6 +483,8 @@
            (cfgState->current_freq == chan->center_freq)
           )
         {
+            hddLog(LOG1,"action frame: extending the wait time\n");
+            extendedWait = (tANI_U16)wait;
             goto send_frame;
         }
 
@@ -519,8 +517,8 @@
     }
     else if ( offchan )
     {
-        /* Check before sending action frame 
-           whether we already remain on channel */ 
+        /* Check before sending action frame
+           whether we already remain on channel */
         if(NULL == cfgState->remain_on_chan_ctx)
         {
             goto err_rem_channel;
@@ -529,47 +527,59 @@
     send_frame:
 #endif
 
-    cfgState->buf = vos_mem_malloc( len ); //buf;
-    if( cfgState->buf == NULL )
-        return -ENOMEM;
+    if(!noack)
+    {
+        cfgState->buf = vos_mem_malloc( len ); //buf;
+        if( cfgState->buf == NULL )
+            return -ENOMEM;
 
-    cfgState->len = len;
+        cfgState->len = len;
 
-    vos_mem_copy( cfgState->buf, buf, len);
+        vos_mem_copy( cfgState->buf, buf, len);
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
-    if( cfgState->remain_on_chan_ctx )
-    {
-        cfgState->action_cookie = cfgState->remain_on_chan_ctx->cookie;
-        *cookie = cfgState->action_cookie;
-    }
-    else
-    {
+        if( cfgState->remain_on_chan_ctx )
+        {
+            cfgState->action_cookie = cfgState->remain_on_chan_ctx->cookie;
+            *cookie = cfgState->action_cookie;
+        }
+        else
+        {
 #endif
-        *cookie = (tANI_U32) cfgState->buf;
-        cfgState->action_cookie = *cookie;
+            *cookie = (tANI_U32) cfgState->buf;
+            cfgState->action_cookie = *cookie;
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
-    }
+        }
 #endif
+    } 
 
     if ( (WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
-         (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode)
+         (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode) ||
+         ( WLAN_HDD_P2P_DEVICE == pAdapter->device_mode )
        )
     {
-        tANI_U8 sessionId = pAdapter->sessionId; 
-        if (pHddCtx->cfg_ini->isP2pDeviceAddrAdministrated)
+        tANI_U8 sessionId = pAdapter->sessionId;
+        if ((type == SIR_MAC_MGMT_FRAME) &&
+                (subType == SIR_MAC_MGMT_ACTION) &&
+                (buf[WLAN_HDD_PUBLIC_ACTION_FRAME_OFFSET] == WLAN_HDD_PUBLIC_ACTION_FRAME))
         {
-            if ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode )
+            actionFrmType = buf[WLAN_HDD_PUBLIC_ACTION_FRAME_TYPE_OFFSET];
+            hddLog(LOG1, "Tx Action Frame %u \n", actionFrmType);
+            if (actionFrmType == WLAN_HDD_PROV_DIS_REQ)
             {
-                sessionId = pAdapter->p2pSessionId;
-                vos_mem_copy((void*) (&buf[10]), 
-                             (void*) (&pHddCtx->p2pDeviceAddress.bytes[0]),
-                                     sizeof(tSirMacAddr));
+                cfgState->actionFrmState = HDD_PD_REQ_ACK_PENDING;
+                hddLog(LOG1, "%s: HDD_PD_REQ_ACK_PENDING \n", __func__);
+            }
+            else if (actionFrmType == WLAN_HDD_GO_NEG_REQ)
+            {
+                cfgState->actionFrmState = HDD_GO_NEG_REQ_ACK_PENDING;
+                hddLog(LOG1, "%s: HDD_GO_NEG_REQ_ACK_PENDING \n", __func__);
             }
         }
+
         if (eHAL_STATUS_SUCCESS !=
                sme_sendAction( WLAN_HDD_GET_HAL_CTX(pAdapter),
-                               sessionId, buf, len) )
+                               sessionId, buf, len, extendedWait, noack))
         {
             VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
                      "%s: sme_sendAction returned fail", __func__);
@@ -582,7 +592,7 @@
      {
         if( VOS_STATUS_SUCCESS !=
              WLANSAP_SendAction( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
-                                  buf, len ) )
+                                  buf, len, 0 ) )
         {
             VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
                     "%s: WLANSAP_SendAction returned fail", __func__);
@@ -592,7 +602,10 @@
 
     return 0;
 err:
-    hdd_sendActionCnf( pAdapter, FALSE );
+    if(!noack)
+    {
+       hdd_sendActionCnf( pAdapter, FALSE );
+    }
     return 0;
 err_rem_channel:
     *cookie = (tANI_U32)cfgState;
@@ -613,10 +626,11 @@
 {
     hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
 
+    cfgState->actionFrmState = HDD_IDLE;
+
     hddLog( LOG1, "Send Action cnf, actionSendSuccess %d", actionSendSuccess);
     if( NULL == cfgState->buf )
     {
-        VOS_ASSERT( cfgState->buf );
         return;
     }
 
@@ -988,7 +1002,9 @@
     int needed_headroom = 0;
     int flag = HDD_RX_FLAG_IV_STRIPPED | HDD_RX_FLAG_DECRYPTED |
                HDD_RX_FLAG_MMIC_STRIPPED;
-
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+    hdd_context_t* pHddCtx = (hdd_context_t*)(pMonAdapter->pHddCtx);
+#endif
     hddLog( LOG1, FL("Indicate Frame over Monitor Intf"));
 
     VOS_ASSERT( (pbFrames != NULL) );
@@ -1031,6 +1047,9 @@
      skb->dev = pMonAdapter->dev;
      skb->protocol = eth_type_trans( skb, skb->dev );
      skb->ip_summed = CHECKSUM_UNNECESSARY;
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+     wake_lock_timeout(&pHddCtx->rx_wake_lock, HDD_WAKE_LOCK_DURATION);
+#endif
      rxstat = netif_rx_ni(skb);
      if( NET_RX_SUCCESS == rxstat )
      {
@@ -1049,6 +1068,10 @@
                             tANI_U32 rxChan )
 {
     tANI_U16 freq;
+    tANI_U8 type = 0;
+    tANI_U8 subType = 0; 
+    tActionFrmType actionFrmType;
+    hdd_cfg80211_state_t *cfgState = NULL;
 
     hddLog(VOS_TRACE_LEVEL_INFO, "%s: Frame Type = %d Frame Length = %d\n",
             __func__, frameType, nFrameLength);
@@ -1106,6 +1129,27 @@
                 IEEE80211_BAND_5GHZ);
     }
 
+    type = WLAN_HDD_GET_TYPE_FRM_FC(pbFrames[0]);
+    subType = WLAN_HDD_GET_SUBTYPE_FRM_FC(pbFrames[0]);
+    cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
+    
+    if ((type == SIR_MAC_MGMT_FRAME) && 
+            (subType == SIR_MAC_MGMT_ACTION) &&
+            (pbFrames[WLAN_HDD_PUBLIC_ACTION_FRAME_OFFSET] == WLAN_HDD_PUBLIC_ACTION_FRAME))
+    {
+        actionFrmType = pbFrames[WLAN_HDD_PUBLIC_ACTION_FRAME_TYPE_OFFSET];
+        hddLog(LOG1, "Rx Action Frame %u \n", actionFrmType);
+        if (((actionFrmType == WLAN_HDD_PROV_DIS_RESP) &&
+                    (cfgState->actionFrmState == HDD_PD_REQ_ACK_PENDING)) ||
+                ((actionFrmType == WLAN_HDD_GO_NEG_RESP) &&
+                 (cfgState->actionFrmState == HDD_GO_NEG_REQ_ACK_PENDING)))
+        {
+            hddLog(LOG1, "%s: ACK_PENDING and But received RESP for Action frame ", 
+                    __func__);
+            hdd_sendActionCnf(pAdapter, TRUE);
+        }
+    }
+
     //Indicate Frame Over Normal Interface
     hddLog( LOG1, FL("Indicate Frame over NL80211 Interface"));
 
@@ -1166,6 +1210,9 @@
     struct ieee80211_radiotap_header *rthdr;
     unsigned char *pos;
     struct sk_buff *skb = cfgState->skb;
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+    hdd_context_t *pHddCtx = (hdd_context_t*)(pAdapter->pHddCtx);
+#endif
 
     /* 2 Byte for TX flags and 1 Byte for Retry count */
     u32 rtHdrLen = sizeof(*rthdr) + 3;
@@ -1225,6 +1272,9 @@
     skb->pkt_type  = PACKET_OTHERHOST;
     skb->protocol  = htons(ETH_P_802_2);
     memset( skb->cb, 0, sizeof( skb->cb ) );
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+    wake_lock_timeout(&pHddCtx->rx_wake_lock, HDD_WAKE_LOCK_DURATION);
+#endif
     if (in_interrupt())
         netif_rx( skb );
     else
diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
index 4ba1d4a..b218471 100644
--- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
@@ -1220,6 +1220,9 @@
 
          skb->protocol = eth_type_trans(skb, skb->dev);
          skb->ip_summed = CHECKSUM_UNNECESSARY;
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+         wake_lock_timeout(&pHddCtx->rx_wake_lock, HDD_WAKE_LOCK_DURATION);
+#endif
          rxstat = netif_rx_ni(skb);
          if (NET_RX_SUCCESS == rxstat)
          {
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index 9b5c6ec..e8ecc88 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -319,7 +319,7 @@
 
    if (VOS_STATUS_SUCCESS != 
       WLANSAP_SendAction( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
-                           skb->data, skb->len) )
+                           skb->data, skb->len, 0) )
    {
       VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
           "%s: WLANSAP_SendAction returned fail", __func__);
@@ -1316,13 +1316,23 @@
          VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: Failure extracting skb from vos pkt", __FUNCTION__);
          return VOS_STATUS_E_FAILURE;
       }
-   
+
+      if (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)
+      {
+         VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
+           "Magic cookie(%x) for adapter sanity verification is invalid", pAdapter->magic);
+         return eHAL_STATUS_FAILURE;
+      }
+
       skb->dev = pAdapter->dev;
       skb->protocol = eth_type_trans(skb, skb->dev);
       skb->ip_summed = CHECKSUM_UNNECESSARY;
       ++pAdapter->hdd_stats.hddTxRxStats.rxPackets;
       ++pAdapter->stats.rx_packets;
       pAdapter->stats.rx_bytes += skb->len;
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+      wake_lock_timeout(&pHddCtx->rx_wake_lock, HDD_WAKE_LOCK_DURATION);
+#endif
       rxstat = netif_rx_ni(skb);
       if (NET_RX_SUCCESS == rxstat)
       {
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 2624093..3041f23 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -100,6 +100,9 @@
 extern void hdd_resume_wlan(struct early_suspend *wlan_suspend);
 #endif
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+#define MAX_OEM_DATA_RSP_LEN 1024
+#endif
 
 #define HDD_FINISH_ULA_TIME_OUT    800
 
@@ -182,6 +185,9 @@
 #define WE_GET_CFG           3
 #define WE_GET_WMM_STATUS    4
 #define WE_GET_CHANNEL_LIST  5
+#ifdef WLAN_FEATURE_11AC
+#define WE_GET_RSSI          6
+#endif
 
 /* Private ioctls and their sub-ioctls */
 #define WLAN_PRIV_SET_NONE_GET_NONE   (SIOCIWFIRSTPRIV + 6)
@@ -219,6 +225,11 @@
 #define WAPI_CERT_AKM_SUITE 0x01721400
 #endif
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/* Private ioctls for setting the measurement configuration */
+#define WLAN_PRIV_SET_OEM_DATA_REQ (SIOCIWFIRSTPRIV + 17)
+#define WLAN_PRIV_GET_OEM_DATA_RSP (SIOCIWFIRSTPRIV + 19)
+#endif
 
 #ifdef WLAN_FEATURE_VOWIFI_11R
 #define WLAN_PRIV_SET_FTIES             (SIOCIWFIRSTPRIV + 20)
@@ -267,6 +278,13 @@
 #define WLAN_STATS_RX_RATE            14
 #define WLAN_STATS_TX_RATE            15
 
+#define WLAN_STATS_RX_UC_BYTE_CNT     16
+#define WLAN_STATS_RX_MC_BYTE_CNT     17
+#define WLAN_STATS_RX_BC_BYTE_CNT     18
+#define WLAN_STATS_TX_UC_BYTE_CNT     19
+#define WLAN_STATS_TX_MC_BYTE_CNT     20
+#define WLAN_STATS_TX_BC_BYTE_CNT     21
+
 #define FILL_TLV(__p, __type, __size, __val, __tlen) \
 {\
     if ((__tlen + __size + 2) < WE_MAX_STR_LEN) \
@@ -295,8 +313,9 @@
 #define WLAN_HDD_UI_SET_BAND_VALUE_OFFSET         8
 
 #ifdef WLAN_FEATURE_PACKET_FILTERING
-int wlan_hdd_set_filter(hdd_context_t *pHddCtx, tpPacketFilterCfg pRequest);
-void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set);
+int wlan_hdd_set_filter(hdd_context_t *pHddCtx, tpPacketFilterCfg pRequest, 
+                           v_U8_t sessionId);
+void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set, v_U8_t sessionId);
 #endif
 
 #ifdef FEATURE_WLAN_NON_INTEGRATED_SOC
@@ -408,13 +427,21 @@
 
 int hdd_wlan_get_freq(v_U32_t channel, v_U32_t *pfreq)
 {
-     if((channel > 0) && (channel <= (FREQ_CHAN_MAP_TABLE_SIZE - 1)))
-     {
-       *pfreq = freq_chan_map[channel - 1].freq * 100000;
-       return 0;
-     }
-     else
-       return -EINVAL;
+    int i;
+    if (channel > 0)
+    {
+        for (i=0; i < FREQ_CHAN_MAP_TABLE_SIZE; i++)
+        {
+            if (channel == freq_chan_map[i].chan)
+            {
+                *pfreq = freq_chan_map[i].freq;
+                return 1;
+            }
+        }
+    }
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+                               ("Invalid channel no=%d!!\n"), channel);
+    return -EINVAL;
 }
 
 static v_BOOL_t
@@ -1076,7 +1103,7 @@
 static int iw_get_freq(struct net_device *dev, struct iw_request_info *info,
              struct iw_freq *fwrq, char *extra)
 {
-   v_U32_t status = 0,channel,freq = 0;
+   v_U32_t status = FALSE, channel = 0, freq = 0;
    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
    tHalHandle hHal;
    hdd_wext_state_t *pWextState;
@@ -1103,18 +1130,31 @@
        }
        else
        {
-          fwrq->m = channel;
-          fwrq->e = 0;
+           status = hdd_wlan_get_freq(channel, &freq);
+           if( TRUE == status )
+           {
+               /* Set Exponent parameter as 6 (MHZ) in struct iw_freq
+                * iwlist & iwconfig command shows frequency into proper
+                * format (2.412 GHz instead of 246.2 MHz)*/
+               fwrq->m = freq;
+               fwrq->e = MHZ;
+           }
        }
     }
     else
     {
        channel = pHddStaCtx->conn_info.operationChannel;
-       status = hdd_wlan_get_freq(channel,&freq);
-       fwrq->m = freq;
-       fwrq->e = 0;
+       status = hdd_wlan_get_freq(channel, &freq);
+       if( TRUE == status )
+       {
+          /* Set Exponent parameter as 6 (MHZ) in struct iw_freq
+           * iwlist & iwconfig command shows frequency into proper
+           * format (2.412 GHz instead of 246.2 MHz)*/
+           fwrq->m = freq;
+           fwrq->e = MHZ;
+       }
     }
-   return status;
+   return 0;
 }
 
 static int iw_get_tx_power(struct net_device *dev,
@@ -3760,7 +3800,17 @@
             wrqu->data.length = strlen(extra)+1;
             break;
         }
-
+#ifdef WLAN_FEATURE_11AC
+        case WE_GET_RSSI:
+        {
+            v_S7_t s7Rssi = 0;
+            wlan_hdd_get_rssi(pAdapter, &s7Rssi);
+            snprintf(extra, WE_MAX_STR_LEN, "rssi=%d",s7Rssi);
+            wrqu->data.length = strlen(extra)+1;
+            break;
+        }
+#endif
+           
         case WE_GET_WMM_STATUS:
         {
             snprintf(extra, WE_MAX_STR_LEN,
@@ -3786,6 +3836,7 @@
                     pAdapter->hddWmmStatus.wmmAcStatus[WLANTL_AC_BK].wmmAcAccessAllowed?"YES":"NO",
                     pAdapter->hddWmmStatus.wmmAcStatus[WLANTL_AC_BK].wmmAcTspecInfo.ts_info.direction);
 
+
             wrqu->data.length = strlen(extra)+1;
             break;
         }
@@ -4565,7 +4616,8 @@
        exactly the same.  Otherwise, each piece of information would have to be
        copied individually. */
     memcpy(&offloadRequest, pRequest, wrqu->data.length);
-    if (eHAL_STATUS_SUCCESS != sme_SetHostOffload(WLAN_HDD_GET_HAL_CTX(pAdapter), &offloadRequest))
+    if (eHAL_STATUS_SUCCESS != sme_SetHostOffload(WLAN_HDD_GET_HAL_CTX(pAdapter),
+                                        pAdapter->sessionId, &offloadRequest))
     {
         hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Failure to execute host offload request\n",
                __func__);
@@ -4628,7 +4680,8 @@
 
        hddLog(VOS_TRACE_LEVEL_ERROR, "set Keep: TP before SME %d\n", keepaliveRequest.timePeriod);
 
-    if (eHAL_STATUS_SUCCESS != sme_SetKeepAlive(WLAN_HDD_GET_HAL_CTX(pAdapter), &keepaliveRequest))
+    if (eHAL_STATUS_SUCCESS != sme_SetKeepAlive(WLAN_HDD_GET_HAL_CTX(pAdapter), 
+                                        pAdapter->sessionId, &keepaliveRequest))
     {
         hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Failure to execute Keep Alive\n",
                __func__);
@@ -4639,7 +4692,8 @@
 }
 
 #ifdef WLAN_FEATURE_PACKET_FILTERING
-int wlan_hdd_set_filter(hdd_context_t *pHddCtx, tpPacketFilterCfg pRequest)
+int wlan_hdd_set_filter(hdd_context_t *pHddCtx, tpPacketFilterCfg pRequest, 
+                            tANI_U8 sessionId)
 {
     tSirRcvPktFilterCfgType    packetFilterSetReq;
     tSirRcvFltPktClearParam    packetFilterClrReq;
@@ -4703,7 +4757,7 @@
                         pRequest->paramsData[i].dataMask[4], pRequest->paramsData[i].dataMask[5]);
             }
 
-            if (eHAL_STATUS_SUCCESS != sme_ReceiveFilterSetFilter(pHddCtx, &packetFilterSetReq))
+            if (eHAL_STATUS_SUCCESS != sme_ReceiveFilterSetFilter(pHddCtx, &packetFilterSetReq, sessionId))
             {
                 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Failure to execute Set Filter\n",
                         __func__);
@@ -4717,7 +4771,7 @@
             hddLog(VOS_TRACE_LEVEL_INFO_HIGH, "%s: Clear Packet Filter Request for Id: %d\n",
                     __FUNCTION__, pRequest->filterId);
             packetFilterClrReq.filterId = pRequest->filterId;
-            if (eHAL_STATUS_SUCCESS != sme_ReceiveFilterClearFilter(pHddCtx, &packetFilterClrReq))
+            if (eHAL_STATUS_SUCCESS != sme_ReceiveFilterClearFilter(pHddCtx, &packetFilterClrReq, sessionId))
             {
                 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Failure to execute Clear Filter\n",
                         __func__);
@@ -4733,7 +4787,7 @@
     return 0;
 }
 
-void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set)
+void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set, v_U8_t sessionId)
 {
     v_U8_t filterAction = 0; 
     tPacketFilterCfg request = {0}; 
@@ -4768,7 +4822,7 @@
                     request.paramsData[0].compareData[4], 
                     request.paramsData[0].compareData[5]);
         }
-        wlan_hdd_set_filter(pHddCtx, &request);
+        wlan_hdd_set_filter(pHddCtx, &request, sessionId);
     }
     pHddCtx->mc_addr_list.isFilterApplied = set ? TRUE : FALSE;
 }
@@ -4778,7 +4832,7 @@
 {   
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
     tpPacketFilterCfg pRequest = (tpPacketFilterCfg)wrqu->data.pointer;
-    return wlan_hdd_set_filter(WLAN_HDD_GET_CTX(pAdapter), pRequest);
+    return wlan_hdd_set_filter(WLAN_HDD_GET_CTX(pAdapter), pRequest, pAdapter->sessionId);
 }
 #endif
 static int iw_get_statistics(struct net_device *dev,
@@ -4904,9 +4958,9 @@
               (char*) &(pStats->rx_error_cnt),
               tlen);
 
-    FILL_TLV(p, (tANI_U8)WLAN_STATS_TX_BYTE_CNT,
-              (tANI_U8) sizeof (pStats->tx_byte_cnt),
-              (char*) &(pStats->tx_byte_cnt),
+    FILL_TLV(p, (tANI_U8)WLAN_STATS_TX_BYTE_CNT, 
+              (tANI_U8) sizeof (dStats->tx_uc_byte_cnt[0]),
+              (char*) &(dStats->tx_uc_byte_cnt[0]), 
               tlen);
 
     FILL_TLV(p, (tANI_U8)WLAN_STATS_RX_BYTE_CNT,
@@ -4925,6 +4979,31 @@
               (char*) &(aStats->tx_rate),
               tlen);
 
+    FILL_TLV(p, (tANI_U8)WLAN_STATS_RX_UC_BYTE_CNT, 
+              (tANI_U8) sizeof (dStats->rx_uc_byte_cnt[0]), 
+              (char*) &(dStats->rx_uc_byte_cnt[0]), 
+              tlen);
+    FILL_TLV(p, (tANI_U8)WLAN_STATS_RX_MC_BYTE_CNT, 
+              (tANI_U8) sizeof (dStats->rx_mc_byte_cnt), 
+              (char*) &(dStats->rx_mc_byte_cnt), 
+              tlen);
+    FILL_TLV(p, (tANI_U8)WLAN_STATS_RX_BC_BYTE_CNT, 
+              (tANI_U8) sizeof (dStats->rx_bc_byte_cnt), 
+              (char*) &(dStats->rx_bc_byte_cnt), 
+              tlen);
+    FILL_TLV(p, (tANI_U8)WLAN_STATS_TX_UC_BYTE_CNT, 
+              (tANI_U8) sizeof (dStats->tx_uc_byte_cnt[0]), 
+              (char*) &(dStats->tx_uc_byte_cnt[0]), 
+              tlen);
+    FILL_TLV(p, (tANI_U8)WLAN_STATS_TX_MC_BYTE_CNT, 
+              (tANI_U8) sizeof (dStats->tx_mc_byte_cnt), 
+              (char*) &(dStats->tx_mc_byte_cnt), 
+              tlen);
+    FILL_TLV(p, (tANI_U8)WLAN_STATS_TX_BC_BYTE_CNT, 
+              (tANI_U8) sizeof (dStats->tx_bc_byte_cnt), 
+              (char*) &(dStats->tx_bc_byte_cnt), 
+              tlen);
+
     wrqu->data.length = tlen;
 
   }
@@ -5491,7 +5570,16 @@
     }
 
     uTotalSize -= nOffset;
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, 
+              "Power request parameter %d Total size", 
+              uTotalSize);
     ptr += nOffset;
+    /* This is added for dynamic Tele LI enable (0xF1) /disable (0xF0)*/
+    if(!(uTotalSize - nOffset) && 
+       (powerRequest.uListenInterval != SIR_NOCHANGE_POWER_VALUE))
+    {
+        uTotalSize = 0;
+    }
 
   }/*Go for as long as we have a valid string*/
 
@@ -5582,6 +5670,10 @@
    [WLAN_PRIV_ADD_TSPEC             - SIOCIWFIRSTPRIV]   = iw_add_tspec,
    [WLAN_PRIV_DEL_TSPEC             - SIOCIWFIRSTPRIV]   = iw_del_tspec,
    [WLAN_PRIV_GET_TSPEC             - SIOCIWFIRSTPRIV]   = iw_get_tspec,
+#ifdef FEATURE_OEM_DATA_SUPPORT
+   [WLAN_PRIV_SET_OEM_DATA_REQ - SIOCIWFIRSTPRIV] = iw_set_oem_data_req, //oem data req Specifc
+   [WLAN_PRIV_GET_OEM_DATA_RSP - SIOCIWFIRSTPRIV] = iw_get_oem_data_rsp, //oem data req Specifc
+#endif
 
 #ifdef FEATURE_WLAN_WAPI
    [WLAN_PRIV_SET_WAPI_MODE             - SIOCIWFIRSTPRIV]  = iw_qcom_set_wapi_mode,
@@ -5801,6 +5893,12 @@
         0,
         IW_PRIV_TYPE_CHAR| WE_MAX_STR_LEN,
         "getConfig" },
+#ifdef WLAN_FEATURE_11AC
+    {   WE_GET_RSSI,
+        0,
+        IW_PRIV_TYPE_CHAR| WE_MAX_STR_LEN,
+        "getRSSI" },
+#endif
     {   WE_GET_WMM_STATUS,
         0,
         IW_PRIV_TYPE_CHAR| WE_MAX_STR_LEN,
@@ -5869,6 +5967,21 @@
         IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
         "getTspec" },
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+    /* handlers for main ioctl - OEM DATA */
+    {
+        WLAN_PRIV_SET_OEM_DATA_REQ,
+        IW_PRIV_TYPE_BYTE | sizeof(struct iw_oem_data_req) | IW_PRIV_SIZE_FIXED,
+        0,
+        "set_oem_data_req" },
+
+    /* handlers for main ioctl - OEM DATA */
+    {
+        WLAN_PRIV_GET_OEM_DATA_RSP,
+        0,
+        IW_PRIV_TYPE_BYTE | MAX_OEM_DATA_RSP_LEN,
+        "get_oem_data_rsp" },
+#endif
 
 #ifdef FEATURE_WLAN_WAPI
    /* handlers for main ioctl SET_WAPI_MODE */
diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h
index 880a6bf..7e55f06 100644
--- a/CORE/MAC/inc/aniGlobal.h
+++ b/CORE/MAC/inc/aniGlobal.h
@@ -82,6 +82,9 @@
 #include "btcApi.h"
 #include "csrInternal.h"
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+#include "oemDataInternal.h" 
+#endif
 
 #if defined WLAN_FEATURE_VOWIFI
 #include "smeRrmInternal.h"
@@ -342,6 +345,7 @@
 #ifdef WLAN_FEATURE_P2P
     // This variable store the total duration to do scan
     tANI_U32 gTotalScanDuration;
+    tANI_U32 p2pRemOnChanTimeStamp;
 #endif    
 
     // abort scan is used to abort an on-going scan
@@ -544,9 +548,9 @@
     tANI_U8    fScanDisabled;
     //Can be set to invalid channel. If it is invalid, HAL
     //should move to previous valid channel or stay in the
-    //current channel.
-    tANI_U16   gResumeChannel;
-    //TODO - Add CB state here.
+    //current channel. CB state goes along with channel to resume to
+    tANI_U16    gResumeChannel;
+    ePhyChanBondState    gResumePhyCbState;
 #endif // GEN4_SCAN
 
     // Change channel generic scheme
@@ -579,7 +583,7 @@
     tANI_U32           propRateAdjustPeriod;
     tANI_U32           scanStartTime;    // used to measure scan time
 
-    tANI_U8            gLimBssid[6];
+    //tANI_U8            gLimBssid[6];
     tANI_U8            gLimMyMacAddr[6];
     tANI_U8            ackPolicy;
 
@@ -704,7 +708,7 @@
 
     // Place holder for Join request that we're
     // currently attempting
-    tLimMlmJoinReq       *gpLimMlmJoinReq;
+    //tLimMlmJoinReq       *gpLimMlmJoinReq;
 
     // Reason code to determine the channel change context while sending 
     // WDA_CHNL_SWITCH_REQ message to HAL       
@@ -737,27 +741,6 @@
     //////////////////////////////////////////     ASSOC RELATED END ///////////////////////////////////////////
 
 
-    // 11h Spectrum Management Related Flag
-    tANI_U32           gLim11hEnable;
-    tLimSpecMgmtInfo   gLimSpecMgmt;
-    // CB Primary/Secondary Channel Switch Info
-    tLimChannelSwitchInfo  gLimChannelSwitch;
-
-
-    // Channel Bonding mode, as configured by SME
-    tANI_U8 gCbMode;
-
-    //
-    // Identifies the runtime OPERATIONAL state of Channel
-    // Bonding. This info is encoded as a bitmap, as
-    // configured via gCbMode.
-    //
-    //  b7  b6  b5  b4  b3  b2  b1  b0
-    // --------------------------------
-    // | X | X | X | AU|CS|U/D| O | A |
-    // --------------------------------
-    //
-    tANI_U8 gCbState;
 
     //
     // For DEBUG purposes
@@ -768,24 +751,6 @@
     // Holds the desired tSirScanType, as requested by SME
     tSirScanType gLimScanOverrideSaved;
 
-    // Override with this Phy CB state always
-    //ePhyChanBondState gLimPhyCBState;
-
-    // When operating with -
-    // a) Channel Bonding mode (as configured by SME) AND
-    // b) CB State protection turned ON
-    // this object will save the CB state as desired by SME
-    //
-    // This object mimics the bitmap encoding of the
-    // gCbState object, as follows:
-    //
-    //  b7  b6  b5  b4  b3  b2  b1  b0
-    // --------------------------------
-    // | X | X | X | AU|CS|U/D| O | A |
-    // --------------------------------
-    //
-    tANI_U8 gCbStateProtected;
-
     //
     // CB State protection, operated upon as follows:
     // 1 - CB is enabled in the hardware ONLY WHEN a Titan
@@ -822,10 +787,6 @@
 
     tANI_U8 gHTGreenfield;
 
-    //0-20Mhz
-    //1-40Mhz
-    tANI_U8 gHTSupportedChannelWidthSet;
-
     tANI_U8 gHTShortGI40Mhz;
     tANI_U8 gHTShortGI20Mhz;
 
@@ -886,15 +847,6 @@
     tANI_U8 gHTRifsMode;
    // OBss Mode . set when we have Non HT STA is associated or with in overlap bss
     tANI_U8  gHTObssMode;
-    //
-    // Recommended Tx Width Set
-    // 0 - use 20 MHz channel (control channel)
-    // 1 - use channel width enabled under Supported Channel Width Set
-    //
-    tANI_U8 gHTRecommendedTxWidthSet;
-
-    // Identifies the 40 MHz extension channel
-    tSirMacHTSecondaryChannelOffset gHTSecondaryChannelOffset;
 
     // Identifies the current Operating Mode
     tSirMacHTOperatingMode gHTOperMode;
@@ -946,12 +898,21 @@
     tANI_U8   gSmeSessionId;
     tANI_U16 gTransactionId;
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+tLimMlmOemDataReq       *gpLimMlmOemDataReq;
+tLimMlmOemDataRsp       *gpLimMlmOemDataRsp;
+#endif
 
 #ifdef WLAN_FEATURE_P2P
     tSirRemainOnChnReq  *gpLimRemainOnChanReq; //hold remain on chan request in this buf
     vos_list_t  gLimMgmtFrameRegistratinQueue;
     tANI_U32    actionFrameSessionId;
 #endif
+#ifdef WLAN_FEATURE_11AC
+    tANI_U8    vhtCapabilityPresentInBeacon;
+    tANI_U8    apCenterChan;
+    tANI_U8    apChanWidth;
+#endif
 } tAniSirLim, *tpAniSirLim;
 
 #ifdef WLAN_FEATURE_P2P
@@ -1083,6 +1044,9 @@
     tCsrScanStruct scan;
     tCsrRoamStruct roam;
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+    tOemDataStruct oemData;
+#endif
 
 #ifdef ANI_PRODUCT_TYPE_CLIENT
     tPmcInfo     pmc;
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index ecfd822..2244955 100644
--- a/CORE/MAC/inc/qwlan_version.h
+++ b/CORE/MAC/inc/qwlan_version.h
@@ -23,7 +23,7 @@
 #define QWLAN_VERSION_H
 /*===========================================================================
 
-FILE: 
+FILE:
    qwlan_version.h
 
 BRIEF DESCRIPTION:
@@ -40,8 +40,8 @@
 #define QWLAN_VERSION_MINOR            2
 #define QWLAN_VERSION_PATCH            0
 #define QWLAN_VERSION_EXTRA            ""
-#define QWLAN_VERSION_BUILD            2
+#define QWLAN_VERSION_BUILD            9
 
-#define QWLAN_VERSIONSTR               "3.2.0.2"
+#define QWLAN_VERSIONSTR               "3.2.0.9"
 
 #endif /* QWLAN_VERSION_H */
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 8402917..1723072 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -36,6 +36,7 @@
 #include "sirTypes.h"
 #include "sirMacProtDef.h"
 #include "aniSystemDefs.h"
+#include "sirParams.h"
 
 #ifdef FEATURE_WLAN_CCX
 #include "ccxGlobal.h"
@@ -293,6 +294,9 @@
     eSIR_SME_CHANNEL_SWITCH_DISABLED,    // either 11h is disabled or channelSwitch is currently active
     eSIR_SME_HAL_SEND_MESSAGE_FAIL,      // Failed to send a message to HAL
 #endif // GEN4_SCAN
+#ifdef FEATURE_OEM_DATA_SUPPORT
+    eSIR_SME_HAL_OEM_DATA_REQ_START_FAILED,
+#endif
     eSIR_SME_STOP_BSS_FAILURE,           // Failed to stop the bss
     eSIR_SME_STA_ASSOCIATED,
     eSIR_SME_INVALID_PMM_STATE,
@@ -320,22 +324,6 @@
     eSIR_DONOT_USE_RESULT_CODE = SIR_MAX_ENUM_SIZE    
 } tSirResultCodes;
 
-//
-// Enumerated constants to identify
-// 1) the operating state of Channel Bonding
-// 2) the secondary CB channel to be used
-//
-typedef enum eAniCBSecondaryMode
-{
-    eANI_CB_SECONDARY_NONE,
-    eANI_CB_SECONDARY_DOWN,
-    eANI_CB_SECONDARY_UP,
-    eANI_DONOT_USE_SECONDARY_MODE = SIR_MAX_ENUM_SIZE
-} tAniCBSecondaryMode;
-
-
-
-
 /* each station added has a rate mode which specifies the sta attributes */
 typedef enum eStaRateMode {
     eSTA_TAURUS = 0,
@@ -345,6 +333,9 @@
     eSTA_11bg,
     eSTA_11a,
     eSTA_11n,
+#ifdef WLAN_FEATURE_11AC
+    eSTA_11ac,
+#endif
     eSTA_INVALID_RATE_MODE
 } tStaRateMode, *tpStaRateMode;
 
@@ -393,6 +384,18 @@
      */
     tANI_U16 rxHighestDataRate;
 
+#ifdef WLAN_FEATURE_11AC
+   /*Indicates the Maximum MCS that can be received for each number
+        of spacial streams */
+    tANI_U16 vhtRxMCSMap;
+   /*Indicate the highest VHT data rate that the STA is able to receive*/
+    tANI_U16 vhtRxHighestDataRate;
+   /*Indicates the Maximum MCS that can be transmitted	for each number
+        of spacial streams */
+    tANI_U16 vhtTxMCSMap;
+   /*Indicate the highest VHT data rate that the STA is able to transmit*/
+    tANI_U16 vhtTxHighestDataRate;
+#endif
 } tSirSupportedRates, *tpSirSupportedRates;
 
 
@@ -443,47 +446,6 @@
 #endif
 
 //
-// A bit-encoding, identifying the new TITAN capabilities
-// and state information. The capabilities being exposed
-// are -
-// Concatenation
-// Compression
-//FIXME_CBMODE: need to seperate out HT and TITAN CB mode fields.
-// Channel Bonding - Only this filed is used for HT also. 
-// Reverse FCS
-//
-// The bitfield encoding is as follows -
-//
-//  b7  b6   b5   b4   b3   b2   b1   b0
-// --------------------------------------
-// | X | X |CB/O|CB/O|CB/A|RFCS| CP | CC |
-// --------------------------------------
-// where,
-// CC   - Concatenation: 1 - ON, 0 - OFF
-// CP   - Compression: 1 - ON, 0 - OFF
-// RFCS - Reverse FCS Support: 1 - ON, 0 - OFF
-// CB/A - Channel Bonding "Admin" state: 1 - ON, 0 - OFF
-// CB/O - Channel Bonding "Oper" state:
-//        00 - CB Oper state OFF
-//        01 - CB Secondary channel DOWN
-//        10 - CB Secondary channel UP
-//        11 - Reserved
-// X    - Don't care
-//
-// This enumerated data type is used for IPC between the
-// LIM and SME (WSM/HDD) for the following northbound
-// interfaces -
-// LIM -> WSM
-// tSirNeighborBssInfo,
-// tSirSmeAssocInd,
-// tSirSmeReassocInd
-//
-// LIM -> HDD/Roaming
-// tSirBssDescription
-//
-typedef tANI_U8 tAniTitanHtCapabilityInfo;
-
-//
 // Identifies the neighbor BSS' that was(were) detected
 // by an STA and reported to the AP
 //
@@ -500,45 +462,6 @@
 
 } tAniTitanCBNeighborInfo, *tpAniTitanCBNeighborInfo;
 
-//
-// MACRO's to extract info from tAniTitanHtCapabilityInfo
-//
-#define SME_GET_CONCAT_STATE(titanHtCaps) \
-        (titanHtCaps & 0x01)
-#define SME_SET_CONCAT_STATE(titanHtCaps,state) \
-        (((state) == eHAL_CLEAR)? \
-          ((titanHtCaps) = (titanHtCaps) & (0x3E)): \
-          ((titanHtCaps) = (titanHtCaps) | (0x01)))
-
-#define SME_GET_COMPRESSION_STATE(titanHtCaps) \
-        ((titanHtCaps & 0x02) >> 1)
-#define SME_SET_COMPRESSION_STATE(titanHtCaps,state) \
-        (((state) == eHAL_CLEAR)? \
-          ((titanHtCaps) = (titanHtCaps) & (0x3D)): \
-          ((titanHtCaps) = (titanHtCaps) | (0x02)))
-
-#define SME_GET_RFCS_STATE(titanHtCaps) \
-        ((titanHtCaps & 0x04) >> 2)
-#define SME_SET_RFCS_STATE(titanHtCaps,state) \
-        (((state) == eHAL_CLEAR)? \
-          ((titanHtCaps) = (titanHtCaps) & (0x3B)): \
-          ((titanHtCaps) = (titanHtCaps) | (0x04)))
-
-#define SME_GET_CB_ADMIN_STATE(titanHtCaps) \
-        ((titanHtCaps & 0x08) >> 3)
-#define SME_SET_CB_ADMIN_STATE(titanHtCaps,state) \
-        (((state) == eHAL_CLEAR)? \
-          ((titanHtCaps) = (titanHtCaps) & (0x37)): \
-          ((titanHtCaps) = (titanHtCaps) | (0x08)))
-
-// NOTE - The value returned by this MACRO, SME_GET_CB_OPER_STATE,
-// can be used along with the enumerated type,
-// tAniCBSecondaryMode, to identify the Admin/Oper state of CB
-#define SME_GET_CB_OPER_STATE(titanHtCaps) \
-        ((titanHtCaps & 0x30) >> 4)
-#define SME_SET_CB_OPER_STATE(titanHtCaps,state) \
-        ((titanHtCaps) = (tANI_U8)(((titanHtCaps) & (0x0F)) | ((state) << 4)))
-
 /// Generic type for sending a response message
 /// with result code to host software
 typedef struct sSirSmeRsp
@@ -642,6 +565,9 @@
     eSIR_11B_NW_TYPE,
     eSIR_11G_NW_TYPE,
     eSIR_11N_NW_TYPE,
+#ifdef WLAN_FEATURE_11AC
+    eSIR_11AC_NW_TYPE,
+#endif
     eSIR_DONOT_USE_NW_TYPE = SIR_MAX_ENUM_SIZE
 } tSirNwType;
 
@@ -695,7 +621,7 @@
     tSirBssType             bssType;
     tSirMacSSid             ssId;
     tANI_U8                 channelId;
-    tAniCBSecondaryMode     cbMode;
+    ePhyChanBondState       cbMode;
 #if (WNI_POLARIS_FW_PACKAGE == ADVANCED) && (WNI_POLARIS_FW_PRODUCT == AP)
     tSirAlternateRadioList  alternateRadioList;
     tANI_S8                 powerLevel;
@@ -753,12 +679,6 @@
     //used only in scan case.
     tANI_U8              channelIdSelf;
     tANI_U8              sSirBssDescriptionRsvd[3];
-    //
-    // FIXME - This structure is not packed!
-    // Thus, the fields should be aligned at DWORD boundaries
-    // Elsewhere, titanHtCaps is of type tAniTitanHtCapabilityInfo
-    //
-    tANI_U32             titanHtCaps;
     tANI_TIMESTAMP nReceivedTime;     //base on a tick count. It is a time stamp, not a relative time.
 #if defined WLAN_FEATURE_VOWIFI
     tANI_U32       parentTSF;
@@ -862,7 +782,6 @@
 {
     tSirMacAddr             bssId;
     tANI_U8                 channelId;
-    tAniTitanHtCapabilityInfo titanHtCaps;
     tAniBool                wniIndicator;
     tSirBssType             bssType;
     tANI_U8                 sinr;
@@ -1113,6 +1032,7 @@
  
 #ifdef WLAN_FEATURE_P2P
     tANI_BOOLEAN         p2pSearch;
+    tANI_BOOLEAN         skipDfsChnlInP2pSearch;
 #endif
     tANI_U16             uIEFieldLen;
     tANI_U16             uIEFieldOffset;
@@ -1138,6 +1058,30 @@
       -----------------------------*/
 } tSirSmeScanReq, *tpSirSmeScanReq;
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+#ifndef OEM_DATA_REQ_SIZE
+#define OEM_DATA_REQ_SIZE 70
+#endif
+#ifndef OEM_DATA_RSP_SIZE
+#define OEM_DATA_RSP_SIZE 968
+#endif
+
+typedef struct sSirOemDataReq
+{
+    tANI_U16              messageType; //eWNI_SME_OEM_DATA_REQ
+    tSirMacAddr           selfMacAddr;
+    tANI_U8               oemDataReq[OEM_DATA_REQ_SIZE];
+} tSirOemDataReq, *tpSirOemDataReq;
+
+typedef struct sSirOemDataRsp
+{
+    tANI_U16             messageType;
+    tANI_U16             length;
+    tANI_U8              oemDataRsp[OEM_DATA_RSP_SIZE];
+} tSirOemDataRsp, *tpSirOemDataRsp;
+    
+#endif //FEATURE_OEM_DATA_SUPPORT
 
 /// Definition for response message to previously issued scan request
 typedef struct sSirSmeScanRsp
@@ -1235,13 +1179,14 @@
 {
     tANI_U16            messageType;            // eWNI_SME_JOIN_REQ
     tANI_U16            length;
-    tANI_U8             sessionId;              
+    tANI_U8             sessionId;
     tANI_U16            transactionId;  
     tSirMacSSid         ssId;
     tSirMacAddr         selfMacAddr;            // self Mac address
     tSirBssType         bsstype;                // add new type for BT -AMP STA and AP Modules
     tANI_U8             dot11mode;              // to support BT-AMP     
-    tVOS_CON_MODE       staPersona;        //Persona
+    tVOS_CON_MODE       staPersona;             //Persona
+    ePhyChanBondState   cbMode;                 // Pass CB mode value in Join.
 
     /*This contains the UAPSD Flag for all 4 AC
      * B0: AC_VO UAPSD FLAG
@@ -1400,7 +1345,6 @@
     tANI_U16                  capabilityInfo; // STA capability
     tSirNwType           nwType;            // Indicates 11a/b/g
 #endif
-    tAniTitanHtCapabilityInfo titanHtCaps;
     // powerCap & supportedChannels are present only when
     // spectrumMgtIndicator flag is set
     tAniBool                spectrumMgtIndicator;
@@ -1449,7 +1393,8 @@
     tSirMacAddr         selfMacAddr;            // self Mac address
     tSirBssType         bsstype;                // add new type for BT -AMP STA and AP Modules
     tANI_U8             dot11mode;              // to support BT-AMP     
-    tVOS_CON_MODE       staPersona;        //Persona
+    tVOS_CON_MODE       staPersona;             //Persona
+    ePhyChanBondState   cbMode;                 // CBMode value to be passed with reassoc req
 
     /*This contains the UAPSD Flag for all 4 AC
      * B0: AC_VO UAPSD FLAG
@@ -1557,7 +1502,6 @@
     tANI_U16             capabilityInfo; // STA capability
     tSirNwType           nwType;            // Indicates 11a/b/g
 #endif
-    tAniTitanHtCapabilityInfo titanHtCaps;
     // powerCap & supportedChannels are present only when
     // spectrumMgtIndicator flag is set
     tAniBool                spectrumMgtIndicator;
@@ -2130,7 +2074,7 @@
     // In a non-CB environment, with 11H enabled,
     // this field will be ignored
     //
-    tAniCBSecondaryMode cbMode;
+    ePhyChanBondState    cbMode;
 
     // dtimFactor indicates the number of DTIM
     // Beacon before LIM switches channel
@@ -3796,6 +3740,7 @@
 #ifdef WLAN_NS_OFFLOAD
     tSirNsOffloadReq nsOffloadInfo;
 #endif //WLAN_NS_OFFLOAD
+    tANI_U8 bssIdx;
 } tSirHostOffloadReq, *tpSirHostOffloadReq;
 
 /* Packet Types. */
@@ -3814,7 +3759,7 @@
     tSirIpv4Addr    hostIpv4Addr; 
     tSirIpv4Addr    destIpv4Addr;
     tSirMacAddr     destMacAddr;
-
+    v_U8_t          bssIdx;
 } tSirKeepAliveReq, *tpSirKeepAliveReq;
 
 typedef struct sSirSmeAddStaSelfReq
@@ -4117,6 +4062,8 @@
   tANI_U32                        numFieldParams;
   tANI_U32                        coalesceTime;
   tSirRcvPktFilterFieldParams     paramsData[SIR_MAX_NUM_TESTS_PER_FILTER];
+  tSirMacAddr                     selfMacAddr;
+  tSirMacAddr                     bssId; //Bssid of the connected AP
 }tSirRcvPktFilterCfgType, *tpSirRcvPktFilterCfgType;
 
 //
@@ -4145,6 +4092,8 @@
 {
   tANI_U32   status;  /* only valid for response message */
   tANI_U8    filterId;
+  tSirMacAddr selfMacAddr;
+  tSirMacAddr bssId;
 }tSirRcvFltPktClearParam, *tpSirRcvFltPktClearParam;
 
 //
@@ -4154,6 +4103,8 @@
 {
   tANI_U32       ulMulticastAddrCnt;
   tSirMacAddr    multicastAddr[SIR_MAX_NUM_MULTICAST_ADDRESS];
+  tSirMacAddr    selfMacAddr;
+  tSirMacAddr    bssId;
 } tSirRcvFltMcAddrList, *tpSirRcvFltMcAddrList;
 #endif // WLAN_FEATURE_PACKET_FILTERING
 
diff --git a/CORE/MAC/inc/sirMacPropExts.h b/CORE/MAC/inc/sirMacPropExts.h
index c368e17..1b7deba 100644
--- a/CORE/MAC/inc/sirMacPropExts.h
+++ b/CORE/MAC/inc/sirMacPropExts.h
@@ -118,12 +118,23 @@
 #define IS_DOT11_MODE_HT(dot11Mode) \
         (((dot11Mode == WNI_CFG_DOT11_MODE_11N) || \
           (dot11Mode ==  WNI_CFG_DOT11_MODE_11N_ONLY) || \
+          (dot11Mode ==  WNI_CFG_DOT11_MODE_11AC) || \
+          (dot11Mode ==  WNI_CFG_DOT11_MODE_11AC_ONLY) || \
           (dot11Mode ==  WNI_CFG_DOT11_MODE_TAURUS) || \
           (dot11Mode ==  WNI_CFG_DOT11_MODE_ALL)) ? TRUE: FALSE)
 #else
 #define IS_DOT11_MODE_HT(dot11Mode) \
         (((dot11Mode == WNI_CFG_DOT11_MODE_11N) || \
           (dot11Mode ==  WNI_CFG_DOT11_MODE_TAURUS) || \
+          (dot11Mode ==  WNI_CFG_DOT11_MODE_11AC) || \
+          (dot11Mode ==  WNI_CFG_DOT11_MODE_ALL)) ? TRUE: FALSE)
+#endif
+
+#ifdef WLAN_FEATURE_11AC
+#define IS_DOT11_MODE_VHT(dot11Mode) \
+        (((dot11Mode == WNI_CFG_DOT11_MODE_11AC) || \
+          (dot11Mode ==  WNI_CFG_DOT11_MODE_11AC_ONLY) || \
+          (dot11Mode ==  WNI_CFG_DOT11_MODE_TAURUS) || \
           (dot11Mode ==  WNI_CFG_DOT11_MODE_ALL)) ? TRUE: FALSE)
 #endif
         /*
@@ -224,53 +235,6 @@
 #define GET_COMPRESSION_STATE(cpBitmap,tcid) \
         ((cpBitmap) & (tcid))
 
-// Get/Set state of Channel Bonding
-//
-// The CB bitfield encoding is -
-//
-//     b7    b6   b5  b4  b3  b2  b1  b0
-// --------------------------------------
-// |CCA_CB |CCA |ICE | AU|CS|U/D| O | A |
-// --------------------------------------
-//
-#define GET_CB_ADMIN_STATE(cbState)    (cbState & 0x01)
-#define GET_CB_OPER_STATE(cbState)     ((cbState & 0x02) >> 1)
-#define GET_CB_SEC_CHANNEL(cbState)    ((cbState & 0x04) >> 2)
-#define GET_CB_CS_IN_PROGRESS(cbState) ((cbState & 0x08) >> 3)
-#define GET_CB_CS_AUTO_UPDATE(cbState) ((cbState & 0x10) >> 4)
-#define GET_CB_ICE_STATE(cbState)      ((cbState & 0x20) >> 5)
-#define GET_CB_CCA_MODE(cbState)       ((cbState & 0x40) >> 6)
-#define GET_CB_CCA_CB_STATE(cbState)   ((cbState & 0x80) >> 7)
-
-#define SET_CB_STATE_DISABLE(cbState) \
-        ((cbState) = (0x00))
-#define SET_CB_STATE_ENABLE(cbState) \
-        ((cbState) = (0x03))
-#define SET_CB_AU_ENABLE(cbState) \
-        ((cbState) = ((cbState) | 0x10))
-#define SET_CB_AU_DISABLE(cbState) \
-        ((cbState) = ((cbState) & 0xEF))
-#define SET_CB_OPER_STATE(cbState,state) \
-        (((state) == eHAL_CLEAR)? \
-          ((cbState) = (cbState) & (0xfD)): \
-          ((cbState) = (cbState) | (0x02)))
-#define SET_CB_SEC_CHANNEL(cbState,state) \
-        (((state) == eHAL_CLEAR)? \
-          ((cbState) = (cbState) & (0xfB)): \
-          ((cbState) = (cbState) | (0x04)))
-#define SET_CB_ICE_DISABLE(cbState) \
-        ((cbState) = ((cbState) & 0xDF))
-#define SET_CB_ICE_ENABLE(cbState) \
-        ((cbState) = ((cbState) | 0x20))
-#define SET_CB_CCA_MODE_TWENTY(cbState) \
-        ((cbState) = ((cbState) & 0xBF))
-#define SET_CB_CCA_MODE_FOURTY(cbState) \
-        ((cbState) = ((cbState) | 0x40))
-#define SET_CB_CCA_CB_DISABLE(cbState) \
-        ((cbState) = ((cbState) & 0x7F))
-#define SET_CB_CCA_CB_ENABLE(cbState) \
-        ((cbState) = ((cbState) | 0x80))
-
 // Get/Set the state of Reverse FCS
 #define GET_RFCS_OPER_STATE(revFcsState) (revFcsState & 0x01)
 #define GET_RFCS_PATTERN_ID(revFcsState) ((revFcsState & 0x0E) >> 1)
diff --git a/CORE/MAC/inc/sirMacProtDef.h b/CORE/MAC/inc/sirMacProtDef.h
index 7f2f1d5..0b15872 100644
--- a/CORE/MAC/inc/sirMacProtDef.h
+++ b/CORE/MAC/inc/sirMacProtDef.h
@@ -367,6 +367,11 @@
 #define SIR_MAC_HT_INFO_EID_MIN    0
 #define SIR_MAC_HT_INFO_EID_MAX    255
 
+#ifdef WLAN_FEATURE_11AC
+#define SIR_MAC_VHT_CAPABILITIES_EID   191
+#define SIR_MAC_VHT_OPERATION_EID      192
+#define SIR_MAC_VHT_EXT_BSS_LOAD_EID   193
+#endif
 #define SIR_MAC_MAX_SUPPORTED_MCS_SET    16
 
 /// Workaround IE to change beacon length when it is 4*n+1
@@ -467,7 +472,7 @@
 
 
 // Length of Channel Switch related message
-#define SIR_SME_CHANNEL_SWITCH_SIZE        (sizeof(tANI_U8) + 2 *sizeof(tANI_U16) + sizeof(tANI_U32) + sizeof(tAniCBSecondaryMode))
+#define SIR_SME_CHANNEL_SWITCH_SIZE        (sizeof(tANI_U8) + 2 *sizeof(tANI_U16) + sizeof(tANI_U32) + sizeof(ePhyChanBondState))
 #define SIR_CHANNEL_SWITCH_IE_SIZE         EID_LEN(SIR_MAC_CHNL_SWITCH_ANN_EID_MIN)
 
 //Measurement Request/Report messages
@@ -1570,17 +1575,14 @@
 } tSirMacHTMIMOPowerSaveState;
 
 
-typedef enum eSirMacHTSecondaryChannelOffset
-{
-    eHT_SECONDARY_CHANNEL_OFFSET_NONE = 0,
-    eHT_SECONDARY_CHANNEL_OFFSET_UP = 1,
-    eHT_SECONDARY_CHANNEL_OFFSET_DOWN = 3
-} tSirMacHTSecondaryChannelOffset;
-
 typedef enum eSirMacHTChannelWidth
 {
     eHT_CHANNEL_WIDTH_20MHZ = 0,
-    eHT_CHANNEL_WIDTH_40MHZ = 1
+    eHT_CHANNEL_WIDTH_40MHZ = 1,
+#ifdef WLAN_FEATURE_11AC
+    eHT_CHANNEL_WIDTH_80MHZ = 2,
+#endif
+    eHT_MAX_CHANNEL_WIDTH
 } tSirMacHTChannelWidth;
 
 //Packet struct for HT capability
diff --git a/CORE/MAC/inc/wniApi.h b/CORE/MAC/inc/wniApi.h
index 14dc9b3..dc3cd0b 100644
--- a/CORE/MAC/inc/wniApi.h
+++ b/CORE/MAC/inc/wniApi.h
@@ -106,6 +106,10 @@
     eWNI_SME_SCAN_REQ,
     eWNI_SME_SCAN_ABORT_IND,
     eWNI_SME_SCAN_RSP,
+#ifdef FEATURE_OEM_DATA_SUPPORT
+    eWNI_SME_OEM_DATA_REQ,
+    eWNI_SME_OEM_DATA_RSP,
+#endif
     eWNI_SME_JOIN_REQ,
     eWNI_SME_JOIN_RSP,
     eWNI_SME_SETCONTEXT_REQ,
@@ -323,7 +327,8 @@
 #ifdef WLAN_WAKEUP_EVENTS
     eWNI_SME_WAKE_REASON_IND,
 #endif // WLAN_WAKEUP_EVENTS
-
+    eWNI_SME_EXCLUDE_UNENCRYPTED,
+    eWNI_SME_RSSI_IND, //RSSI indication from TL to be serialized on MC thread
     eWNI_SME_MSG_TYPES_END
 };
 
diff --git a/CORE/MAC/inc/wniCfgAp.h b/CORE/MAC/inc/wniCfgAp.h
index 68930d7..7c944cc 100644
--- a/CORE/MAC/inc/wniCfgAp.h
+++ b/CORE/MAC/inc/wniCfgAp.h
@@ -211,97 +211,129 @@
 #define WNI_CFG_BASIC_MCS_SET    166
 #define WNI_CFG_CURRENT_MCS_SET    167
 #define WNI_CFG_GREENFIELD_CAPABILITY    168
-#define WNI_CFG_MAX_AMSDU_LENGTH    169
-#define WNI_CFG_MPDU_DENSITY    170
-#define WNI_CFG_MAX_RX_AMPDU_FACTOR    171
-#define WNI_CFG_SHORT_GI_20MHZ    172
-#define WNI_CFG_SHORT_GI_40MHZ    173
-#define WNI_CFG_RIFS_ENABLED    174
-#define WNI_CFG_MAX_PS_POLL    175
-#define WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE    176
-#define WNI_CFG_RSSI_FILTER_PERIOD    177
-#define WNI_CFG_FT_RSSI_FILTER_PERIOD    178
-#define WNI_CFG_MIN_RSSI_THRESHOLD    179
-#define WNI_CFG_NTH_BEACON_FILTER    180
-#define WNI_CFG_BROADCAST_FRAME_FILTER_ENABLE    181
-#define WNI_CFG_SCAN_IN_POWERSAVE    182
-#define WNI_CFG_IGNORE_DTIM    183
-#define WNI_CFG_WOWLAN_UCAST_PATTERN_FILTER_ENABLE    184
-#define WNI_CFG_WOWLAN_CHANNEL_SWITCH_ENABLE    185
-#define WNI_CFG_WOWLAN_DEAUTH_ENABLE    186
-#define WNI_CFG_WOWLAN_DISASSOC_ENABLE    187
-#define WNI_CFG_WOWLAN_MAX_MISSED_BEACON    188
-#define WNI_CFG_WOWLAN_MAX_SLEEP_PERIOD    189
-#define WNI_CFG_BA_TIMEOUT    190
-#define WNI_CFG_BA_THRESHOLD_HIGH    191
-#define WNI_CFG_MAX_BA_BUFFERS    192
-#define WNI_CFG_MAX_BA_SESSIONS    193
-#define WNI_CFG_BA_AUTO_SETUP    194
-#define WNI_CFG_ADDBA_REQ_DECLINE    195
-#define WNI_CFG_BG_SCAN_CHANNEL_LIST    196
-#define WNI_CFG_MAX_MEDIUM_TIME    197
-#define WNI_CFG_MAX_MPDUS_IN_AMPDU    198
-#define WNI_CFG_IBSS_AUTO_BSSID    199
-#define WNI_CFG_PROBE_REQ_ADDNIE_FLAG    200
-#define WNI_CFG_PROBE_REQ_ADDNIE_DATA    201
-#define WNI_CFG_PROBE_RSP_ADDNIE_FLAG    202
-#define WNI_CFG_PROBE_RSP_ADDNIE_DATA1    203
-#define WNI_CFG_PROBE_RSP_ADDNIE_DATA2    204
-#define WNI_CFG_PROBE_RSP_ADDNIE_DATA3    205
-#define WNI_CFG_ASSOC_RSP_ADDNIE_FLAG    206
-#define WNI_CFG_ASSOC_RSP_ADDNIE_DATA    207
-#define WNI_CFG_PROBE_REQ_ADDNP2PIE_FLAG    208
-#define WNI_CFG_PROBE_REQ_ADDNP2PIE_DATA    209
-#define WNI_CFG_PROBE_RSP_BCN_ADDNIE_FLAG    210
-#define WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA    211
-#define WNI_CFG_WPS_ENABLE    212
-#define WNI_CFG_WPS_STATE    213
-#define WNI_CFG_WPS_PROBE_REQ_FLAG    214
-#define WNI_CFG_WPS_VERSION    215
-#define WNI_CFG_WPS_REQUEST_TYPE    216
-#define WNI_CFG_WPS_CFG_METHOD    217
-#define WNI_CFG_WPS_UUID    218
-#define WNI_CFG_WPS_PRIMARY_DEVICE_CATEGORY    219
-#define WNI_CFG_WPS_PIMARY_DEVICE_OUI    220
-#define WNI_CFG_WPS_DEVICE_SUB_CATEGORY    221
-#define WNI_CFG_WPS_ASSOCIATION_STATE    222
-#define WNI_CFG_WPS_CONFIGURATION_ERROR    223
-#define WNI_CFG_WPS_DEVICE_PASSWORD_ID    224
-#define WNI_CFG_WPS_ASSOC_METHOD    225
-#define WNI_CFG_LOW_GAIN_OVERRIDE    226
-#define WNI_CFG_ENABLE_PHY_AGC_LISTEN_MODE    227
-#define WNI_CFG_RPE_POLLING_THRESHOLD    228
-#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC0_REG    229
-#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC1_REG    230
-#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC2_REG    231
-#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC3_REG    232
-#define WNI_CFG_NO_OF_ONCHIP_REORDER_SESSIONS    233
-#define WNI_CFG_SINGLE_TID_RC    234
-#define WNI_CFG_RRM_ENABLED    235
-#define WNI_CFG_RRM_OPERATING_CHAN_MAX    236
-#define WNI_CFG_RRM_NON_OPERATING_CHAN_MAX    237
-#define WNI_CFG_TX_PWR_CTRL_ENABLE    238
-#define WNI_CFG_MCAST_BCAST_FILTER_SETTING    239
-#define WNI_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK    240
-#define WNI_CFG_DYNAMIC_PS_POLL_VALUE    241
-#define WNI_CFG_PS_NULLDATA_AP_RESP_TIMEOUT    242
-#define WNI_CFG_TELE_BCN_WAKEUP_EN    243
-#define WNI_CFG_TELE_BCN_TRANS_LI    244
-#define WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS    245
-#define WNI_CFG_TELE_BCN_MAX_LI    246
-#define WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS    247
-#define WNI_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS    248
-#define WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD    249
-#define WNI_CFG_ASSOC_STA_LIMIT    250
-#define WNI_CFG_SAP_CHANNEL_SELECT_START_CHANNEL    251
-#define WNI_CFG_SAP_CHANNEL_SELECT_END_CHANNEL    252
-#define WNI_CFG_SAP_CHANNEL_SELECT_OPERATING_BAND    253
-#define WNI_CFG_AP_DATA_AVAIL_POLL_PERIOD    254
-#define WNI_CFG_ENABLE_CLOSE_LOOP    255
-#define WNI_CFG_ENABLE_LTE_COEX    256
-#define WNI_CFG_AP_KEEP_ALIVE_TIMEOUT    257
-#define WNI_CFG_GO_KEEP_ALIVE_TIMEOUT    258
-#define WNI_CFG_ENABLE_MC_ADDR_LIST    259
+#define WNI_CFG_VHT_MAX_MPDU_LENGTH    169
+#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET    170
+#define WNI_CFG_VHT_LDPC_CODING_CAP    171
+#define WNI_CFG_VHT_SHORT_GI_80MHZ    172
+#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ    173
+#define WNI_CFG_VHT_TXSTBC    174
+#define WNI_CFG_VHT_RXSTBC    175
+#define WNI_CFG_VHT_SU_BEAMFORMER_CAP    176
+#define WNI_CFG_VHT_SU_BEAMFORMEE_CAP    177
+#define WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED    178
+#define WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS    179
+#define WNI_CFG_VHT_MU_BEAMFORMER_CAP    180
+#define WNI_CFG_VHT_MU_BEAMFORMEE_CAP    181
+#define WNI_CFG_VHT_TXOP_PS    182
+#define WNI_CFG_VHT_HTC_VHTC_CAP    183
+#define WNI_CFG_VHT_AMPDU_LEN_EXPONENT    184
+#define WNI_CFG_VHT_LINK_ADAPTATION_CAP    185
+#define WNI_CFG_VHT_RX_ANT_PATTERN    186
+#define WNI_CFG_VHT_TX_ANT_PATTERN    187
+#define WNI_CFG_VHT_RX_MCS_MAP    188
+#define WNI_CFG_VHT_TX_MCS_MAP    189
+#define WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE    190
+#define WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE    191
+#define WNI_CFG_VHT_CHANNEL_WIDTH    192
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1    193
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2    194
+#define WNI_CFG_VHT_BASIC_MCS_SET    195
+#define WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT    196
+#define WNI_CFG_VHT_SS_UNDER_UTIL    197
+#define WNI_CFG_VHT_40MHZ_UTILIZATION    198
+#define WNI_CFG_VHT_80MHZ_UTILIZATION    199
+#define WNI_CFG_VHT_160MHZ_UTILIZATION    200
+#define WNI_CFG_MAX_AMSDU_LENGTH    201
+#define WNI_CFG_MPDU_DENSITY    202
+#define WNI_CFG_MAX_RX_AMPDU_FACTOR    203
+#define WNI_CFG_SHORT_GI_20MHZ    204
+#define WNI_CFG_SHORT_GI_40MHZ    205
+#define WNI_CFG_RIFS_ENABLED    206
+#define WNI_CFG_MAX_PS_POLL    207
+#define WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE    208
+#define WNI_CFG_RSSI_FILTER_PERIOD    209
+#define WNI_CFG_FT_RSSI_FILTER_PERIOD    210
+#define WNI_CFG_MIN_RSSI_THRESHOLD    211
+#define WNI_CFG_NTH_BEACON_FILTER    212
+#define WNI_CFG_BROADCAST_FRAME_FILTER_ENABLE    213
+#define WNI_CFG_SCAN_IN_POWERSAVE    214
+#define WNI_CFG_IGNORE_DTIM    215
+#define WNI_CFG_WOWLAN_UCAST_PATTERN_FILTER_ENABLE    216
+#define WNI_CFG_WOWLAN_CHANNEL_SWITCH_ENABLE    217
+#define WNI_CFG_WOWLAN_DEAUTH_ENABLE    218
+#define WNI_CFG_WOWLAN_DISASSOC_ENABLE    219
+#define WNI_CFG_WOWLAN_MAX_MISSED_BEACON    220
+#define WNI_CFG_WOWLAN_MAX_SLEEP_PERIOD    221
+#define WNI_CFG_BA_TIMEOUT    222
+#define WNI_CFG_BA_THRESHOLD_HIGH    223
+#define WNI_CFG_MAX_BA_BUFFERS    224
+#define WNI_CFG_MAX_BA_SESSIONS    225
+#define WNI_CFG_BA_AUTO_SETUP    226
+#define WNI_CFG_ADDBA_REQ_DECLINE    227
+#define WNI_CFG_BG_SCAN_CHANNEL_LIST    228
+#define WNI_CFG_MAX_MEDIUM_TIME    229
+#define WNI_CFG_MAX_MPDUS_IN_AMPDU    230
+#define WNI_CFG_IBSS_AUTO_BSSID    231
+#define WNI_CFG_PROBE_REQ_ADDNIE_FLAG    232
+#define WNI_CFG_PROBE_REQ_ADDNIE_DATA    233
+#define WNI_CFG_PROBE_RSP_ADDNIE_FLAG    234
+#define WNI_CFG_PROBE_RSP_ADDNIE_DATA1    235
+#define WNI_CFG_PROBE_RSP_ADDNIE_DATA2    236
+#define WNI_CFG_PROBE_RSP_ADDNIE_DATA3    237
+#define WNI_CFG_ASSOC_RSP_ADDNIE_FLAG    238
+#define WNI_CFG_ASSOC_RSP_ADDNIE_DATA    239
+#define WNI_CFG_PROBE_REQ_ADDNP2PIE_FLAG    240
+#define WNI_CFG_PROBE_REQ_ADDNP2PIE_DATA    241
+#define WNI_CFG_PROBE_RSP_BCN_ADDNIE_FLAG    242
+#define WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA    243
+#define WNI_CFG_WPS_ENABLE    244
+#define WNI_CFG_WPS_STATE    245
+#define WNI_CFG_WPS_PROBE_REQ_FLAG    246
+#define WNI_CFG_WPS_VERSION    247
+#define WNI_CFG_WPS_REQUEST_TYPE    248
+#define WNI_CFG_WPS_CFG_METHOD    249
+#define WNI_CFG_WPS_UUID    250
+#define WNI_CFG_WPS_PRIMARY_DEVICE_CATEGORY    251
+#define WNI_CFG_WPS_PIMARY_DEVICE_OUI    252
+#define WNI_CFG_WPS_DEVICE_SUB_CATEGORY    253
+#define WNI_CFG_WPS_ASSOCIATION_STATE    254
+#define WNI_CFG_WPS_CONFIGURATION_ERROR    255
+#define WNI_CFG_WPS_DEVICE_PASSWORD_ID    256
+#define WNI_CFG_WPS_ASSOC_METHOD    257
+#define WNI_CFG_LOW_GAIN_OVERRIDE    258
+#define WNI_CFG_ENABLE_PHY_AGC_LISTEN_MODE    259
+#define WNI_CFG_RPE_POLLING_THRESHOLD    260
+#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC0_REG    261
+#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC1_REG    262
+#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC2_REG    263
+#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC3_REG    264
+#define WNI_CFG_NO_OF_ONCHIP_REORDER_SESSIONS    265
+#define WNI_CFG_SINGLE_TID_RC    266
+#define WNI_CFG_RRM_ENABLED    267
+#define WNI_CFG_RRM_OPERATING_CHAN_MAX    268
+#define WNI_CFG_RRM_NON_OPERATING_CHAN_MAX    269
+#define WNI_CFG_TX_PWR_CTRL_ENABLE    270
+#define WNI_CFG_MCAST_BCAST_FILTER_SETTING    271
+#define WNI_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK    272
+#define WNI_CFG_DYNAMIC_PS_POLL_VALUE    273
+#define WNI_CFG_PS_NULLDATA_AP_RESP_TIMEOUT    274
+#define WNI_CFG_TELE_BCN_WAKEUP_EN    275
+#define WNI_CFG_TELE_BCN_TRANS_LI    276
+#define WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS    277
+#define WNI_CFG_TELE_BCN_MAX_LI    278
+#define WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS    279
+#define WNI_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS    280
+#define WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD    281
+#define WNI_CFG_ASSOC_STA_LIMIT    282
+#define WNI_CFG_SAP_CHANNEL_SELECT_START_CHANNEL    283
+#define WNI_CFG_SAP_CHANNEL_SELECT_END_CHANNEL    284
+#define WNI_CFG_SAP_CHANNEL_SELECT_OPERATING_BAND    285
+#define WNI_CFG_AP_DATA_AVAIL_POLL_PERIOD    286
+#define WNI_CFG_ENABLE_CLOSE_LOOP    287
+#define WNI_CFG_ENABLE_LTE_COEX    288
+#define WNI_CFG_AP_KEEP_ALIVE_TIMEOUT    289
+#define WNI_CFG_GO_KEEP_ALIVE_TIMEOUT    290
+#define WNI_CFG_ENABLE_MC_ADDR_LIST    291
 
 /*
  * String parameter lengths 
@@ -583,11 +615,11 @@
 #define WNI_CFG_PHY_MODE_NONE    3
 
 #define WNI_CFG_DOT11_MODE_STAMIN    0
-#define WNI_CFG_DOT11_MODE_STAMAX    9
+#define WNI_CFG_DOT11_MODE_STAMAX    11
 #define WNI_CFG_DOT11_MODE_STADEF    0
 
 #define WNI_CFG_DOT11_MODE_APMIN    0
-#define WNI_CFG_DOT11_MODE_APMAX    9
+#define WNI_CFG_DOT11_MODE_APMAX    11
 #define WNI_CFG_DOT11_MODE_APDEF    0
 
 #define WNI_CFG_DOT11_MODE_ALL    0
@@ -600,6 +632,8 @@
 #define WNI_CFG_DOT11_MODE_TAURUS    7
 #define WNI_CFG_DOT11_MODE_11G_ONLY    8
 #define WNI_CFG_DOT11_MODE_11N_ONLY    9
+#define WNI_CFG_DOT11_MODE_11AC    10
+#define WNI_CFG_DOT11_MODE_11AC_ONLY    11
 
 #define WNI_CFG_LISTEN_INTERVAL_STAMIN    0
 #define WNI_CFG_LISTEN_INTERVAL_STAMAX    65535
@@ -1258,11 +1292,11 @@
 #define WNI_CFG_MAX_CONSECUTIVE_BACKGROUND_SCAN_FAILURE_APDEF    60
 
 #define WNI_CFG_CHANNEL_BONDING_MODE_STAMIN    0
-#define WNI_CFG_CHANNEL_BONDING_MODE_STAMAX    4
+#define WNI_CFG_CHANNEL_BONDING_MODE_STAMAX    10
 #define WNI_CFG_CHANNEL_BONDING_MODE_STADEF    0
 
 #define WNI_CFG_CHANNEL_BONDING_MODE_APMIN    0
-#define WNI_CFG_CHANNEL_BONDING_MODE_APMAX    4
+#define WNI_CFG_CHANNEL_BONDING_MODE_APMAX    10
 #define WNI_CFG_CHANNEL_BONDING_MODE_APDEF    0
 
 #define WNI_CFG_CHANNEL_BONDING_MODE_DISABLE    0
@@ -1272,16 +1306,23 @@
 #define WNI_CFG_CHANNEL_BONDING_MODE_INTELLIGENT    4
 
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_STAMIN    0
-#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_STAMAX    2
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_STAMAX    10
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_STADEF    0
 
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_APMIN    0
-#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_APMAX    2
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_APMAX    10
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_APDEF    0
 
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_NONE    0
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_LOWER    1
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_HIGHER    2
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_LOW_40MHZ_CENTERED    3
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_CENTERED_40MHZ_CENTERED    4
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_HIGH_40MHZ_CENTERED    5
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_LOW_40MHZ_LOW    6
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_HIGH_40MHZ_LOW    7
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_LOW_40MHZ_HIGH    8
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_HIGH_40MHZ_HIGH    9
 
 #define WNI_CFG_DYNAMIC_THRESHOLD_ZERO_STAMIN    0
 #define WNI_CFG_DYNAMIC_THRESHOLD_ZERO_STAMAX    255
@@ -1492,6 +1533,267 @@
 #define WNI_CFG_GREENFIELD_CAPABILITY_ENABLE    1
 #define WNI_CFG_GREENFIELD_CAPABILITY_DISABLE    0
 
+#define WNI_CFG_VHT_MAX_MPDU_LENGTH_STAMIN    0
+#define WNI_CFG_VHT_MAX_MPDU_LENGTH_STAMAX    2
+#define WNI_CFG_VHT_MAX_MPDU_LENGTH_STADEF    0
+
+#define WNI_CFG_VHT_MAX_MPDU_LENGTH_APMIN    0
+#define WNI_CFG_VHT_MAX_MPDU_LENGTH_APMAX    2
+#define WNI_CFG_VHT_MAX_MPDU_LENGTH_APDEF    0
+
+#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_STAMIN    0
+#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_STAMAX    0
+#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_STADEF    0
+
+#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_APMIN    0
+#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_APMAX    0
+#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_APDEF    0
+
+#define WNI_CFG_VHT_LDPC_CODING_CAP_STAMIN    0
+#define WNI_CFG_VHT_LDPC_CODING_CAP_STAMAX    1
+#define WNI_CFG_VHT_LDPC_CODING_CAP_STADEF    0
+
+#define WNI_CFG_VHT_LDPC_CODING_CAP_APMIN    0
+#define WNI_CFG_VHT_LDPC_CODING_CAP_APMAX    1
+#define WNI_CFG_VHT_LDPC_CODING_CAP_APDEF    0
+
+#define WNI_CFG_VHT_SHORT_GI_80MHZ_STAMIN    0
+#define WNI_CFG_VHT_SHORT_GI_80MHZ_STAMAX    1
+#define WNI_CFG_VHT_SHORT_GI_80MHZ_STADEF    1
+
+#define WNI_CFG_VHT_SHORT_GI_80MHZ_APMIN    0
+#define WNI_CFG_VHT_SHORT_GI_80MHZ_APMAX    1
+#define WNI_CFG_VHT_SHORT_GI_80MHZ_APDEF    1
+
+#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_STAMIN    0
+#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_STAMAX    1
+#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_STADEF    0
+
+#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_APMIN    0
+#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_APMAX    1
+#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_APDEF    0
+
+#define WNI_CFG_VHT_TXSTBC_STAMIN    0
+#define WNI_CFG_VHT_TXSTBC_STAMAX    1
+#define WNI_CFG_VHT_TXSTBC_STADEF    0
+
+#define WNI_CFG_VHT_TXSTBC_APMIN    0
+#define WNI_CFG_VHT_TXSTBC_APMAX    1
+#define WNI_CFG_VHT_TXSTBC_APDEF    0
+
+#define WNI_CFG_VHT_RXSTBC_STAMIN    0
+#define WNI_CFG_VHT_RXSTBC_STAMAX    1
+#define WNI_CFG_VHT_RXSTBC_STADEF    1
+
+#define WNI_CFG_VHT_RXSTBC_APMIN    0
+#define WNI_CFG_VHT_RXSTBC_APMAX    1
+#define WNI_CFG_VHT_RXSTBC_APDEF    1
+
+#define WNI_CFG_VHT_SU_BEAMFORMER_CAP_STAMIN    0
+#define WNI_CFG_VHT_SU_BEAMFORMER_CAP_STAMAX    1
+#define WNI_CFG_VHT_SU_BEAMFORMER_CAP_STADEF    0
+
+#define WNI_CFG_VHT_SU_BEAMFORMER_CAP_APMIN    0
+#define WNI_CFG_VHT_SU_BEAMFORMER_CAP_APMAX    1
+#define WNI_CFG_VHT_SU_BEAMFORMER_CAP_APDEF    0
+
+#define WNI_CFG_VHT_SU_BEAMFORMEE_CAP_STAMIN    0
+#define WNI_CFG_VHT_SU_BEAMFORMEE_CAP_STAMAX    1
+#define WNI_CFG_VHT_SU_BEAMFORMEE_CAP_STADEF    1
+
+#define WNI_CFG_VHT_SU_BEAMFORMEE_CAP_APMIN    0
+#define WNI_CFG_VHT_SU_BEAMFORMEE_CAP_APMAX    1
+#define WNI_CFG_VHT_SU_BEAMFORMEE_CAP_APDEF    1
+
+#define WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_STAMIN    0
+#define WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_STAMAX    1
+#define WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_STADEF    0
+
+#define WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_APMIN    0
+#define WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_APMAX    1
+#define WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_APDEF    0
+
+#define WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS_STAMIN    0
+#define WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS_STAMAX    1
+#define WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS_STADEF    1
+
+#define WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS_APMIN    0
+#define WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS_APMAX    1
+#define WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS_APDEF    1
+
+#define WNI_CFG_VHT_MU_BEAMFORMER_CAP_STAMIN    0
+#define WNI_CFG_VHT_MU_BEAMFORMER_CAP_STAMAX    1
+#define WNI_CFG_VHT_MU_BEAMFORMER_CAP_STADEF    0
+
+#define WNI_CFG_VHT_MU_BEAMFORMER_CAP_APMIN    0
+#define WNI_CFG_VHT_MU_BEAMFORMER_CAP_APMAX    1
+#define WNI_CFG_VHT_MU_BEAMFORMER_CAP_APDEF    0
+
+#define WNI_CFG_VHT_MU_BEAMFORMEE_CAP_STAMIN    0
+#define WNI_CFG_VHT_MU_BEAMFORMEE_CAP_STAMAX    1
+#define WNI_CFG_VHT_MU_BEAMFORMEE_CAP_STADEF    0
+
+#define WNI_CFG_VHT_MU_BEAMFORMEE_CAP_APMIN    0
+#define WNI_CFG_VHT_MU_BEAMFORMEE_CAP_APMAX    1
+#define WNI_CFG_VHT_MU_BEAMFORMEE_CAP_APDEF    0
+
+#define WNI_CFG_VHT_TXOP_PS_STAMIN    0
+#define WNI_CFG_VHT_TXOP_PS_STAMAX    1
+#define WNI_CFG_VHT_TXOP_PS_STADEF    0
+
+#define WNI_CFG_VHT_TXOP_PS_APMIN    0
+#define WNI_CFG_VHT_TXOP_PS_APMAX    1
+#define WNI_CFG_VHT_TXOP_PS_APDEF    0
+
+#define WNI_CFG_VHT_HTC_VHTC_CAP_STAMIN    0
+#define WNI_CFG_VHT_HTC_VHTC_CAP_STAMAX    1
+#define WNI_CFG_VHT_HTC_VHTC_CAP_STADEF    0
+
+#define WNI_CFG_VHT_HTC_VHTC_CAP_APMIN    0
+#define WNI_CFG_VHT_HTC_VHTC_CAP_APMAX    1
+#define WNI_CFG_VHT_HTC_VHTC_CAP_APDEF    0
+
+#define WNI_CFG_VHT_AMPDU_LEN_EXPONENT_STAMIN    0
+#define WNI_CFG_VHT_AMPDU_LEN_EXPONENT_STAMAX    7
+#define WNI_CFG_VHT_AMPDU_LEN_EXPONENT_STADEF    3
+
+#define WNI_CFG_VHT_AMPDU_LEN_EXPONENT_APMIN    0
+#define WNI_CFG_VHT_AMPDU_LEN_EXPONENT_APMAX    7
+#define WNI_CFG_VHT_AMPDU_LEN_EXPONENT_APDEF    3
+
+#define WNI_CFG_VHT_LINK_ADAPTATION_CAP_STAMIN    0
+#define WNI_CFG_VHT_LINK_ADAPTATION_CAP_STAMAX    3
+#define WNI_CFG_VHT_LINK_ADAPTATION_CAP_STADEF    0
+
+#define WNI_CFG_VHT_LINK_ADAPTATION_CAP_APMIN    0
+#define WNI_CFG_VHT_LINK_ADAPTATION_CAP_APMAX    3
+#define WNI_CFG_VHT_LINK_ADAPTATION_CAP_APDEF    0
+
+#define WNI_CFG_VHT_RX_ANT_PATTERN_STAMIN    0
+#define WNI_CFG_VHT_RX_ANT_PATTERN_STAMAX    1
+#define WNI_CFG_VHT_RX_ANT_PATTERN_STADEF    1
+
+#define WNI_CFG_VHT_RX_ANT_PATTERN_APMIN    0
+#define WNI_CFG_VHT_RX_ANT_PATTERN_APMAX    1
+#define WNI_CFG_VHT_RX_ANT_PATTERN_APDEF    1
+
+#define WNI_CFG_VHT_TX_ANT_PATTERN_STAMIN    0
+#define WNI_CFG_VHT_TX_ANT_PATTERN_STAMAX    1
+#define WNI_CFG_VHT_TX_ANT_PATTERN_STADEF    1
+
+#define WNI_CFG_VHT_TX_ANT_PATTERN_APMIN    0
+#define WNI_CFG_VHT_TX_ANT_PATTERN_APMAX    1
+#define WNI_CFG_VHT_TX_ANT_PATTERN_APDEF    1
+
+#define WNI_CFG_VHT_RX_MCS_MAP_STAMIN    0
+#define WNI_CFG_VHT_RX_MCS_MAP_STAMAX    65535
+#define WNI_CFG_VHT_RX_MCS_MAP_STADEF    65534
+
+#define WNI_CFG_VHT_RX_MCS_MAP_APMIN    0
+#define WNI_CFG_VHT_RX_MCS_MAP_APMAX    65535
+#define WNI_CFG_VHT_RX_MCS_MAP_APDEF    65534
+
+#define WNI_CFG_VHT_TX_MCS_MAP_STAMIN    0
+#define WNI_CFG_VHT_TX_MCS_MAP_STAMAX    65535
+#define WNI_CFG_VHT_TX_MCS_MAP_STADEF    65534
+
+#define WNI_CFG_VHT_TX_MCS_MAP_APMIN    0
+#define WNI_CFG_VHT_TX_MCS_MAP_APMAX    65535
+#define WNI_CFG_VHT_TX_MCS_MAP_APDEF    65534
+
+#define WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_STAMIN    1
+#define WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_STAMAX    434
+#define WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_STADEF    434
+
+#define WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_APMIN    1
+#define WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_APMAX    434
+#define WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_APDEF    434
+
+#define WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_STAMIN    1
+#define WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_STAMAX    434
+#define WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_STADEF    434
+
+#define WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_APMIN    1
+#define WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_APMAX    434
+#define WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_APDEF    434
+
+#define WNI_CFG_VHT_CHANNEL_WIDTH_STAMIN    0
+#define WNI_CFG_VHT_CHANNEL_WIDTH_STAMAX    3
+#define WNI_CFG_VHT_CHANNEL_WIDTH_STADEF    0
+
+#define WNI_CFG_VHT_CHANNEL_WIDTH_APMIN    0
+#define WNI_CFG_VHT_CHANNEL_WIDTH_APMAX    3
+#define WNI_CFG_VHT_CHANNEL_WIDTH_APDEF    0
+
+#define WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ    0
+#define WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ    1
+#define WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ    2
+#define WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ    3
+
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1_STAMIN    0
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1_STAMAX    256
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1_STADEF    0
+
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1_APMIN    0
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1_APMAX    256
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1_APDEF    0
+
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2_STAMIN    0
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2_STAMAX    0
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2_STADEF    0
+
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2_APMIN    0
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2_APMAX    0
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2_APDEF    0
+
+#define WNI_CFG_VHT_BASIC_MCS_SET_STAMIN    0
+#define WNI_CFG_VHT_BASIC_MCS_SET_STAMAX    3
+#define WNI_CFG_VHT_BASIC_MCS_SET_STADEF    0
+
+#define WNI_CFG_VHT_BASIC_MCS_SET_APMIN    0
+#define WNI_CFG_VHT_BASIC_MCS_SET_APMAX    3
+#define WNI_CFG_VHT_BASIC_MCS_SET_APDEF    0
+
+#define WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT_STAMIN    0
+#define WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT_STAMAX    4
+#define WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT_STADEF    0
+
+#define WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT_APMIN    0
+#define WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT_APMAX    4
+#define WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT_APDEF    0
+
+#define WNI_CFG_VHT_SS_UNDER_UTIL_STAMIN    0
+#define WNI_CFG_VHT_SS_UNDER_UTIL_STAMAX    0
+#define WNI_CFG_VHT_SS_UNDER_UTIL_STADEF    0
+
+#define WNI_CFG_VHT_SS_UNDER_UTIL_APMIN    0
+#define WNI_CFG_VHT_SS_UNDER_UTIL_APMAX    0
+#define WNI_CFG_VHT_SS_UNDER_UTIL_APDEF    0
+
+#define WNI_CFG_VHT_40MHZ_UTILIZATION_STAMIN    0
+#define WNI_CFG_VHT_40MHZ_UTILIZATION_STAMAX    0
+#define WNI_CFG_VHT_40MHZ_UTILIZATION_STADEF    0
+
+#define WNI_CFG_VHT_40MHZ_UTILIZATION_APMIN    0
+#define WNI_CFG_VHT_40MHZ_UTILIZATION_APMAX    0
+#define WNI_CFG_VHT_40MHZ_UTILIZATION_APDEF    0
+
+#define WNI_CFG_VHT_80MHZ_UTILIZATION_STAMIN    0
+#define WNI_CFG_VHT_80MHZ_UTILIZATION_STAMAX    0
+#define WNI_CFG_VHT_80MHZ_UTILIZATION_STADEF    0
+
+#define WNI_CFG_VHT_80MHZ_UTILIZATION_APMIN    0
+#define WNI_CFG_VHT_80MHZ_UTILIZATION_APMAX    0
+#define WNI_CFG_VHT_80MHZ_UTILIZATION_APDEF    0
+
+#define WNI_CFG_VHT_160MHZ_UTILIZATION_STAMIN    0
+#define WNI_CFG_VHT_160MHZ_UTILIZATION_STAMAX    0
+#define WNI_CFG_VHT_160MHZ_UTILIZATION_STADEF    0
+
+#define WNI_CFG_VHT_160MHZ_UTILIZATION_APMIN    0
+#define WNI_CFG_VHT_160MHZ_UTILIZATION_APMAX    0
+#define WNI_CFG_VHT_160MHZ_UTILIZATION_APDEF    0
+
 #define WNI_CFG_MAX_AMSDU_LENGTH_STAMIN    0
 #define WNI_CFG_MAX_AMSDU_LENGTH_STAMAX    1
 #define WNI_CFG_MAX_AMSDU_LENGTH_STADEF    0
@@ -2106,12 +2408,12 @@
 #define WNI_CFG_ENABLE_MC_ADDR_LIST_APMAX    1
 #define WNI_CFG_ENABLE_MC_ADDR_LIST_APDEF    0
 
-#define CFG_PARAM_MAX_NUM         260
-#define CFG_AP_IBUF_MAX_SIZE      199
+#define CFG_PARAM_MAX_NUM         292
+#define CFG_AP_IBUF_MAX_SIZE      231
 #define CFG_AP_SBUF_MAX_SIZE      3422
-#define CFG_STA_IBUF_MAX_SIZE     194
+#define CFG_STA_IBUF_MAX_SIZE     226
 #define CFG_STA_SBUF_MAX_SIZE     3388
-#define CFG_SEM_MAX_NUM           12
+#define CFG_SEM_MAX_NUM           19
 
 #define CFG_STA_MAGIC_DWORD     0xbeefbeef
 
diff --git a/CORE/MAC/inc/wniCfgSta.h b/CORE/MAC/inc/wniCfgSta.h
index 66a3ddf..bdf146c 100644
--- a/CORE/MAC/inc/wniCfgSta.h
+++ b/CORE/MAC/inc/wniCfgSta.h
@@ -205,97 +205,129 @@
 #define WNI_CFG_BASIC_MCS_SET    166
 #define WNI_CFG_CURRENT_MCS_SET    167
 #define WNI_CFG_GREENFIELD_CAPABILITY    168
-#define WNI_CFG_MAX_AMSDU_LENGTH    169
-#define WNI_CFG_MPDU_DENSITY    170
-#define WNI_CFG_MAX_RX_AMPDU_FACTOR    171
-#define WNI_CFG_SHORT_GI_20MHZ    172
-#define WNI_CFG_SHORT_GI_40MHZ    173
-#define WNI_CFG_RIFS_ENABLED    174
-#define WNI_CFG_MAX_PS_POLL    175
-#define WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE    176
-#define WNI_CFG_RSSI_FILTER_PERIOD    177
-#define WNI_CFG_FT_RSSI_FILTER_PERIOD    178
-#define WNI_CFG_MIN_RSSI_THRESHOLD    179
-#define WNI_CFG_NTH_BEACON_FILTER    180
-#define WNI_CFG_BROADCAST_FRAME_FILTER_ENABLE    181
-#define WNI_CFG_SCAN_IN_POWERSAVE    182
-#define WNI_CFG_IGNORE_DTIM    183
-#define WNI_CFG_WOWLAN_UCAST_PATTERN_FILTER_ENABLE    184
-#define WNI_CFG_WOWLAN_CHANNEL_SWITCH_ENABLE    185
-#define WNI_CFG_WOWLAN_DEAUTH_ENABLE    186
-#define WNI_CFG_WOWLAN_DISASSOC_ENABLE    187
-#define WNI_CFG_WOWLAN_MAX_MISSED_BEACON    188
-#define WNI_CFG_WOWLAN_MAX_SLEEP_PERIOD    189
-#define WNI_CFG_BA_TIMEOUT    190
-#define WNI_CFG_BA_THRESHOLD_HIGH    191
-#define WNI_CFG_MAX_BA_BUFFERS    192
-#define WNI_CFG_MAX_BA_SESSIONS    193
-#define WNI_CFG_BA_AUTO_SETUP    194
-#define WNI_CFG_ADDBA_REQ_DECLINE    195
-#define WNI_CFG_BG_SCAN_CHANNEL_LIST    196
-#define WNI_CFG_MAX_MEDIUM_TIME    197
-#define WNI_CFG_MAX_MPDUS_IN_AMPDU    198
-#define WNI_CFG_IBSS_AUTO_BSSID    199
-#define WNI_CFG_PROBE_REQ_ADDNIE_FLAG    200
-#define WNI_CFG_PROBE_REQ_ADDNIE_DATA    201
-#define WNI_CFG_PROBE_RSP_ADDNIE_FLAG    202
-#define WNI_CFG_PROBE_RSP_ADDNIE_DATA1    203
-#define WNI_CFG_PROBE_RSP_ADDNIE_DATA2    204
-#define WNI_CFG_PROBE_RSP_ADDNIE_DATA3    205
-#define WNI_CFG_ASSOC_RSP_ADDNIE_FLAG    206
-#define WNI_CFG_ASSOC_RSP_ADDNIE_DATA    207
-#define WNI_CFG_PROBE_REQ_ADDNP2PIE_FLAG    208
-#define WNI_CFG_PROBE_REQ_ADDNP2PIE_DATA    209
-#define WNI_CFG_PROBE_RSP_BCN_ADDNIE_FLAG    210
-#define WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA    211
-#define WNI_CFG_WPS_ENABLE    212
-#define WNI_CFG_WPS_STATE    213
-#define WNI_CFG_WPS_PROBE_REQ_FLAG    214
-#define WNI_CFG_WPS_VERSION    215
-#define WNI_CFG_WPS_REQUEST_TYPE    216
-#define WNI_CFG_WPS_CFG_METHOD    217
-#define WNI_CFG_WPS_UUID    218
-#define WNI_CFG_WPS_PRIMARY_DEVICE_CATEGORY    219
-#define WNI_CFG_WPS_PIMARY_DEVICE_OUI    220
-#define WNI_CFG_WPS_DEVICE_SUB_CATEGORY    221
-#define WNI_CFG_WPS_ASSOCIATION_STATE    222
-#define WNI_CFG_WPS_CONFIGURATION_ERROR    223
-#define WNI_CFG_WPS_DEVICE_PASSWORD_ID    224
-#define WNI_CFG_WPS_ASSOC_METHOD    225
-#define WNI_CFG_LOW_GAIN_OVERRIDE    226
-#define WNI_CFG_ENABLE_PHY_AGC_LISTEN_MODE    227
-#define WNI_CFG_RPE_POLLING_THRESHOLD    228
-#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC0_REG    229
-#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC1_REG    230
-#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC2_REG    231
-#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC3_REG    232
-#define WNI_CFG_NO_OF_ONCHIP_REORDER_SESSIONS    233
-#define WNI_CFG_SINGLE_TID_RC    234
-#define WNI_CFG_RRM_ENABLED    235
-#define WNI_CFG_RRM_OPERATING_CHAN_MAX    236
-#define WNI_CFG_RRM_NON_OPERATING_CHAN_MAX    237
-#define WNI_CFG_TX_PWR_CTRL_ENABLE    238
-#define WNI_CFG_MCAST_BCAST_FILTER_SETTING    239
-#define WNI_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK    240
-#define WNI_CFG_DYNAMIC_PS_POLL_VALUE    241
-#define WNI_CFG_PS_NULLDATA_AP_RESP_TIMEOUT    242
-#define WNI_CFG_TELE_BCN_WAKEUP_EN    243
-#define WNI_CFG_TELE_BCN_TRANS_LI    244
-#define WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS    245
-#define WNI_CFG_TELE_BCN_MAX_LI    246
-#define WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS    247
-#define WNI_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS    248
-#define WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD    249
-#define WNI_CFG_ASSOC_STA_LIMIT    250
-#define WNI_CFG_SAP_CHANNEL_SELECT_START_CHANNEL    251
-#define WNI_CFG_SAP_CHANNEL_SELECT_END_CHANNEL    252
-#define WNI_CFG_SAP_CHANNEL_SELECT_OPERATING_BAND    253
-#define WNI_CFG_AP_DATA_AVAIL_POLL_PERIOD    254
-#define WNI_CFG_ENABLE_CLOSE_LOOP    255
-#define WNI_CFG_ENABLE_LTE_COEX    256
-#define WNI_CFG_AP_KEEP_ALIVE_TIMEOUT    257
-#define WNI_CFG_GO_KEEP_ALIVE_TIMEOUT    258
-#define WNI_CFG_ENABLE_MC_ADDR_LIST    259
+#define WNI_CFG_VHT_MAX_MPDU_LENGTH    169
+#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET    170
+#define WNI_CFG_VHT_LDPC_CODING_CAP    171
+#define WNI_CFG_VHT_SHORT_GI_80MHZ    172
+#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ    173
+#define WNI_CFG_VHT_TXSTBC    174
+#define WNI_CFG_VHT_RXSTBC    175
+#define WNI_CFG_VHT_SU_BEAMFORMER_CAP    176
+#define WNI_CFG_VHT_SU_BEAMFORMEE_CAP    177
+#define WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED    178
+#define WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS    179
+#define WNI_CFG_VHT_MU_BEAMFORMER_CAP    180
+#define WNI_CFG_VHT_MU_BEAMFORMEE_CAP    181
+#define WNI_CFG_VHT_TXOP_PS    182
+#define WNI_CFG_VHT_HTC_VHTC_CAP    183
+#define WNI_CFG_VHT_AMPDU_LEN_EXPONENT    184
+#define WNI_CFG_VHT_LINK_ADAPTATION_CAP    185
+#define WNI_CFG_VHT_RX_ANT_PATTERN    186
+#define WNI_CFG_VHT_TX_ANT_PATTERN    187
+#define WNI_CFG_VHT_RX_MCS_MAP    188
+#define WNI_CFG_VHT_TX_MCS_MAP    189
+#define WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE    190
+#define WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE    191
+#define WNI_CFG_VHT_CHANNEL_WIDTH    192
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1    193
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2    194
+#define WNI_CFG_VHT_BASIC_MCS_SET    195
+#define WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT    196
+#define WNI_CFG_VHT_SS_UNDER_UTIL    197
+#define WNI_CFG_VHT_40MHZ_UTILIZATION    198
+#define WNI_CFG_VHT_80MHZ_UTILIZATION    199
+#define WNI_CFG_VHT_160MHZ_UTILIZATION    200
+#define WNI_CFG_MAX_AMSDU_LENGTH    201
+#define WNI_CFG_MPDU_DENSITY    202
+#define WNI_CFG_MAX_RX_AMPDU_FACTOR    203
+#define WNI_CFG_SHORT_GI_20MHZ    204
+#define WNI_CFG_SHORT_GI_40MHZ    205
+#define WNI_CFG_RIFS_ENABLED    206
+#define WNI_CFG_MAX_PS_POLL    207
+#define WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE    208
+#define WNI_CFG_RSSI_FILTER_PERIOD    209
+#define WNI_CFG_FT_RSSI_FILTER_PERIOD    210
+#define WNI_CFG_MIN_RSSI_THRESHOLD    211
+#define WNI_CFG_NTH_BEACON_FILTER    212
+#define WNI_CFG_BROADCAST_FRAME_FILTER_ENABLE    213
+#define WNI_CFG_SCAN_IN_POWERSAVE    214
+#define WNI_CFG_IGNORE_DTIM    215
+#define WNI_CFG_WOWLAN_UCAST_PATTERN_FILTER_ENABLE    216
+#define WNI_CFG_WOWLAN_CHANNEL_SWITCH_ENABLE    217
+#define WNI_CFG_WOWLAN_DEAUTH_ENABLE    218
+#define WNI_CFG_WOWLAN_DISASSOC_ENABLE    219
+#define WNI_CFG_WOWLAN_MAX_MISSED_BEACON    220
+#define WNI_CFG_WOWLAN_MAX_SLEEP_PERIOD    221
+#define WNI_CFG_BA_TIMEOUT    222
+#define WNI_CFG_BA_THRESHOLD_HIGH    223
+#define WNI_CFG_MAX_BA_BUFFERS    224
+#define WNI_CFG_MAX_BA_SESSIONS    225
+#define WNI_CFG_BA_AUTO_SETUP    226
+#define WNI_CFG_ADDBA_REQ_DECLINE    227
+#define WNI_CFG_BG_SCAN_CHANNEL_LIST    228
+#define WNI_CFG_MAX_MEDIUM_TIME    229
+#define WNI_CFG_MAX_MPDUS_IN_AMPDU    230
+#define WNI_CFG_IBSS_AUTO_BSSID    231
+#define WNI_CFG_PROBE_REQ_ADDNIE_FLAG    232
+#define WNI_CFG_PROBE_REQ_ADDNIE_DATA    233
+#define WNI_CFG_PROBE_RSP_ADDNIE_FLAG    234
+#define WNI_CFG_PROBE_RSP_ADDNIE_DATA1    235
+#define WNI_CFG_PROBE_RSP_ADDNIE_DATA2    236
+#define WNI_CFG_PROBE_RSP_ADDNIE_DATA3    237
+#define WNI_CFG_ASSOC_RSP_ADDNIE_FLAG    238
+#define WNI_CFG_ASSOC_RSP_ADDNIE_DATA    239
+#define WNI_CFG_PROBE_REQ_ADDNP2PIE_FLAG    240
+#define WNI_CFG_PROBE_REQ_ADDNP2PIE_DATA    241
+#define WNI_CFG_PROBE_RSP_BCN_ADDNIE_FLAG    242
+#define WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA    243
+#define WNI_CFG_WPS_ENABLE    244
+#define WNI_CFG_WPS_STATE    245
+#define WNI_CFG_WPS_PROBE_REQ_FLAG    246
+#define WNI_CFG_WPS_VERSION    247
+#define WNI_CFG_WPS_REQUEST_TYPE    248
+#define WNI_CFG_WPS_CFG_METHOD    249
+#define WNI_CFG_WPS_UUID    250
+#define WNI_CFG_WPS_PRIMARY_DEVICE_CATEGORY    251
+#define WNI_CFG_WPS_PIMARY_DEVICE_OUI    252
+#define WNI_CFG_WPS_DEVICE_SUB_CATEGORY    253
+#define WNI_CFG_WPS_ASSOCIATION_STATE    254
+#define WNI_CFG_WPS_CONFIGURATION_ERROR    255
+#define WNI_CFG_WPS_DEVICE_PASSWORD_ID    256
+#define WNI_CFG_WPS_ASSOC_METHOD    257
+#define WNI_CFG_LOW_GAIN_OVERRIDE    258
+#define WNI_CFG_ENABLE_PHY_AGC_LISTEN_MODE    259
+#define WNI_CFG_RPE_POLLING_THRESHOLD    260
+#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC0_REG    261
+#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC1_REG    262
+#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC2_REG    263
+#define WNI_CFG_RPE_AGING_THRESHOLD_FOR_AC3_REG    264
+#define WNI_CFG_NO_OF_ONCHIP_REORDER_SESSIONS    265
+#define WNI_CFG_SINGLE_TID_RC    266
+#define WNI_CFG_RRM_ENABLED    267
+#define WNI_CFG_RRM_OPERATING_CHAN_MAX    268
+#define WNI_CFG_RRM_NON_OPERATING_CHAN_MAX    269
+#define WNI_CFG_TX_PWR_CTRL_ENABLE    270
+#define WNI_CFG_MCAST_BCAST_FILTER_SETTING    271
+#define WNI_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK    272
+#define WNI_CFG_DYNAMIC_PS_POLL_VALUE    273
+#define WNI_CFG_PS_NULLDATA_AP_RESP_TIMEOUT    274
+#define WNI_CFG_TELE_BCN_WAKEUP_EN    275
+#define WNI_CFG_TELE_BCN_TRANS_LI    276
+#define WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS    277
+#define WNI_CFG_TELE_BCN_MAX_LI    278
+#define WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS    279
+#define WNI_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS    280
+#define WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD    281
+#define WNI_CFG_ASSOC_STA_LIMIT    282
+#define WNI_CFG_SAP_CHANNEL_SELECT_START_CHANNEL    283
+#define WNI_CFG_SAP_CHANNEL_SELECT_END_CHANNEL    284
+#define WNI_CFG_SAP_CHANNEL_SELECT_OPERATING_BAND    285
+#define WNI_CFG_AP_DATA_AVAIL_POLL_PERIOD    286
+#define WNI_CFG_ENABLE_CLOSE_LOOP    287
+#define WNI_CFG_ENABLE_LTE_COEX    288
+#define WNI_CFG_AP_KEEP_ALIVE_TIMEOUT    289
+#define WNI_CFG_GO_KEEP_ALIVE_TIMEOUT    290
+#define WNI_CFG_ENABLE_MC_ADDR_LIST    291
 
 /*
  * String parameter lengths 
@@ -488,7 +520,7 @@
 #define WNI_CFG_PHY_MODE_NONE    3
 
 #define WNI_CFG_DOT11_MODE_STAMIN    0
-#define WNI_CFG_DOT11_MODE_STAMAX    9
+#define WNI_CFG_DOT11_MODE_STAMAX    11
 #define WNI_CFG_DOT11_MODE_STADEF    0
 
 #define WNI_CFG_DOT11_MODE_ALL    0
@@ -501,6 +533,8 @@
 #define WNI_CFG_DOT11_MODE_TAURUS    7
 #define WNI_CFG_DOT11_MODE_11G_ONLY    8
 #define WNI_CFG_DOT11_MODE_11N_ONLY    9
+#define WNI_CFG_DOT11_MODE_11AC    10
+#define WNI_CFG_DOT11_MODE_11AC_ONLY    11
 
 #define WNI_CFG_LISTEN_INTERVAL_STAMIN    0
 #define WNI_CFG_LISTEN_INTERVAL_STAMAX    65535
@@ -891,7 +925,7 @@
 #define WNI_CFG_MAX_CONSECUTIVE_BACKGROUND_SCAN_FAILURE_STADEF    60
 
 #define WNI_CFG_CHANNEL_BONDING_MODE_STAMIN    0
-#define WNI_CFG_CHANNEL_BONDING_MODE_STAMAX    4
+#define WNI_CFG_CHANNEL_BONDING_MODE_STAMAX    10
 #define WNI_CFG_CHANNEL_BONDING_MODE_STADEF    0
 
 #define WNI_CFG_CHANNEL_BONDING_MODE_DISABLE    0
@@ -901,12 +935,19 @@
 #define WNI_CFG_CHANNEL_BONDING_MODE_INTELLIGENT    4
 
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_STAMIN    0
-#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_STAMAX    2
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_STAMAX    10
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_STADEF    0
 
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_NONE    0
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_LOWER    1
 #define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_HIGHER    2
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_LOW_40MHZ_CENTERED    3
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_CENTERED_40MHZ_CENTERED    4
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_HIGH_40MHZ_CENTERED    5
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_LOW_40MHZ_LOW    6
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_HIGH_40MHZ_LOW    7
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_LOW_40MHZ_HIGH    8
+#define WNI_CFG_CB_SECONDARY_CHANNEL_STATE_11AC_20MHZ_HIGH_40MHZ_HIGH    9
 
 #define WNI_CFG_DYNAMIC_THRESHOLD_ZERO_STAMIN    0
 #define WNI_CFG_DYNAMIC_THRESHOLD_ZERO_STAMAX    255
@@ -1045,6 +1086,139 @@
 #define WNI_CFG_GREENFIELD_CAPABILITY_ENABLE    1
 #define WNI_CFG_GREENFIELD_CAPABILITY_DISABLE    0
 
+#define WNI_CFG_VHT_MAX_MPDU_LENGTH_STAMIN    0
+#define WNI_CFG_VHT_MAX_MPDU_LENGTH_STAMAX    2
+#define WNI_CFG_VHT_MAX_MPDU_LENGTH_STADEF    0
+
+#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_STAMIN    0
+#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_STAMAX    0
+#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_STADEF    0
+
+#define WNI_CFG_VHT_LDPC_CODING_CAP_STAMIN    0
+#define WNI_CFG_VHT_LDPC_CODING_CAP_STAMAX    1
+#define WNI_CFG_VHT_LDPC_CODING_CAP_STADEF    0
+
+#define WNI_CFG_VHT_SHORT_GI_80MHZ_STAMIN    0
+#define WNI_CFG_VHT_SHORT_GI_80MHZ_STAMAX    1
+#define WNI_CFG_VHT_SHORT_GI_80MHZ_STADEF    1
+
+#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_STAMIN    0
+#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_STAMAX    1
+#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_STADEF    0
+
+#define WNI_CFG_VHT_TXSTBC_STAMIN    0
+#define WNI_CFG_VHT_TXSTBC_STAMAX    1
+#define WNI_CFG_VHT_TXSTBC_STADEF    0
+
+#define WNI_CFG_VHT_RXSTBC_STAMIN    0
+#define WNI_CFG_VHT_RXSTBC_STAMAX    1
+#define WNI_CFG_VHT_RXSTBC_STADEF    1
+
+#define WNI_CFG_VHT_SU_BEAMFORMER_CAP_STAMIN    0
+#define WNI_CFG_VHT_SU_BEAMFORMER_CAP_STAMAX    1
+#define WNI_CFG_VHT_SU_BEAMFORMER_CAP_STADEF    0
+
+#define WNI_CFG_VHT_SU_BEAMFORMEE_CAP_STAMIN    0
+#define WNI_CFG_VHT_SU_BEAMFORMEE_CAP_STAMAX    1
+#define WNI_CFG_VHT_SU_BEAMFORMEE_CAP_STADEF    1
+
+#define WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_STAMIN    0
+#define WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_STAMAX    1
+#define WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_STADEF    0
+
+#define WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS_STAMIN    0
+#define WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS_STAMAX    1
+#define WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS_STADEF    1
+
+#define WNI_CFG_VHT_MU_BEAMFORMER_CAP_STAMIN    0
+#define WNI_CFG_VHT_MU_BEAMFORMER_CAP_STAMAX    1
+#define WNI_CFG_VHT_MU_BEAMFORMER_CAP_STADEF    0
+
+#define WNI_CFG_VHT_MU_BEAMFORMEE_CAP_STAMIN    0
+#define WNI_CFG_VHT_MU_BEAMFORMEE_CAP_STAMAX    1
+#define WNI_CFG_VHT_MU_BEAMFORMEE_CAP_STADEF    0
+
+#define WNI_CFG_VHT_TXOP_PS_STAMIN    0
+#define WNI_CFG_VHT_TXOP_PS_STAMAX    1
+#define WNI_CFG_VHT_TXOP_PS_STADEF    0
+
+#define WNI_CFG_VHT_HTC_VHTC_CAP_STAMIN    0
+#define WNI_CFG_VHT_HTC_VHTC_CAP_STAMAX    1
+#define WNI_CFG_VHT_HTC_VHTC_CAP_STADEF    0
+
+#define WNI_CFG_VHT_AMPDU_LEN_EXPONENT_STAMIN    0
+#define WNI_CFG_VHT_AMPDU_LEN_EXPONENT_STAMAX    7
+#define WNI_CFG_VHT_AMPDU_LEN_EXPONENT_STADEF    3
+
+#define WNI_CFG_VHT_LINK_ADAPTATION_CAP_STAMIN    0
+#define WNI_CFG_VHT_LINK_ADAPTATION_CAP_STAMAX    3
+#define WNI_CFG_VHT_LINK_ADAPTATION_CAP_STADEF    0
+
+#define WNI_CFG_VHT_RX_ANT_PATTERN_STAMIN    0
+#define WNI_CFG_VHT_RX_ANT_PATTERN_STAMAX    1
+#define WNI_CFG_VHT_RX_ANT_PATTERN_STADEF    1
+
+#define WNI_CFG_VHT_TX_ANT_PATTERN_STAMIN    0
+#define WNI_CFG_VHT_TX_ANT_PATTERN_STAMAX    1
+#define WNI_CFG_VHT_TX_ANT_PATTERN_STADEF    1
+
+#define WNI_CFG_VHT_RX_MCS_MAP_STAMIN    0
+#define WNI_CFG_VHT_RX_MCS_MAP_STAMAX    65535
+#define WNI_CFG_VHT_RX_MCS_MAP_STADEF    65534
+
+#define WNI_CFG_VHT_TX_MCS_MAP_STAMIN    0
+#define WNI_CFG_VHT_TX_MCS_MAP_STAMAX    65535
+#define WNI_CFG_VHT_TX_MCS_MAP_STADEF    65534
+
+#define WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_STAMIN    1
+#define WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_STAMAX    434
+#define WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_STADEF    434
+
+#define WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_STAMIN    1
+#define WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_STAMAX    434
+#define WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_STADEF    434
+
+#define WNI_CFG_VHT_CHANNEL_WIDTH_STAMIN    0
+#define WNI_CFG_VHT_CHANNEL_WIDTH_STAMAX    3
+#define WNI_CFG_VHT_CHANNEL_WIDTH_STADEF    0
+
+#define WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ    0
+#define WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ    1
+#define WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ    2
+#define WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ    3
+
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1_STAMIN    0
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1_STAMAX    256
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1_STADEF    0
+
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2_STAMIN    0
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2_STAMAX    0
+#define WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2_STADEF    0
+
+#define WNI_CFG_VHT_BASIC_MCS_SET_STAMIN    0
+#define WNI_CFG_VHT_BASIC_MCS_SET_STAMAX    3
+#define WNI_CFG_VHT_BASIC_MCS_SET_STADEF    0
+
+#define WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT_STAMIN    0
+#define WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT_STAMAX    4
+#define WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT_STADEF    0
+
+#define WNI_CFG_VHT_SS_UNDER_UTIL_STAMIN    0
+#define WNI_CFG_VHT_SS_UNDER_UTIL_STAMAX    0
+#define WNI_CFG_VHT_SS_UNDER_UTIL_STADEF    0
+
+#define WNI_CFG_VHT_40MHZ_UTILIZATION_STAMIN    0
+#define WNI_CFG_VHT_40MHZ_UTILIZATION_STAMAX    0
+#define WNI_CFG_VHT_40MHZ_UTILIZATION_STADEF    0
+
+#define WNI_CFG_VHT_80MHZ_UTILIZATION_STAMIN    0
+#define WNI_CFG_VHT_80MHZ_UTILIZATION_STAMAX    0
+#define WNI_CFG_VHT_80MHZ_UTILIZATION_STADEF    0
+
+#define WNI_CFG_VHT_160MHZ_UTILIZATION_STAMIN    0
+#define WNI_CFG_VHT_160MHZ_UTILIZATION_STAMAX    0
+#define WNI_CFG_VHT_160MHZ_UTILIZATION_STADEF    0
+
 #define WNI_CFG_MAX_AMSDU_LENGTH_STAMIN    0
 #define WNI_CFG_MAX_AMSDU_LENGTH_STAMAX    1
 #define WNI_CFG_MAX_AMSDU_LENGTH_STADEF    0
@@ -1391,10 +1565,10 @@
 #define WNI_CFG_ENABLE_MC_ADDR_LIST_STAMAX    1
 #define WNI_CFG_ENABLE_MC_ADDR_LIST_STADEF    0
 
-#define CFG_PARAM_MAX_NUM        260
-#define CFG_STA_IBUF_MAX_SIZE    194
+#define CFG_PARAM_MAX_NUM        292
+#define CFG_STA_IBUF_MAX_SIZE    226
 #define CFG_STA_SBUF_MAX_SIZE    3388
-#define CFG_SEM_MAX_NUM          12
+#define CFG_SEM_MAX_NUM          19
 
 #define CFG_STA_MAGIC_DWORD    0xbeefbeef
 
diff --git a/CORE/MAC/src/cfg/cfgApi.c b/CORE/MAC/src/cfg/cfgApi.c
index a20d0ec..a857343 100644
--- a/CORE/MAC/src/cfg/cfgApi.c
+++ b/CORE/MAC/src/cfg/cfgApi.c
@@ -187,15 +187,6 @@
         PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d\n"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
     }
-#if 0
-    else if (((control & CFG_CTL_RESTART) && !Restarting(pMac)) ||
-             ((control & CFG_CTL_RELOAD) && !Reloading(pMac)))
-    {
-        cfgLog(pMac, LOGE, FL("Change requires a restart/reload cfg id %d state %d\n"),
-               cfgId, pMac->lim.gLimSmeState);
-        retVal = eSIR_CFG_INVALID_ID;
-    }
-#endif
     else if ((pMac->cfg.gCfgIBufMin[index] > value) ||
              (pMac->cfg.gCfgIBufMax[index] < value))
     {
@@ -957,20 +948,10 @@
     if(sessionEntry->dot11mode == WNI_CFG_DOT11_MODE_11B)
         return eSIR_SUCCESS;
 
-
-    
     // Short slot time bit
     if (systemRole == eLIM_AP_ROLE)
     {
-        if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, &val)
-                       != eSIR_SUCCESS)
-        {
-            cfgLog(pMac, LOGP,
-                   FL("cfg get WNI_CFG_SHORT_SLOT_TIME failed\n"));
-            return eSIR_FAILURE;
-        }
-        if (val)
-            pCapInfo->shortSlotTime = 1;
+        pCapInfo->shortSlotTime = sessionEntry->shortSlotTimeSupported;
     }
     else
     {
@@ -989,16 +970,8 @@
          */
         if (val)
         {
-            if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, &val)
-                           != eSIR_SUCCESS)
-            {
-                cfgLog(pMac, LOGP,
-                       FL("cfg get WNI_CFG_SHORT_SLOT_TIME failed\n"));
-                return eSIR_FAILURE;
-            }
-            if (val)
-            pCapInfo->shortSlotTime = 1;
-    }
+            pCapInfo->shortSlotTime = sessionEntry->shortSlotTimeSupported;
+        }
     }
 
     // Spectrum Management bit
@@ -1174,7 +1147,7 @@
     mmhMsg.bodyval = (tANI_U32)cfgId;
     mmhMsg.bodyptr = NULL;
 
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
 
     if ((ntfMask & CFG_CTL_NTF_SCH) != 0)
         schPostMessage(pMac, &mmhMsg);
diff --git a/CORE/MAC/src/cfg/cfgParamName.c b/CORE/MAC/src/cfg/cfgParamName.c
index 0a984ed..5c1580b 100644
--- a/CORE/MAC/src/cfg/cfgParamName.c
+++ b/CORE/MAC/src/cfg/cfgParamName.c
@@ -202,6 +202,38 @@
     (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 *)"MAX_RX_AMPDU_FACTOR",
diff --git a/CORE/MAC/src/cfg/cfgProcMsg.c b/CORE/MAC/src/cfg/cfgProcMsg.c
index a93bfe1..30bcbd8 100644
--- a/CORE/MAC/src/cfg/cfgProcMsg.c
+++ b/CORE/MAC/src/cfg/cfgProcMsg.c
@@ -415,7 +415,7 @@
     mmhMsg.bodyptr = NULL;
     mmhMsg.bodyval = 0;
 
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     if (wdaPostCtrlMsg(pMac, &mmhMsg) != eSIR_SUCCESS)
     {
         PELOGE(cfgLog(pMac, LOGE, FL("WDAPostMsgApi failed!\n"));)
diff --git a/CORE/MAC/src/cfg/cfgSendMsg.c b/CORE/MAC/src/cfg/cfgSendMsg.c
index 469d464..8f83143 100644
--- a/CORE/MAC/src/cfg/cfgSendMsg.c
+++ b/CORE/MAC/src/cfg/cfgSendMsg.c
@@ -139,7 +139,7 @@
     }
 
     // Ship it
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     SysProcessMmhMsg(pMac, &mmhMsg);
 
 } /*** end cfgSendHostMsg() ***/
diff --git a/CORE/MAC/src/cfg/cfgUtil/cfg.txt b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
index ad07684..ed4e62d 100644
--- a/CORE/MAC/src/cfg/cfgUtil/cfg.txt
+++ b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
@@ -604,10 +604,10 @@
 WNI_CFG_DOT11_MODE     I     4     9
 V    RW    NP RESTART
 LIM
-0    9    0
+0    11    0
 V    RW    NP RESTART
 LIM
-0    9    0
+0    11    0
 
 #ENUM  ALL           0
 #ENUM  11A           1
@@ -619,6 +619,8 @@
 #ENUM  TAURUS        7
 #ENUM  11G_ONLY      8
 #ENUM  11N_ONLY      9
+#ENUM  11AC          10
+#ENUM  11AC_ONLY     11
 
 
 
@@ -2244,10 +2246,10 @@
 WNI_CFG_CHANNEL_BONDING_MODE    I    4    12
 V    RW    NP    RESTART
 LIM
-0    4     0
+0    10     0
 V    RW    NP    RESTART
 LIM
-0    4     0
+0    10     0
 
 #ENUM DISABLE          0
 #ENUM ENABLE           1
@@ -2263,21 +2265,35 @@
 *  lower frequency). 
 *
 *  0 - There is no secondary channel. The channel is 20Mhz
-*  1 - LOWER:  Secondary channel is located below the primary channel
-*  2 - HIGHER: Secondary channel is located above the primary channel   
+*  1 - LOWER:  Secondary channel 40MHZ is located below the primary channel
+*  2 - CENTERED:Secondary channel and primary located at centered
+*  3 - HIGHER: Secondary channel 40 MHZ is located above the primary channel
+*  4 - 80MHZ_LOW_CENTERED : 20/40MHZ offset LOW 40/80MHZ offset CENTERED
+*  5 - 80MHZ_CENTERED_CENTERED : 20/40MHZ offset CENTERED 40/80MHZ offset CENTERED
+*  6 - 80MHZ_HIGH_CENTERED : 20/40MHZ offset HIGH 40/80MHZ offset CENTERED
+*  7 - 80MHZ_LOW_LOW: 20/40MHZ offset LOW 40/80MHZ offset LOW
+*  8 - 80MHZ_HIGH_LOW: 20/40MHZ offset HIGH 40/80MHZ offset LOW
+*  9 - 80MHZ_LOW_HIGH: 20/40MHZ offset LOW 40/80MHZ offset HIGH
+*  10 - 80MHZ_HIGH_HIGH: 20/40MHZ offset HIGH 40/80MHZ offset HIGH
 *
 WNI_CFG_CB_SECONDARY_CHANNEL_STATE    I    4    12
 V    RW    NP
 NONE
-0    2     0
+0    10     0
 V    RW    NP
 NONE
-0    2     0
+0    10     0
 
 #ENUM NONE             0
 #ENUM LOWER            1
 #ENUM HIGHER           2
-
+#ENUM 11AC_20MHZ_LOW_40MHZ_CENTERED       3
+#ENUM 11AC_20MHZ_CENTERED_40MHZ_CENTERED  4
+#ENUM 11AC_20MHZ_HIGH_40MHZ_CENTERED      5
+#ENUM 11AC_20MHZ_LOW_40MHZ_LOW            6
+#ENUM 11AC_20MHZ_HIGH_40MHZ_LOW           7
+#ENUM 11AC_20MHZ_LOW_40MHZ_HIGH           8
+#ENUM 11AC_20MHZ_HIGH_40MHZ_HIGH          9
 
 *************************************
 * Feature:   Dynamic Retry Rates
@@ -2693,6 +2709,385 @@
 #ENUM ENABLE    1
 #ENUM DISABLE   0
 
+*
+* Maximum AMPDU Length
+* By default set to zero for 3895 octets
+*
+WNI_CFG_VHT_MAX_MPDU_LENGTH  I    4    19
+V    RW    NP    
+LIM
+0    2    0
+V    RW    NP    
+LIM
+0    2    0
+
+*
+* Supported Channel Width Set
+* By default set to zero for 
+* STAs does not support either 160 or 80+80MHz
+*
+WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET  I    4    19
+V    RW    NP    
+LIM
+0    0    0
+V    RW    NP    
+LIM
+0    0    0
+
+*
+* LDPC Coding Capability
+* Riva/Pronto supports, default set to 1
+*
+WNI_CFG_VHT_LDPC_CODING_CAP  I    4    19
+V    RW    NP    
+LIM
+0    1    0
+V    RW    NP    
+LIM
+0    1    0
+
+*
+* Short GI for 80MHz
+* Riva/Pronto supports, default set to 1
+*
+WNI_CFG_VHT_SHORT_GI_80MHZ  I    4    19
+V    RW    NP    
+LIM
+0    1    1
+V    RW    NP    
+LIM
+0    1    1
+
+*
+* Short GI for 160MHz and 80+80MHz
+* Riva/Pronto does not supports, default set to 0
+*
+WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ  I    4    19
+V    RW    NP    
+LIM
+0    1    0
+V    RW    NP    
+LIM
+0    1    0
+
+*
+* Support for Transmission of 2x1 STBC
+* Riva/Pronto does not supports, default set to 0
+*
+WNI_CFG_VHT_TXSTBC  I    4    19
+V    RW    NP    
+LIM
+0    1    0
+V    RW    NP    
+LIM
+0    1    0
+
+*
+* Support for Reception of PPDUs using STBC
+* Riva/Pronto supports, default set to 1
+*
+WNI_CFG_VHT_RXSTBC  I    4    19
+V    RW    NP    
+LIM
+0    1    1
+V    RW    NP    
+LIM
+0    1    1
+
+*
+* Support for Operating as SU Beamformer
+* Riva/Pronto does not supports, default set to 0
+*
+WNI_CFG_VHT_SU_BEAMFORMER_CAP  I    4    19
+V    RW    NP    
+LIM
+0    1    0
+V    RW    NP    
+LIM
+0    1    0
+
+*
+* Support for Operating as SU Beamformee
+* Riva does not support, But Pronto supports, default set to 0
+*
+WNI_CFG_VHT_SU_BEAMFORMEE_CAP  I    4    19
+V    RW    NP    
+LIM
+0    1    1
+V    RW    NP    
+LIM
+0    1    1
+
+*
+* Compressed Steering Number of Beamformer Antennas Supported
+* Riva/Pronto does not support, default set to 0
+*
+WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED  I    4    19
+V    RW    NP    
+LIM
+0    1    0
+V    RW    NP    
+LIM
+0    1    0
+
+*
+* Number of Sounding Dimensions indicates Number
+* of antennas used by the beamformer when sending beamformed transmissions
+* Riva/Pronto does not support beamformer, default set to 0
+*
+WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS  I    4    19
+V    RW    NP    
+LIM
+0    1    1
+V    RW    NP    
+LIM
+0    1    1
+
+*
+* MU Beamformer Capable
+* Riva/Pronto does not support, default set to 0
+*
+WNI_CFG_VHT_MU_BEAMFORMER_CAP  I    4    19
+V    RW    NP    
+LIM
+0    1    0
+V    RW    NP    
+LIM
+0    1    0
+
+*
+* MU Beamformee Capable
+* Riva does not support but pronto supports, default set to 0
+*
+WNI_CFG_VHT_MU_BEAMFORMEE_CAP  I    4    19
+V    RW    NP    
+LIM
+0    1    0
+V    RW    NP    
+LIM
+0    1    0
+
+*
+* VHT TXOP PS
+* Riva does not support but pronto supports, default set to 0
+*
+WNI_CFG_VHT_TXOP_PS  I    4    19
+V    RW    NP    
+LIM
+0    1    0
+V    RW    NP    
+LIM
+0    1    0
+
+*
+* +HTC-VHT Capable
+* Riva does not support but pronto supports, default set to 0
+*
+WNI_CFG_VHT_HTC_VHTC_CAP  I    4    19
+V    RW    NP    
+LIM
+0    1    0
+V    RW    NP    
+LIM
+0    1    0
+
+*
+* Maximum AMPDU Length exponent range 0-7
+* 2^(13+Max AMPDU Length)-1, default set to 0
+*
+WNI_CFG_VHT_AMPDU_LEN_EXPONENT  I    4    19
+V    RW    NP    
+LIM
+0    7    3
+V    RW    NP    
+LIM
+0    7    3
+
+*
+* VHT Link Adaptation Capable
+* Riva does not support but pronto supports, default set to 0
+*
+WNI_CFG_VHT_LINK_ADAPTATION_CAP  I    4    19
+V    RW    NP    
+LIM
+0    3    0
+V    RW    NP    
+LIM
+0    3    0
+
+*
+* VHT Rx Antenna Pattern Consistency
+*
+WNI_CFG_VHT_RX_ANT_PATTERN  I    4    19
+V    RW    NP    
+LIM
+0    1    1
+V    RW    NP    
+LIM
+0    1    1
+
+*
+* VHT Tx Antenna Pattern Consistency
+*
+WNI_CFG_VHT_TX_ANT_PATTERN  I    4    19
+V    RW    NP    
+LIM
+0    1    1
+V    RW    NP    
+LIM
+0    1    1
+
+*
+* RxMCS Map is 16 bits, The 2bit Max MCS for n SS field.
+* Indicates the maximum MCS that can be received for each
+* number of spacial streams. Riva supports MCS 0-9
+*
+WNI_CFG_VHT_RX_MCS_MAP  I    4    19
+V    RW    NP    
+LIM
+0    0xFFFF    0xFFFE
+V    RW    NP    
+LIM
+0    0xFFFF    0xFFFE
+
+* TxMCS Map is 16 bits, The 2bit Max MCS for n SS field.
+* Indicates the maximum MCS that can be transmitted for each
+* number of spacial streams.
+*
+WNI_CFG_VHT_TX_MCS_MAP  I    4    19
+V    RW    NP    
+LIM
+0    0xFFFF    0xFFFE
+V    RW    NP    
+LIM
+0    0xFFFF    0xFFFE
+
+*
+* Rx Highest supported data rate.
+*
+WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE  I    4    19
+V    RW    NP    
+LIM
+1    434   434
+V    RW    NP    
+LIM
+1    434   434
+
+*
+* Tx Highest supported data rate.
+*
+WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE  I    4    19
+V    RW    NP    
+LIM
+1    434    434
+V    RW    NP    
+LIM
+1    434    434
+
+*
+* VHT Operation Information
+* Channel Width set to zero for 20/40MHz.
+* set to 1 for 80MHz. 2->160Mhz, 3->80+80MHz
+*
+WNI_CFG_VHT_CHANNEL_WIDTH  I    4    19
+V    RW    NP    
+LIM
+0    3    0
+V    RW    NP    
+LIM
+0    3    0
+
+#ENUM 20_40MHZ       0
+#ENUM 80MHZ          1
+#ENUM 160MHZ         2
+#ENUM 80_PLUS_80MHZ  3
+*
+* Channel center freq Seg1 
+*
+WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1  I    4    19
+V    RW    NP    
+LIM
+0    256   0 
+V    RW    NP    
+LIM
+0    256   0
+
+*
+* Channel center freq Seg2 for 80+80 Mhz
+*
+WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2  I    4    19
+V    RW    NP    
+LIM
+0    0     0 
+V    RW    NP    
+LIM
+0    0     0
+
+*
+* Basic MCS Set
+*
+WNI_CFG_VHT_BASIC_MCS_SET  I    4    19
+V    RW    NP    
+LIM
+0    3     0 
+V    RW    NP    
+LIM
+0    3     0
+
+*
+* MU-MIMO Capable STA Count
+*
+WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT  I    4    19
+V    RW    NP    
+LIM
+0     4    0 
+V    RW    NP    
+LIM
+0     4     0
+
+*
+* Spatial Stream Under-Utilization
+*
+WNI_CFG_VHT_SS_UNDER_UTIL  I    4    19
+V    RW    NP    
+LIM
+0     0    0 
+V    RW    NP    
+LIM
+0     0     0
+
+*
+* Forty MHZ Utilization
+*
+WNI_CFG_VHT_40MHZ_UTILIZATION  I    4    19
+V    RW    NP    
+LIM
+0     0    0 
+V    RW    NP    
+LIM
+0     0     0
+
+*
+* Eighty MHz Utilization
+*
+WNI_CFG_VHT_80MHZ_UTILIZATION  I    4    19
+V    RW    NP    
+LIM
+0     0    0 
+V    RW    NP    
+LIM
+0     0     0
+
+*
+* Hundred Sixty MHz Utilization
+*
+WNI_CFG_VHT_160MHZ_UTILIZATION  I    4    19
+V    RW    NP    
+LIM
+0     0    0 
+V    RW    NP    
+LIM
+0     0     0
 
 *
 * Maximum AMSDU length
diff --git a/CORE/MAC/src/include/dot11f.h b/CORE/MAC/src/include/dot11f.h
index 7fe0dc4..d4657b1 100644
--- a/CORE/MAC/src/include/dot11f.h
+++ b/CORE/MAC/src/include/dot11f.h
@@ -35,7 +35,7 @@
   *
   *
   * This file was automatically generated by 'framesc'
-  * Tue May 15 13:12:01 2012 from the following file(s):
+  * Fri Aug 17 13:25:06 2012 from the following file(s):
   *
   * dot11f.frms
   * 
@@ -5005,6 +5005,113 @@
 #ifdef __cplusplus
 }; /* End extern "C". */
 #endif /* C++ */
+// EID 191 (0xbf)
+typedef struct sDot11fIEVHTCaps {
+    tANI_U8      present;
+    tANI_U32       maxMPDULen: 2;
+    tANI_U32 supportedChannelWidthSet: 2;
+    tANI_U32    ldpcCodingCap: 1;
+    tANI_U32     shortGI80MHz: 1;
+    tANI_U32 shortGI160and80plus80MHz: 1;
+    tANI_U32           txSTBC: 1;
+    tANI_U32           rxSTBC: 3;
+    tANI_U32  suBeamFormerCap: 1;
+    tANI_U32  suBeamformeeCap: 1;
+    tANI_U32 csnofBeamformerAntSup: 3;
+    tANI_U32   numSoundingDim: 3;
+    tANI_U32  muBeamformerCap: 1;
+    tANI_U32  muBeamformeeCap: 1;
+    tANI_U32        vhtTXOPPS: 1;
+    tANI_U32        htcVHTCap: 1;
+    tANI_U32   maxAMPDULenExp: 3;
+    tANI_U32  vhtLinkAdaptCap: 2;
+    tANI_U32     rxAntPattern: 1;
+    tANI_U32     txAntPattern: 1;
+    tANI_U32        reserved1: 2;
+    tANI_U16     rxMCSMap;
+    tANI_U16 rxHighSupDataRate: 13;
+    tANI_U16        reserved2: 3;
+    tANI_U16     txMCSMap;
+    tANI_U16    txSupDataRate: 13;
+    tANI_U16        reserved3: 3;
+} tDot11fIEVHTCaps;
+
+#define DOT11F_EID_VHTCAPS ( 191 )
+
+// N.B. These #defines do *not* include the EID & length
+#define DOT11F_IE_VHTCAPS_MIN_LEN ( 12 )
+
+#define DOT11F_IE_VHTCAPS_MAX_LEN ( 12 )
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+tANI_U32 dot11fUnpackIeVHTCaps(tpAniSirGlobal, tANI_U8*,tANI_U8, tDot11fIEVHTCaps*);
+
+tANI_U32 dot11fPackIeVHTCaps(tpAniSirGlobal, tDot11fIEVHTCaps*, tANI_U8*, tANI_U32, tANI_U32*);
+
+tANI_U32 dot11fGetPackedIEVHTCaps(tpAniSirGlobal, tDot11fIEVHTCaps*, tANI_U32*);
+
+#ifdef __cplusplus
+}; /* End extern "C". */
+#endif /* C++ */
+// EID 193 (0xc1)
+typedef struct sDot11fIEVHTExtBssLoad {
+    tANI_U8      present;
+    tANI_U8      muMIMOCapStaCount;
+    tANI_U8      ssUnderUtil;
+    tANI_U8      FortyMHzUtil;
+    tANI_U8      EightyMHzUtil;
+    tANI_U8      OneSixtyMHzUtil;
+} tDot11fIEVHTExtBssLoad;
+
+#define DOT11F_EID_VHTEXTBSSLOAD ( 193 )
+
+// N.B. These #defines do *not* include the EID & length
+#define DOT11F_IE_VHTEXTBSSLOAD_MIN_LEN ( 5 )
+
+#define DOT11F_IE_VHTEXTBSSLOAD_MAX_LEN ( 5 )
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+tANI_U32 dot11fUnpackIeVHTExtBssLoad(tpAniSirGlobal, tANI_U8*,tANI_U8, tDot11fIEVHTExtBssLoad*);
+
+tANI_U32 dot11fPackIeVHTExtBssLoad(tpAniSirGlobal, tDot11fIEVHTExtBssLoad*, tANI_U8*, tANI_U32, tANI_U32*);
+
+tANI_U32 dot11fGetPackedIEVHTExtBssLoad(tpAniSirGlobal, tDot11fIEVHTExtBssLoad*, tANI_U32*);
+
+#ifdef __cplusplus
+}; /* End extern "C". */
+#endif /* C++ */
+// EID 192 (0xc0)
+typedef struct sDot11fIEVHTOperation {
+    tANI_U8      present;
+    tANI_U8      chanWidth;
+    tANI_U8      chanCenterFreqSeg1;
+    tANI_U8      chanCenterFreqSeg2;
+    tANI_U16     basicMCSSet;
+} tDot11fIEVHTOperation;
+
+#define DOT11F_EID_VHTOPERATION ( 192 )
+
+// N.B. These #defines do *not* include the EID & length
+#define DOT11F_IE_VHTOPERATION_MIN_LEN ( 5 )
+
+#define DOT11F_IE_VHTOPERATION_MAX_LEN ( 5 )
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+tANI_U32 dot11fUnpackIeVHTOperation(tpAniSirGlobal, tANI_U8*,tANI_U8, tDot11fIEVHTOperation*);
+
+tANI_U32 dot11fPackIeVHTOperation(tpAniSirGlobal, tDot11fIEVHTOperation*, tANI_U8*, tANI_U32, tANI_U32*);
+
+tANI_U32 dot11fGetPackedIEVHTOperation(tpAniSirGlobal, tDot11fIEVHTOperation*, tANI_U32*);
+
+#ifdef __cplusplus
+}; /* End extern "C". */
+#endif /* C++ */
 // EID 68 (0x44)
 typedef struct sDot11fIEWAPI {
     tANI_U8      present;
@@ -5091,6 +5198,32 @@
 #ifdef __cplusplus
 }; /* End extern "C". */
 #endif /* C++ */
+// EID 221 (0xdd) {OUI 0x50, 0x6f, 0x9a, 0x0a}
+typedef struct sDot11fIEWFDIEOpaque {
+    tANI_U8      present;
+    tANI_U8      num_data;
+    tANI_U8      data[249];
+} tDot11fIEWFDIEOpaque;
+
+#define DOT11F_EID_WFDIEOPAQUE ( 221 )
+
+// N.B. These #defines do *not* include the EID & length
+#define DOT11F_IE_WFDIEOPAQUE_MIN_LEN ( 6 )
+
+#define DOT11F_IE_WFDIEOPAQUE_MAX_LEN ( 253 )
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+tANI_U32 dot11fUnpackIeWFDIEOpaque(tpAniSirGlobal, tANI_U8*,tANI_U8, tDot11fIEWFDIEOpaque*);
+
+tANI_U32 dot11fPackIeWFDIEOpaque(tpAniSirGlobal, tDot11fIEWFDIEOpaque*, tANI_U8*, tANI_U32, tANI_U32*);
+
+tANI_U32 dot11fGetPackedIEWFDIEOpaque(tpAniSirGlobal, tDot11fIEWFDIEOpaque*, tANI_U32*);
+
+#ifdef __cplusplus
+}; /* End extern "C". */
+#endif /* C++ */
 // EID 221 (0xdd) {OUI 0x00, 0x50, 0xf2, 0x02, 0x05}
 typedef struct sDot11fIEWMMCaps {
     tANI_U8      present;
@@ -5736,6 +5869,8 @@
     tDot11fIECCXRadMgmtCap  CCXRadMgmtCap;
     tDot11fIECCXVersion     CCXVersion;
     tDot11fIEP2PIEOpaque    P2PIEOpaque;
+    tDot11fIEWFDIEOpaque    WFDIEOpaque;
+    tDot11fIEVHTCaps        VHTCaps;
 } tDot11fAssocRequest;
 
 #define DOT11F_ASSOCREQUEST ( 5 )
@@ -5779,6 +5914,8 @@
     tDot11fIEAirgo          Airgo;
     tDot11fIEWscAssocRes    WscAssocRes;
     tDot11fIEP2PAssocRes    P2PAssocRes;
+    tDot11fIEVHTCaps        VHTCaps;
+    tDot11fIEVHTOperation   VHTOperation;
 } tDot11fAssocResponse;
 
 #define DOT11F_ASSOCRESPONSE ( 6 )
@@ -5863,6 +6000,9 @@
     tDot11fIEAirgo            Airgo;
     tDot11fIEWscBeacon        WscBeacon;
     tDot11fIEP2PBeacon        P2PBeacon;
+    tDot11fIEVHTCaps          VHTCaps;
+    tDot11fIEVHTOperation     VHTOperation;
+    tDot11fIEVHTExtBssLoad    VHTExtBssLoad;
 } tDot11fBeacon;
 
 #define DOT11F_BEACON ( 8 )
@@ -5930,6 +6070,9 @@
     tDot11fIECCXTrafStrmMet   CCXTrafStrmMet;
     tDot11fIECCXTxmitPower    CCXTxmitPower;
     tDot11fIEP2PBeacon        P2PBeacon;
+    tDot11fIEVHTCaps          VHTCaps;
+    tDot11fIEVHTOperation     VHTOperation;
+    tDot11fIEVHTExtBssLoad    VHTExtBssLoad;
 } tDot11fBeacon2;
 
 #define DOT11F_BEACON2 ( 10 )
@@ -5985,6 +6128,9 @@
     tDot11fIEAirgo             Airgo;
     tDot11fIEWscBeaconProbeRes WscBeaconProbeRes;
     tDot11fIEP2PBeaconProbeRes P2PBeaconProbeRes;
+    tDot11fIEVHTCaps           VHTCaps;
+    tDot11fIEVHTOperation      VHTOperation;
+    tDot11fIEVHTExtBssLoad     VHTExtBssLoad;
 } tDot11fBeaconIEs;
 
 #define DOT11F_BEACONIES ( 11 )
@@ -6498,6 +6644,7 @@
     tDot11fIEWscProbeReq   WscProbeReq;
     tDot11fIEWFATPC        WFATPC;
     tDot11fIEP2PProbeReq   P2PProbeReq;
+    tDot11fIEVHTCaps       VHTCaps;
 } tDot11fProbeRequest;
 
 #define DOT11F_PROBEREQUEST ( 34 )
@@ -6553,6 +6700,9 @@
     tDot11fIEAirgo            Airgo;
     tDot11fIEWscProbeRes      WscProbeRes;
     tDot11fIEP2PProbeRes      P2PProbeRes;
+    tDot11fIEVHTCaps          VHTCaps;
+    tDot11fIEVHTOperation     VHTOperation;
+    tDot11fIEVHTExtBssLoad    VHTExtBssLoad;
 } tDot11fProbeResponse;
 
 #define DOT11F_PROBERESPONSE ( 35 )
@@ -6690,6 +6840,8 @@
     tDot11fIEWMMTSPEC           WMMTSPEC[4];
     tDot11fIECCXTrafStrmRateSet CCXTrafStrmRateSet;
     tDot11fIEP2PIEOpaque        P2PIEOpaque;
+    tDot11fIEWFDIEOpaque        WFDIEOpaque;
+    tDot11fIEVHTCaps            VHTCaps;
 } tDot11fReAssocRequest;
 
 #define DOT11F_REASSOCREQUEST ( 40 )
@@ -6734,6 +6886,8 @@
     tDot11fIEAirgo              Airgo;
     tDot11fIEWscReassocRes      WscReassocRes;
     tDot11fIEP2PAssocRes        P2PAssocRes;
+    tDot11fIEVHTCaps            VHTCaps;
+    tDot11fIEVHTOperation       VHTOperation;
 } tDot11fReAssocResponse;
 
 #define DOT11F_REASSOCRESPONSE ( 41 )
diff --git a/CORE/MAC/src/include/dphGlobal.h b/CORE/MAC/src/include/dphGlobal.h
index 56e5ed9..9a53caf 100644
--- a/CORE/MAC/src/include/dphGlobal.h
+++ b/CORE/MAC/src/include/dphGlobal.h
@@ -21,352 +21,638 @@
 
 /*
  *
+
  * Airgo Networks, Inc proprietary. All rights reserved.
  * Author:      Sandesh Goel
+
  * Date:        02/25/02
+
  * History:-
+
  * Date            Modified by    Modification Information
+
  * --------------------------------------------------------------------
+
  *
+
  */
 
+
 #ifndef __DPH_GLOBAL_H__
+
 #define __DPH_GLOBAL_H__
 
+
 #include "limGlobal.h"
+
 //#include "parserApi.h"
+
 #include "sirMacProtDef.h"
+
 #include "sirMacPropExts.h"
+
 #include "sirApi.h"
 
+
 /// Following determines whether statistics are maintained or not
+
 #define DPH_STATS
 
+
 /// traffic category not allowed
+
 #define DPH_TID_NOTALLOWED           0xFF
 
+
 /// Periodicity of invocation of rate adaptation (in ms)
+
 #define DPH_RATE_ADAPTATION_PERIOD     20
 
+
 // Rate indices
+
 #define DPH_PHY_RATE_1_INDEX     0
+
 #define DPH_PHY_RATE_2_INDEX     1
+
 #define DPH_PHY_RATE_5_5_INDEX   2
+
 #define DPH_PHY_RATE_11_INDEX    3
+
 #define DPH_PHY_RATE_6_INDEX     4
+
 #define DPH_PHY_RATE_9_INDEX     5
+
 #define DPH_PHY_RATE_12_INDEX    6
+
 #define DPH_PHY_RATE_18_INDEX    7
+
 #define DPH_PHY_RATE_24_INDEX    8
+
 #define DPH_PHY_RATE_36_INDEX    9
+
 #define DPH_PHY_RATE_48_INDEX   10
+
 #define DPH_PHY_RATE_54_INDEX   11
+
 #define DPH_PHY_RATE_72_INDEX   12
+
 #define DPH_PHY_RATE_96_INDEX   13
+
 #define DPH_PHY_RATE_108_INDEX  14
+
 #define DPH_PHY_RATE_144_INDEX  15
+
 #define DPH_PHY_RATE_MAX_INDEX  16
 
+
 /// Maximum time to wait for a management packet to go out (ms)
+
 #define DPH_MAX_MGMT_WAIT_TIME  10000
 
+
 /// Step size for the wait time histogram (ms)
+
 #define DPH_WAIT_HIST_STEP 20
 
+
 /// Number of entries in wait time histogram
+
 #define DPH_WAIT_HIST_SIZE  100
 
+
 /// TCID for Management & Keep Alive Mgmt frames
+
 #define DPH_MGMT_TCID                      4
+
 #define DPH_KEEPALIVE_PROBE_RESPONSE_TCID  0
 
+
 /// STAID for Management frames
+
 #define DPH_USE_MGMT_STAID  -1
 
+
 // Keep Alive frames
+
 #define DPH_NON_KEEPALIVE_FRAME  0
+
 #define DPH_KEEPALIVE_FRAME      1
 
+
 /// Mask for subtype, type, protocol version, order and wep fields in the mac frame control
+
 #define DPH_FC_BD_FILL_MASK  0xFFCC
 
+
 /// Enable/Disable Txop generation in TFP for HCF mode
+
 #define DPH_ENABLE_HCF_TXOP_GEN_AT_TFP   0x00
+
 #define DPH_DISABLE_HCF_TXOP_GEN_AT_TFP  0x02
 
+
 /// Enable/Disable Txop generation in TFP for EDCF mode
+
 #define DPH_ENABLE_EDCF_TXOP_GEN_AT_TFP   0x00
+
 #define DPH_DISABLE_EDCF_TXOP_GEN_AT_TFP  0x01
 
+
 #define DPH_DUMP_ALL_STA_ID     -1
+
 #define DPH_DUMP_RX_BD           0
+
 #define DPH_DUMP_TX_BD           1
+
 #define DPH_DUMP_TX_MGMT_BD      2
 
+
 //DPH Hash Index for BSS(STA's Peer) on station.
+
 #define DPH_STA_HASH_INDEX_PEER   1
 
+
 typedef struct sDphRateBasedCtr
+
 {
+
     tANI_U32 hi;
+
     tANI_U32 lo;
+
 } tDphRateBasedCtr;
 
+
 typedef struct sDphPhyRates
+
 {
+
     tANI_U8 dataRateX2;
+
     tANI_U8 ackRateX2;
+
     tANI_U8 rtsRateX2;
+
 } tDphPhyRates;
 
+
 typedef struct sDphIFSValues
+
 {
+
     tANI_U8 sifs;
+
     tANI_U8 pifs;
+
     tANI_U8 difs;
+
     tANI_U8 preamble;
+
 } tDphIFSValues;
 
+
 typedef struct sDphQosParams
+
 {
+
     tANI_U8                   addtsPresent;
+
     tSirAddtsReqInfo       addts;
+
     tSirMacQosCapabilityStaIE capability;
+
 } tDphQosParams;
 
+
 /// Queue attribute structure
+
 typedef struct sDphQueueAttr
+
 {
+
     tANI_U16     valid : 1;
+
     tANI_U16     seqNum : 12;
+
     tANI_U16     ackPolicy : 2;
+
     tANI_U16     rsvd : 1;
+
 } tDphQueueAttr, *tpDphQueueAttr;
 
+
 #if defined( FEATURE_WLAN_INTEGRATED_SOC )
+
 typedef struct sCfgTrafficClass {
+
     //Use Block ACK on this STA/TID
+
     // Fields used to store the default TC parameters for this TSPEC.
+
     // They will be used when the TSPEC is deleted.
+
     tANI_U8 fDisableTx:1;
+
     tANI_U8 fDisableRx:1;
+
     tANI_U8 fUseBATx:1;
+
     tANI_U8 fUseBARx:1;
 
+
     // 1: expect to see frames with compressed BA coming from this peer MAC
+
     tANI_U8 fRxCompBA:1;
+
     tANI_U8 fTxCompBA:1;
 
+
     // immediate ACK or delayed ACK for frames from this peer MAC
+
     tANI_U8 fRxBApolicy:1;
 
+
     // immediate ACK or delayed ACK for frames to this peer MAC
+
     tANI_U8 fTxBApolicy:1;
 
+
     //Initiator or recipient
+
     tANI_U8 role;
 
+
     //Max # of MSDU received from this STA, negotiated at ADDBA
+
     // used for maintaining block ack state info
+
     tANI_U16 rxBufSize;
 
+
     //Max # of MSDU send to this STA, negotiated at ADDBA
+
     tANI_U16 txBufSize;
 
+
     //BA timeout negotiated at ADDBA. Unit: TU
+
     tANI_U16 tuTxBAWaitTimeout; //Time for Tx to wait for BA. 0 means no timeout
 
+
     tANI_U16 tuRxBAWaitTimeout; //Time for Rx to wait for explicit/implicit BAR. 0 means no timeout
 
+
 } tCfgTrafficClass;
+
 #endif /* EATURE_WLAN_INTEGRATED_SOC */
 
+
 /// STA state node
+
 typedef struct sDphHashNode
+
 {
 
+
     //BYTE 0
+
     // HASH ENTRY FIELDS NOT NEEDED IN HAL.
+
     /// This STA valid or not
+
     tANI_U8   valid : 1;
+
     tANI_U8   encPolicy : 3;
+
     tANI_U8   defaultKey : 1;
+
     tANI_U8   defaultKeyId : 2;
+
     tANI_U8   qosMode : 1;
 
+
     //BYTE 1
+
     tANI_U8   erpEnabled : 1;
+
     tANI_U8   added : 1; // This has been added to the dph hash table
+
     tANI_U8   linkTestOn : 1;
+
     tANI_U8   shortPreambleEnabled : 1;
+
     tANI_U8   shortSlotTimeEnabled : 1;
+
     tANI_U8   stopTx:1;
+
     tANI_U8   wmeEnabled: 1; // set if both ap and sta are wme capable
+
     tANI_U8   lleEnabled: 1; // set if both ap and sta are 11e capable
 
+
     //BYTE 2
+
     tANI_U8   wsmEnabled: 1; // set if both ap and sta are wsm capable
+
     tANI_U8   versionPresent:1; // station gave version info
+
     tANI_U8   burstEnableForce:1; // allow bursting regardless of qosMode
+
     tANI_U8   staAuthenticated:1;    
+
     /// Whether the peer is ANI or not
+
     tANI_U8  aniPeer:1;
+
     tANI_U8   titanPeer:1;                // flag to indicate if its a titan peer    
+
     tANI_U8  fAniCount:1;
+
 #if (WNI_POLARIS_FW_PRODUCT == AP)
+
     tANI_U8   hcfEnabled : 1;
+
 #else
+
     tANI_U8   rsvd:1;
+
 #endif
 
+
     /// Fragmentation size
+
     tANI_U16   fragSize;
 
+
     /// LIM state
+
     tLimMlmStaContext mlmStaContext;
 
+
     /// Number of Tim to wait if the STA doesn't respond / fetch data
+
     tANI_U8  timWaitCount;
 
+
     /// Number of Successfull MPDU's being sent
+
     tANI_U32    curTxMpduCnt;
 
 
+
+
     /// number of consecutive TIMs sent without response
+
     tANI_U8  numTimSent;
 
+
     // qos parameter info
+
     tDphQosParams  qos;
 
+
     // station version info - valid only if versionPresent is set
+
     tSirMacPropVersion version;
+
     // station proprietary capability
+
     tANI_U16                propCapability;
 
+
 #ifdef PLM_WDS
+
     tANI_U8  wdsIndex;
+
     tANI_U8  wdsPeerBeaconSeen;
+
 #endif
 
+
    //Taurus capabilities
+
    tANI_U16 baPolicyFlag;                 //BA Policy for each TID. 
 
+
     /*
+
     * All the legacy and airgo supported rates.
+
     */
+
     tSirSupportedRates supportedRates;
 
+
     tANI_U8 htGreenfield:1;
+
     tANI_U8 htShortGI40Mhz:1;
+
     tANI_U8 htShortGI20Mhz:1;
+
     // DSSS/CCK at 40 MHz: Enabled 1 or Disabled
+
     tANI_U8 htDsssCckRate40MHzSupport:1;
+
     // L-SIG TXOP Protection used only if peer support available
+
     tANI_U8 htLsigTXOPProtection:1;
+
     // A-MPDU Density
+
     // 000 - No restriction
+
     // 001 - 1/8 usec
+
     // 010 - 1/4 usec
+
     // 011 - 1/2 usec
+
     // 100 - 1 usec
+
     // 101 - 2 usec
+
     // 110 - 4 usec
+
     // 111 - 8 usec
+
     //
+
     tANI_U8 htAMpduDensity:3;
 
 
+
+
     //Set to 0 for 3839 octets
+
     //Set to 1 for 7935 octets
+
     tANI_U8 htMaxAmsduLength;
 
 
+
+
     // MIMO Power Save
+
     tSirMacHTMIMOPowerSaveState htMIMOPSState;
 
+
     //
 
+
     // Maximum Rx A-MPDU factor
+
     tANI_U8 htMaxRxAMpduFactor:2;
+
     //
+
     // Recommended Tx Width Set
+
     // 0 - use 20 MHz channel (control channel)
+
     // 1 - use 40 Mhz channel
+
     //
+
     tANI_U8 htSupportedChannelWidthSet:1;
-    tANI_U8 rsvd1:5;
+    tANI_U8 htSecondaryChannelOffset:2;
+    tANI_U8 rsvd1:3;
+
 
     ///////////////////////////////////////////////////////////////////////
+
     // DPH HASH ENTRY FIELDS NEEDED IN HAL ONLY
+
     ///////////////////////////////////////////////////////////////////////
+
     tANI_U8 dpuSig:4;                       // DPU signiture
+
     tANI_U8 staSig:4;                       // STA signature
+
     tANI_U8 staType;
 
+
     tANI_U16 bssId;                          // BSSID
+
     tANI_U16 assocId;                       // Association ID
 
 
+
+
     //This is the real sta index generated by HAL
+
     tANI_U16 staIndex;
+
     tANI_U8    staAddr[6];
+
     /*The DPU signatures will be sent eventually to TL to help it determine the 
+
       association to which a packet belongs to*/
+
     /*Unicast DPU signature*/
+
     tANI_U8     ucUcastSig;
 
+
     /*Broadcast DPU signature*/
+
     tANI_U8     ucBcastSig;
 
+
     //
+
     // PE needs this info on a per-STA, per-TID basis
+
     // At any point in time, when this data is sampled,
+
     // it gives a measure of:
+
     // a) All the active bA sessions
+
     // b) And the BA configuration itself
+
     //
+
     tCfgTrafficClass tcCfg[STACFG_MAX_TC];
 
+
     // Block Ack state
+
     // This is used between PE and HAL only.
+
     // can be set to one of the values from the following enum
+
     /*typedef enum eLimBAState
+
     {
+
         eLIM_BA_STATE_IDLE, // we are not waiting for anything from HAL.
+
         eLIM_BA_STATE_WT_ADD_RSP, //We are waiting for Add rsponse from HAL.
+
         eLIM_BA_STATE_WT_DEL_RSP //  We are waiting for Del response from HAL.
+
     } tLimBAState; */
 
 
+
+
     //BA state bitmap 2 bits per tid
+
     // BA state for tid i  = (baState >> tid*2) & 0x3
+
     tANI_U32 baState;
 
+#ifdef WLAN_FEATURE_11AC
+    tANI_U8  vhtSupportedChannelWidthSet;
+#endif
+
     /* When a station with already an existing dph entry tries to 
+
      * associate again, the old dph entry will be zeroed out except 
+
      * for the next pointer. The next pointer must be defined at the  
+
      * end of the structure.
+
      */
+
     struct sDphHashNode  *next;
 
+
 } tDphHashNode, *tpDphHashNode;
 
+
 #include "dphHashTable.h"
 
+
 // -------------------------------------------------------------------
 
+
 // get protection overrides from config variable
+
 // bit0: force cts to self protection for tx to Airgo peers
+
 // bit1: force cts to self protection for tx to non Airgo peers
+
 #define DPH_PROT_OVERRIDE_NONANI_PEER_GET(cfgval)    ((cfgval) & 1)
+
 #define DPH_PROT_OVERRIDE_ANI_PEER_GET(cfgval) (((cfgval) & 2) >> 1)
 
+
 typedef struct sAniSirDph
+
 {
+
     /// The hash table object
+
     dphHashTableClass dphHashTable;
+
 } tAniSirDph, *tpAniSirDph;
 
+
 #endif
 
 
+
+
diff --git a/CORE/MAC/src/include/parserApi.h b/CORE/MAC/src/include/parserApi.h
index ac63e09..a28f43d 100644
--- a/CORE/MAC/src/include/parserApi.h
+++ b/CORE/MAC/src/include/parserApi.h
@@ -124,6 +124,12 @@
     tANI_U8                   mdiePresent;
 #endif
 
+#ifdef WLAN_FEATURE_11AC
+    tDot11fIEVHTCaps          VHTCaps;
+    tDot11fIEVHTOperation     VHTOperation;
+    tDot11fIEVHTExtBssLoad    VHTExtBssLoad;
+#endif
+
 } tSirProbeRespBeacon, *tpSirProbeRespBeacon;
 
 // probe Request structure
@@ -139,6 +145,10 @@
     tANI_U8                   extendedRatesPresent;
     tANI_U8                   wscIePresent;
     tANI_U8                   p2pIePresent;
+#ifdef WLAN_FEATURE_11AC
+    tDot11fIEVHTCaps          VHTCaps;
+#endif
+
 
 } tSirProbeReq, *tpSirProbeReq;
 
@@ -191,6 +201,9 @@
     tANI_U32                  assocReqFrameLength;
     tANI_U8*                  assocReqFrame;
 #endif
+#ifdef WLAN_FEATURE_11AC
+    tDot11fIEVHTCaps          VHTCaps;
+#endif
 } tSirAssocReq, *tpSirAssocReq;
 
 
@@ -238,6 +251,10 @@
     tANI_U8                   tspecPresent;
     tANI_U8                   tsmPresent;
 #endif    
+#ifdef WLAN_FEATURE_11AC
+    tDot11fIEVHTCaps          VHTCaps;
+    tDot11fIEVHTOperation     VHTOperation;
+#endif
 } tSirAssocRsp, *tpSirAssocRsp;
 
 tANI_U8
@@ -423,12 +440,14 @@
 /// Populate a tDot11fIEChanSwitchAnn
 void
 PopulateDot11fChanSwitchAnn(tpAniSirGlobal          pMac,
-                            tDot11fIEChanSwitchAnn *pDot11f);
+                            tDot11fIEChanSwitchAnn *pDot11f,
+                            tpPESession psessionEntry);
 
 /// Populate a tDot11fIEChanSwitchAnn
 void
 PopulateDot11fExtChanSwitchAnn(tpAniSirGlobal          pMac,
-                             tDot11fIEExtChanSwitchAnn *pDot11f);
+                             tDot11fIEExtChanSwitchAnn *pDot11f,
+                             tpPESession psessionEntry);
 
 /// Populate a tDot11fIECountry
 tSirRetStatus
@@ -498,7 +517,8 @@
 
 tSirRetStatus
 PopulateDot11fHTCaps(tpAniSirGlobal           pMac,
-                             tDot11fIEHTCaps *pDot11f);
+                           tpPESession      psessionEntry,
+                           tDot11fIEHTCaps *pDot11f);
 
 #ifdef WLAN_SOFTAP_FEATURE
 tSirRetStatus
@@ -843,3 +863,15 @@
                            tpSirRSNie pRsnIe,
                            tANI_U8 EID);
 #endif
+
+#ifdef WLAN_FEATURE_11AC
+tSirRetStatus
+PopulateDot11fVHTCaps(tpAniSirGlobal  pMac, tDot11fIEVHTCaps *pDot11f);
+
+tSirRetStatus
+PopulateDot11fVHTOperation(tpAniSirGlobal  pMac, tDot11fIEVHTOperation  *pDot11f);
+
+tSirRetStatus
+PopulateDot11fVHTExtBssLoad(tpAniSirGlobal  pMac, tDot11fIEVHTExtBssLoad   *pDot11f);
+
+#endif
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 02da0c9..02bec73 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -49,13 +49,32 @@
 #if defined( FEATURE_WLAN_INTEGRATED_SOC )
 typedef enum
 {
-    PHY_SINGLE_CHANNEL_CENTERED = 0,        // 20MHz IF bandwidth centered on IF carrier
-    PHY_DOUBLE_CHANNEL_LOW_PRIMARY = 1,     // 40MHz IF bandwidth with lower 20MHz supporting the primary channel
-    //not allowed PHY_DOUBLE_CHANNEL_CENTERED = 2,        // 40MHz IF bandwidth centered on IF carrier
-    PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3     // 40MHz IF bandwidth with higher 20MHz supporting the primary channel
+    PHY_SINGLE_CHANNEL_CENTERED     = 0,        // 20MHz IF bandwidth centered on IF carrier
+    PHY_DOUBLE_CHANNEL_LOW_PRIMARY  = 1,        // 40MHz IF bandwidth with lower 20MHz supporting the primary channel
+    PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3,        // 40MHz IF bandwidth with higher 20MHz supporting the primary channel
+#ifdef WLAN_FEATURE_11AC    
+    PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED = 4, //20/40MHZ offset LOW 40/80MHZ offset CENTERED
+    PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED = 5, //20/40MHZ offset CENTERED 40/80MHZ offset CENTERED
+    PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED = 6, //20/40MHZ offset HIGH 40/80MHZ offset CENTERED
+    PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW = 7,//20/40MHZ offset LOW 40/80MHZ offset LOW
+    PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW = 8, //20/40MHZ offset HIGH 40/80MHZ offset LOW
+    PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH = 9, //20/40MHZ offset LOW 40/80MHZ offset HIGH
+    PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH = 10,//20/40MHZ offset-HIGH 40/80MHZ offset HIGH
+#endif
+    PHY_CHANNEL_BONDING_STATE_MAX   = 11
 }ePhyChanBondState;
 #endif /* FEATURE_WLAN_INTEGRATED_SOC */
 
+#define SIR_MIN(a,b)   (((a) < (b)) ? (a) : (b))
+#define SIR_MAX(a,b)   (((a) > (b)) ? (a) : (b))
+
+typedef enum {
+   MCC	   = 0,
+   P2P	   = 1,
+   DOT11AC = 2,
+   MAX_FEATURE_SUPPORTED = 128,
+} placeHolderInCapBitmap;
+
 typedef enum eSriLinkState {
     eSIR_LINK_IDLE_STATE        = 0,
     eSIR_LINK_PREASSOC_STATE    = 1,
@@ -135,7 +154,10 @@
      */
     tANI_U16 msgLen;
 
-    tANI_U32 sessionId;
+    tANI_U8 sessionId;
+    tANI_U8 noack;
+    tANI_U16 wait;
+
     /**
      * This is the first data word in the mailbox message.
      * It is followed by n words of data.
@@ -423,6 +445,12 @@
 #ifdef ANI_CHIPSET_VOLANS
 /* PE <-> HAL addr2 mismatch message */
 #define SIR_LIM_ADDR2_MISS_IND             SIR_HAL_ITC_MSG_TYPES_BEGIN + 142
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/* PE <-> HAL OEM_DATA RELATED MESSAGES */
+#define SIR_HAL_START_OEM_DATA_REQ         SIR_HAL_ITC_MSG_TYPES_BEGIN + 143
+#define SIR_HAL_START_OEM_DATA_RSP       SIR_HAL_ITC_MSG_TYPES_BEGIN + 144
+#define SIR_HAL_FINISH_OEM_DATA_REQ      SIR_HAL_ITC_MSG_TYPES_BEGIN + 145
+#endif
 #endif
 
 #define SIR_HAL_SET_MAX_TX_POWER_REQ       SIR_HAL_ITC_MSG_TYPES_BEGIN + 146
@@ -519,10 +547,10 @@
 // LIM message types
 #define SIR_LIM_MSG_TYPES_BEGIN        (SIR_LIM_MODULE_ID << 8)
 #define SIR_LIM_ITC_MSG_TYPES_BEGIN    SIR_LIM_MSG_TYPES_BEGIN+0xB0
+
 // Messages to/from HAL
-#define SIR_LIM_RESUME_ACTIVITY_NTF        SIR_LIM_ITC_MSG_TYPES_BEGIN
-#define SIR_LIM_SUSPEND_ACTIVITY_REQ       SIR_LIM_ITC_MSG_TYPES_BEGIN + 1
-#define SIR_HAL_SUSPEND_ACTIVITY_RSP       SIR_LIM_ITC_MSG_TYPES_BEGIN + 2
+// Removed as part of moving HAL down to FW
+
 // Message from ISR upon TFP retry interrupt
 #define SIR_LIM_RETRY_INTERRUPT_MSG        SIR_LIM_ITC_MSG_TYPES_BEGIN + 3
 // Message from BB Transport
diff --git a/CORE/MAC/src/pe/include/limAdmitControl.h b/CORE/MAC/src/pe/include/limAdmitControl.h
index 158a94a..123564a 100644
--- a/CORE/MAC/src/pe/include/limAdmitControl.h
+++ b/CORE/MAC/src/pe/include/limAdmitControl.h
@@ -92,7 +92,7 @@
 tSirRetStatus limAdmitControlInit(tpAniSirGlobal pMac);
 
 tSirRetStatus limSendHalMsgAddTs(tpAniSirGlobal pMac, tANI_U16 staIdx, tANI_U8 tspecIdx, tSirMacTspecIE tspecIE, tANI_U8 sessionId);
-tSirRetStatus limSendHalMsgDelTs(tpAniSirGlobal pMac,  tANI_U16 staIdx,  tANI_U8 tspecIdx,  tSirDeltsReqInfo delts);
+tSirRetStatus limSendHalMsgDelTs(tpAniSirGlobal pMac,  tANI_U16 staIdx,  tANI_U8 tspecIdx,  tSirDeltsReqInfo delts, tANI_U8 sessionId);
 void limProcessHalAddTsRsp(tpAniSirGlobal pMac, tpSirMsgQ limMsg);
 
 #endif
diff --git a/CORE/MAC/src/pe/include/limApi.h b/CORE/MAC/src/pe/include/limApi.h
index e0f2a4d..7e1a88a 100644
--- a/CORE/MAC/src/pe/include/limApi.h
+++ b/CORE/MAC/src/pe/include/limApi.h
@@ -33,7 +33,6 @@
  */
 #ifndef __LIM_API_H
 #define __LIM_API_H
-
 #include "wniApi.h"
 #include "sirApi.h"
 #include "aniGlobal.h"
@@ -51,17 +50,12 @@
 #include "wlan_qct_wdi_ds.h"
 #endif
 #include "wlan_qct_wda.h"
-
 #define LIM_POL_SYS_SCAN_MODE      0
 #define LIM_POL_SYS_LEARN_MODE     1
 
-
 /* Macro to count heartbeat */
-
 #define limResetHBPktCount(psessionEntry)   (psessionEntry->LimRxedBeaconCntDuringHB = 0)
 
-
-
 /* Useful macros for fetching various states in pMac->lim */
 /* gLimSystemRole */
 #define GET_LIM_SYSTEM_ROLE(psessionEntry)      (psessionEntry->limSystemRole)
@@ -80,9 +74,7 @@
 /* gLimQuietState */
 #define GET_LIM_QUIET_STATE(pMac)               (pMac->lim.gLimSpecMgmt.quietState)
 #define SET_LIM_QUIET_STATE(pMac, state)        (pMac->lim.gLimSpecMgmt.quietState = state)
-
 #define LIM_IS_CONNECTION_ACTIVE(psessionEntry)  (psessionEntry->LimRxedBeaconCntDuringHB)
-
 /*pMac->lim.gLimProcessDefdMsgs*/
 #define GET_LIM_PROCESS_DEFD_MESGS(pMac) (pMac->lim.gLimProcessDefdMsgs)
 #define SET_LIM_PROCESS_DEFD_MESGS(pMac, val) (pMac->lim.gLimProcessDefdMsgs = val)
@@ -94,7 +86,6 @@
 #define LIM_SET_RADAR_DETECTED(pMac, val)   (pMac->lim.gLimSpecMgmt.fRadarDetCurOperChan = val)
 #define LIM_MIN_BCN_PR_LENGTH  12
 #define LIM_BCN_PR_CAPABILITY_OFFSET 10
-
 typedef enum eMgmtFrmDropReason
 {
     eMGMT_DROP_NO_DROP,
@@ -106,11 +97,8 @@
 }tMgmtFrmDropReason;
 
 
-
-
 /// During TD ring clean up at HDD in RTAI, will call this call back
 extern void limPostTdDummyPktCallbak(void* pMacGlobals, unsigned int* pBd);
-
 /**
  * Function to initialize LIM state machines.
  * This called upon LIM thread creation.
@@ -125,47 +113,32 @@
  * Function to Initialize radar interrupts.
  */
 void limRadarInit(tpAniSirGlobal pMac);
-
 tSirRetStatus peStart(tpAniSirGlobal pMac);
 void peStop(tpAniSirGlobal pMac);
 tSirRetStatus pePostMsgApi(tpAniSirGlobal pMac, tSirMsgQ* pMsg);
 tSirRetStatus peProcessMsg(tpAniSirGlobal pMac, tSirMsgQ* limMsg);
 void limDumpInit(tpAniSirGlobal pMac);
-
 /**
  * Function to cleanup LIM state.
  * This called upon reset/persona change etc
  */
 extern void limCleanup(tpAniSirGlobal);
-
 /// Function to post messages to LIM thread
 extern tANI_U32  limPostMsgApi(tpAniSirGlobal, tSirMsgQ *);
-
 /**
  * Function to fetch messages posted LIM thread
  */
 extern void limProcessMessageQueue(tpAniSirGlobal);
-
 /**
  * Function to process messages posted to LIM thread
  * and dispatch to various sub modules within LIM module.
  */
 extern void limMessageProcessor(tpAniSirGlobal, tpSirMsgQ);
 extern void limProcessMessages(tpAniSirGlobal, tpSirMsgQ); // DT test alt deferred 2
-
-/**
- * Function to check the LIM state if system can be put in
- * Learn Mode.
- * This is called by SCH upon receiving SCH_START_LEARN_MODE
- * message from LIM.
- */
-extern tSirRetStatus limCheckStateForLearnMode(tpAniSirGlobal);
-
 /**
  * Function to check the LIM state if system is in Scan/Learn state.
  */
 extern tANI_U8 limIsSystemInScanState(tpAniSirGlobal);
-
 #if (defined(ANI_PRODUCT_TYPE_AP) || defined(ANI_PRODUCT_TYPE_AP_SDK))
 /**
  * Function to setup Polaris into Learn mode.
@@ -173,14 +146,11 @@
  * message from LIM.
  */
 extern void limSetLearnMode(tpAniSirGlobal);
-
 /**
  * Function to re-enable Learn mode measurements
  */
 extern void limReEnableLearnMode(tpAniSirGlobal);
-
 #endif //#if (defined(ANI_PRODUCT_TYPE_AP) || defined(ANI_PRODUCT_TYPE_AP_SDK))
-
 /**
  * Function to handle IBSS coalescing.
  * Beacon Processing module to call this.
@@ -188,32 +158,23 @@
 extern tSirRetStatus limHandleIBSScoalescing(tpAniSirGlobal,
                                               tpSchBeaconStruct,
                                               tANI_U8 *,tpPESession);
-
 /// Function used by other Sirius modules to read global SME state
  static inline tLimSmeStates
 limGetSmeState(tpAniSirGlobal pMac) { return pMac->lim.gLimSmeState; }
-
 /// Function used by other Sirius modules to read global system role
  static inline tLimSystemRole
 limGetSystemRole(tpPESession psessionEntry) { return psessionEntry->limSystemRole; }
-
 //limGetAID(tpPESession psessionEntry) { return psessionEntry->limAID; }
-
 extern void limReceivedHBHandler(tpAniSirGlobal, tANI_U8, tpPESession);
 //extern void limResetHBPktCount(tpPESession);
-
 extern void limCheckAndQuietBSS(tpAniSirGlobal);
-
 /// Function to send WDS info to WSM if needed
 extern void limProcessWdsInfo(tpAniSirGlobal, tSirPropIEStruct);
-
 /// Function to initialize WDS info params
 extern void limInitWdsInfoParams(tpAniSirGlobal);
-
 /// Function that triggers STA context deletion
 extern void limTriggerSTAdeletion(tpAniSirGlobal pMac, tpDphHashNode pStaDs, tpPESession psessionEntry);
 
-
 /// Function that checks for change in AP's capabilties on STA
 extern void limDetectChangeInApCapabilities(tpAniSirGlobal,
                                              tpSirProbeRespBeacon,tpPESession);
@@ -221,62 +182,46 @@
                                                             tpSirProbeRespBeacon pBeacon, 
                                                             tpUpdateBeaconParams pBeaconParams,tpPESession);
 
-
 /// creates an addts request action frame and sends it out to staid
 extern void limSendAddtsReq (tpAniSirGlobal pMac, tANI_U16 staid, tANI_U8 tsid, tANI_U8 userPrio, tANI_U8 wme);
 /// creates a delts request action frame and sends it out to staid
 extern void limSendDeltsReq (tpAniSirGlobal pMac, tANI_U16 staid, tANI_U8 tsid, tANI_U8 userPrio, tANI_U8 wme);
 /// creates a SM Power State Mode update request action frame and sends it out to staid
 extern void limPostStartLearnModeMsgToSch(tpAniSirGlobal pMac);
-
-extern ePhyChanBondState limGetPhyCBState( tpAniSirGlobal pMac );
-tSirMacHTSecondaryChannelOffset    limGetHTCBState(tAniCBSecondaryMode aniCBMode);
-tAniCBSecondaryMode     limGetAniCBState( tSirMacHTSecondaryChannelOffset htCBMode) ;
-
-
-
-
-
+#ifdef WLAN_FEATURE_11AC
+extern ePhyChanBondState limGet11ACPhyCBState(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 htSecondaryChannelOffset );
+#endif
 tANI_U8 limIsSystemInActiveState(tpAniSirGlobal pMac);
-
 #if 0 /* Currently, this function is not used but keep it around for when we do need it */
 tSirRetStatus limUpdateGlobalChannelBonding(tpAniSirGlobal pMac, tHalBitVal cbBit);
 #endif /* 0 */
 
-
 #if (WNI_POLARIS_FW_PACKAGE == ADVANCED) && (WNI_POLARIS_FW_PRODUCT == AP)
 extern void setupQuietBss( tpAniSirGlobal pMac, tANI_U32 learnInterval );
 extern tANI_BOOLEAN limUpdateQuietIEInBeacons( tpAniSirGlobal pMac );
 #endif
-
 #ifdef ANI_AP_SDK
 extern void limConvertScanDuration(tpAniSirGlobal pMac);
 #endif /* ANI_AP_SDK */
-
 #if (WNI_POLARIS_FW_PRODUCT == AP)
 tSirRetStatus limProcessCcaMonitorModeChangeNotification(tpAniSirGlobal pMac, tANI_U32 ccaCbMode);
 #endif /* WNI_POLARIS_FW_PRODUCT == AP */
-
 void limHandleLowRssiInd(tpAniSirGlobal pMac);
 void limHandleBmpsStatusInd(tpAniSirGlobal pMac);
 void limHandleMissedBeaconInd(tpAniSirGlobal pMac);
 tMgmtFrmDropReason limIsPktCandidateForDrop(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tANI_U32 subType);
 void limMicFailureInd(tpAniSirGlobal pMac, tpSirMsgQ pMsg);
-
-
 /* ----------------------------------------------------------------------- */
 // These used to be in DPH
 extern void limSetBssid(tpAniSirGlobal pMac, tANI_U8 *bssId);
 extern void limGetBssid(tpAniSirGlobal pMac, tANI_U8 *bssId);
 extern void limGetMyMacAddr(tpAniSirGlobal pMac, tANI_U8 *mac);
 extern tSirRetStatus limCheckRxSeqNumber(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo);
-
 #define limGetQosMode(psessionEntry, pVal) *(pVal) = (psessionEntry)->limQosEnabled
 #define limGetWmeMode(psessionEntry, pVal) *(pVal) = (psessionEntry)->limWmeEnabled
 #define limGetWsmMode(psessionEntry, pVal) *(pVal) = (psessionEntry)->limWsmEnabled
 #define limGet11dMode(psessionEntry, pVal) *(pVal) = (psessionEntry)->lim11dEnabled
 #define limGetAckPolicy(pMac, pVal)         *(pVal) = pMac->lim.ackPolicy
-
 /* ----------------------------------------------------------------------- */
 static inline void limGetPhyMode(tpAniSirGlobal pMac, tANI_U32 *phyMode, tpPESession psessionEntry)
 {
@@ -301,9 +246,7 @@
   \return  tANI_U32 - TX_SUCCESS for success.
   
   --------------------------------------------------------------------------*/
-
 tSirRetStatus peProcessMessages(tpAniSirGlobal pMac, tSirMsgQ* pMsg);
-
 /** -------------------------------------------------------------
 \fn peFreeMsg
 \brief Called by VOS scheduler (function vos_sched_flush_mc_mqs)
@@ -315,7 +258,5 @@
 \return none
 -----------------------------------------------------------------*/
 v_VOID_t peFreeMsg( tpAniSirGlobal pMac, tSirMsgQ* pMsg);
-
 /************************************************************/
 #endif /* __LIM_API_H */
-
diff --git a/CORE/MAC/src/pe/include/limGlobal.h b/CORE/MAC/src/pe/include/limGlobal.h
index d35a6de..7061a68 100644
--- a/CORE/MAC/src/pe/include/limGlobal.h
+++ b/CORE/MAC/src/pe/include/limGlobal.h
@@ -363,6 +363,7 @@
 
 #ifdef WLAN_FEATURE_P2P
     tANI_BOOLEAN   p2pSearch;
+    tANI_BOOLEAN   skipDfsChnlInP2pSearch;
 #endif
     tANI_U16           uIEFieldLen;
     tANI_U16           uIEFieldOffset;
@@ -395,6 +396,27 @@
     tSirBssDescription bssDescription;
 };
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+#ifndef OEM_DATA_REQ_SIZE 
+#define OEM_DATA_REQ_SIZE 70
+#endif
+#ifndef OEM_DATA_RSP_SIZE
+#define OEM_DATA_RSP_SIZE 968
+#endif
+
+// OEM Data related structure definitions
+typedef struct sLimMlmOemDataReq
+{
+    tSirMacAddr           selfMacAddr;
+    tANI_U8               oemDataReq[OEM_DATA_REQ_SIZE];
+} tLimMlmOemDataReq, *tpLimMlmOemDataReq;
+
+typedef struct sLimMlmOemDataRsp
+{
+   tANI_U8                oemDataRsp[OEM_DATA_RSP_SIZE];
+} tLimMlmOemDataRsp, *tpLimMlmOemDataRsp;
+#endif
 
 // Pre-authentication structure definition
 typedef struct tLimPreAuthNode
@@ -438,6 +460,9 @@
     tANI_U8                 schClean:1;
     // 802.11n HT Capability in Station: Enabled 1 or DIsabled 0
     tANI_U8                 htCapability:1;
+#ifdef WLAN_FEATURE_11AC
+    tANI_U8                 vhtCapability:1;
+#endif
 } tLimMlmStaContext, *tpLimMlmStaContext;
 
 // Structure definition to hold deferred messages queue parameters
@@ -615,7 +640,7 @@
 {
     tLimChannelSwitchState   state;
     tANI_U8                  primaryChannel;
-    tAniCBSecondaryMode      secondarySubBand;
+    ePhyChanBondState        secondarySubBand;
     tANI_U32                 switchCount;
     tANI_U32                 switchTimeoutValue;
     tANI_U8                  switchMode;
diff --git a/CORE/MAC/src/pe/include/limSession.h b/CORE/MAC/src/pe/include/limSession.h
index 5f72af4..b98ac47 100644
--- a/CORE/MAC/src/pe/include/limSession.h
+++ b/CORE/MAC/src/pe/include/limSession.h
@@ -97,7 +97,16 @@
     void                    *pLimMlmReassocReq;      //handle to MLM reassoc Req
     tANI_U16                channelChangeReasonCode;
     tANI_U8                 dot11mode;
-    tANI_U8                 htCapabality;
+    tANI_U8                 htCapability;
+    /* Supported Channel Width Set: 0-20MHz 1 - 40MHz */
+    tANI_U8                 htSupportedChannelWidthSet;
+    /* Recommended Tx Width Set
+     * 0 - use 20 MHz channel (control channel)
+     * 1 - use channel width enabled under Supported Channel Width Set
+     */
+    tANI_U8                 htRecommendedTxWidthSet;
+    /* Identifies the 40 MHz extension channel */
+    ePhyChanBondState       htSecondaryChannelOffset;
     tSirRFBand              limRFBand;
     tANI_U8                 limIbssActive;          //TO SUPPORT CONCURRENCY
 
@@ -107,17 +116,19 @@
     tANI_U8                 limCurrentBssQosCaps;
     tANI_U16                limCurrentBssPropCap;
     tANI_U8                 limSentCapsChangeNtf;
-    tANI_U32                limCurrentTitanHtCaps;
     tANI_U16                limAID;
 
     /* Parameters  For Reassociation */
     tSirMacAddr             limReAssocbssId;
     tSirMacChanNum          limReassocChannelId;
+    /* CB paramaters required/duplicated for Reassoc since re-assoc mantains its own params in lim */
+    tANI_U8                 reAssocHtSupportedChannelWidthSet;
+    tANI_U8                 reAssocHtRecommendedTxWidthSet;
+    ePhyChanBondState       reAssocHtSecondaryChannelOffset;
     tSirMacSSid             limReassocSSID;
     tANI_U16                limReassocBssCaps;
     tANI_U8                 limReassocBssQosCaps;
     tANI_U16                limReassocBssPropCap;
-    tANI_U32                limReassocTitanHtCaps;
 
     // Assoc or ReAssoc Response Data/Frame
     void                   *limAssocResponseData;
@@ -288,12 +299,22 @@
     tANI_U8  gLimEdcaParamSetCount;
 
     tBeaconParams beaconParams;
-
+#ifdef WLAN_FEATURE_11AC
+    tANI_U8 vhtCapability;
+    tANI_U8 vhtTxChannelWidthSet;
+#endif
     tANI_U8            spectrumMgtEnabled;
+    /* *********************11H related*****************************/
+    //tANI_U32           gLim11hEnable;
+    tLimSpecMgmtInfo   gLimSpecMgmt;
+    // CB Primary/Secondary Channel Switch Info
+    tLimChannelSwitchInfo  gLimChannelSwitch;
+    /* *********************End 11H related*****************************/
 
     /*Flag to Track Status/Indicate HBFailure on this session */
     tANI_BOOLEAN LimHBFailureStatus;
     tANI_U32           gLimPhyMode;
+
 }tPESession, *tpPESession;
 
 #define LIM_MAX_ACTIVE_SESSIONS 4
diff --git a/CORE/MAC/src/pe/include/limTrace.h b/CORE/MAC/src/pe/include/limTrace.h
index f0c2a1b..062ddb3 100644
--- a/CORE/MAC/src/pe/include/limTrace.h
+++ b/CORE/MAC/src/pe/include/limTrace.h
@@ -107,6 +107,7 @@
 
 
 #define MTRACE(p) p
+#define NO_SESSION 0xFF
 
 #else
 #define MTRACE(p) {  }
diff --git a/CORE/MAC/src/pe/lim/limAdmitControl.c b/CORE/MAC/src/pe/lim/limAdmitControl.c
index d14e56a..ec69451 100644
--- a/CORE/MAC/src/pe/lim/limAdmitControl.c
+++ b/CORE/MAC/src/pe/lim/limAdmitControl.c
@@ -1099,7 +1099,7 @@
      * WDA_ADD_TS_RSP from HAL.
      */
     SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
-    MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+    MTRACE(macTraceMsgTx(pMac, sessionId, msg.type));
 
     if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
     {
@@ -1126,7 +1126,8 @@
   tpAniSirGlobal pMac,
   tANI_U16       staIdx,
   tANI_U8         tspecIdx,
-  tSirDeltsReqInfo delts)
+  tSirDeltsReqInfo delts,
+  tANI_U8        sessionId)
 {
   tSirMsgQ msg;
   tpDelTsParams pDelTsParam;
@@ -1147,7 +1148,7 @@
   pDelTsParam->tspecIdx = tspecIdx;
 
   PELOGW(limLog(pMac, LOGW, FL("calling wdaPostCtrlMsg()\n"));)
-  MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+  MTRACE(macTraceMsgTx(pMac, sessionId, msg.type));
 
   if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
   {
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index 7b4fac0..aac103b 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -235,7 +235,7 @@
     pMac->lim.gLimPrevSmeState = eLIM_SME_OFFLINE_STATE;
 
     /// MLM State visible across all Sirius modules
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, eLIM_MLM_IDLE_STATE));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, eLIM_MLM_IDLE_STATE));
     pMac->lim.gLimMlmState = eLIM_MLM_IDLE_STATE;
 
     /// Previous MLM State
@@ -248,15 +248,15 @@
 
 #ifdef FEATURE_WLAN_INTEGRATED_SOC
     /**
-     * Initialize state to eLIM_MLM_OFFLINE_STATE
+     * Initialize state to eLIM_SME_OFFLINE_STATE
      */
-    pMac->lim.gLimSmeState     = eLIM_MLM_OFFLINE_STATE;
+    pMac->lim.gLimSmeState     = eLIM_SME_OFFLINE_STATE;
 #else
     /**
      * Initialize state to suspended state and wait for
      * HAL to send LIM_RESUME_ACTIVITY_NTF message.
      */
-    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
     pMac->lim.gLimSmeState     = eLIM_SME_SUSPEND_STATE;
 #endif /* FEATURE_WLAN_INTEGRATED_SOC */
 
@@ -275,7 +275,6 @@
     pMac->lim.gLimPhyMode = 0; 
     pMac->lim.scanStartTime = 0;    // used to measure scan time
 
-    palZeroMemory(pMac->hHdd, pMac->lim.gLimBssid, sizeof(pMac->lim.gLimBssid));
     palZeroMemory(pMac->hHdd, pMac->lim.gLimMyMacAddr, sizeof(pMac->lim.gLimMyMacAddr));
     pMac->lim.ackPolicy = 0;
 
@@ -325,20 +324,11 @@
     palZeroMemory(pMac->hHdd, &pMac->lim.gLimAlternateRadio, sizeof(tSirAlternateRadioInfo));
     SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
 
+#if 0
     // 11h Spectrum Management Related Flag
-    //pMac->lim.gLim11hEnable = 0;
-    pMac->lim.gLimSpecMgmt.dot11hChanSwState = eLIM_11H_CHANSW_INIT;
     LIM_SET_RADAR_DETECTED(pMac, eANI_BOOLEAN_FALSE);
     pMac->sys.gSysEnableLearnMode = eANI_BOOLEAN_TRUE;
-
-    // 11h Quiet Element Related Flag
-    pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
-    // A count-down value, used on the AP, to send out the
-    // Quiet BSS IE in that many Beacon's
-    pMac->lim.gLimSpecMgmt.quietCount = 0;
-    pMac->lim.gLimSpecMgmt.fQuietEnabled = eANI_BOOLEAN_FALSE;
-    pMac->lim.gLimSpecMgmt.fRadarIntrConfigured = eANI_BOOLEAN_FALSE;
-
+#endif
     // WMM Related Flag
     pMac->lim.gUapsdEnable = 0;
     pMac->lim.gUapsdPerAcBitmask = 0;
@@ -376,7 +366,7 @@
     // Place holder for current authentication request
     // being handled
     pMac->lim.gpLimMlmAuthReq = NULL;
-    pMac->lim.gpLimMlmJoinReq = NULL;
+    //pMac->lim.gpLimMlmJoinReq = NULL;
 
     /// MAC level Pre-authentication related globals
     pMac->lim.gLimPreAuthChannelNumber = 0;
@@ -399,32 +389,20 @@
     palZeroMemory(pMac->hHdd, pMac->lim.protStaOverlapCache, sizeof(tCacheParams) * LIM_PROT_STA_OVERLAP_CACHE_SIZE);
     palZeroMemory(pMac->hHdd, pMac->lim.protStaCache, sizeof(tCacheParams) * LIM_PROT_STA_CACHE_SIZE);
 
-    // Initialize Assoc/ReAssoc Response Data/Frame
-    //pMac->lim.gLimAssocResponseData = NULL;
-
 }
 
 
 static void __limInitTitanVars(tpAniSirGlobal pMac)
 {
-    pMac->lim.gCbMode = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
-    SET_CB_STATE_DISABLE( pMac->lim.gCbState );
+#if 0
     palZeroMemory(pMac->hHdd, &pMac->lim.gLimChannelSwitch, sizeof(tLimChannelSwitchInfo));
-
     pMac->lim.gLimChannelSwitch.state               = eLIM_CHANNEL_SWITCH_IDLE;
-    pMac->lim.gLimChannelSwitch.secondarySubBand    = eANI_CB_SECONDARY_NONE;
-
+    pMac->lim.gLimChannelSwitch.secondarySubBand    = PHY_SINGLE_CHANNEL_CENTERED;
+#endif
     // Debug workaround for BEACON's
     // State change triggered by "dump 222"
     pMac->lim.gLimScanOverride = 1;
     pMac->lim.gLimScanOverrideSaved = eSIR_ACTIVE_SCAN;
-
-
-    // Caches the CB State as desired by SME
-    SET_CB_STATE_DISABLE( pMac->lim.gCbStateProtected );
-
-    // TODO - This needs to be read off of a CFG variable
-
     pMac->lim.gLimTitanStaCount = 0;
     pMac->lim.gLimBlockNonTitanSta = 0;
 }
@@ -432,9 +410,7 @@
 static void __limInitHTVars(tpAniSirGlobal pMac)
 {
     pMac->lim.htCapabilityPresentInBeacon = 0;
-    pMac->lim.htCapability = 0;
     pMac->lim.gHTGreenfield = 0;
-    pMac->lim.gHTSupportedChannelWidthSet = 0;
     pMac->lim.gHTShortGI40Mhz = 0;
     pMac->lim.gHTShortGI20Mhz = 0;
     pMac->lim.gHTMaxAmsduLength = 0;
@@ -448,8 +424,6 @@
     pMac->lim.gHTMaxRxAMpduFactor = 0;
     pMac->lim.gHTServiceIntervalGranularity = 0;
     pMac->lim.gHTControlledAccessOnly = 0;
-    pMac->lim.gHTRecommendedTxWidthSet = 0;
-    pMac->lim.gHTSecondaryChannelOffset = eHT_SECONDARY_CHANNEL_OFFSET_NONE;
     pMac->lim.gHTOperMode = eSIR_HT_OP_MODE_PURE;
     pMac->lim.gHTPCOActive = 0;
 
@@ -463,7 +437,7 @@
 #if defined( FEATURE_WLAN_INTEGRATED_SOC )
 static tSirRetStatus __limInitConfig( tpAniSirGlobal pMac )
 {
-   tANI_U32 val1, val2, val3, len;
+   tANI_U32 val1, val2, val3;
    tANI_U16 val16;
    tANI_U8 val8;
    tSirMacHTCapabilityInfo   *pHTCapabilityInfo;
@@ -472,14 +446,10 @@
    tSirMacHTParametersInfo   *pAmpduParamInfo;
 
    /* Read all the CFGs here that were updated before peStart is called */
+   /* All these CFG READS/WRITES are only allowed in init, at start when there is no session 
+    * and they will be used throughout when there is no session
+    */
 
-   /* WNI_CFG_CHANNEL_BONDING_MODE */
-
-   handleCBCFGChange( pMac, WNI_CFG_CHANNEL_BONDING_MODE );
-         
-   //for Secondary channel, change setupCBMode function OR the caller of that
-   //function during Join (STA) or Start BSS(AP/IBSS) Now update the HT Capability
-   //CFG based on Channel Bonding CFG
    if(wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS) 
    {
       PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG\n"));)
@@ -515,7 +485,6 @@
    pHTInfoField1 = ( tSirMacHTInfoField1* ) &val8;
    pHTInfoField1->recommendedTxWidthSet = 
      (tANI_U8)pHTCapabilityInfo->supportedChannelWidthSet;
-   pMac->lim.gHTRecommendedTxWidthSet = pHTInfoField1->recommendedTxWidthSet;
    if(cfgSetInt(pMac, WNI_CFG_HT_INFO_FIELD1, *(tANI_U8*)pHTInfoField1) 
       != eSIR_SUCCESS)
    {
@@ -602,16 +571,6 @@
       return eSIR_FAILURE;
    }
 
-   /* WNI_CFG_BSSID - this one is not updated in limHandleCFGparamUpdate do we
-      want to update this? */
-   len = 6;
-   if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, pMac->lim.gLimBssid, &len) != 
-       eSIR_SUCCESS)
-   {
-      limLog(pMac, LOGP, FL("cfg get bssid failed\n"));
-      return eSIR_FAILURE;
-   }
-
    /* WNI_CFG_MAX_PS_POLL */
 
    /* Allocate and fill in power save configuration. */
@@ -649,8 +608,7 @@
 
    /* This was initially done after resume notification from HAL. Now, DAL is
       started before PE so this can be done here */
-   handleCBCFGChange( pMac, ANI_IGNORE_CFG_ID );
-   handleHTCapabilityandHTInfo(pMac);
+   handleHTCapabilityandHTInfo(pMac, NULL);
 
    return eSIR_SUCCESS;
 }
@@ -671,7 +629,7 @@
    {
       pMac->lim.gLimSmeState = eLIM_SME_IDLE_STATE;
 
-      MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+      MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
 
       // By default do not return after first scan match
       pMac->lim.gLimReturnAfterFirstMatch = 0;
@@ -910,11 +868,13 @@
         pMac->lim.gpLimMlmAuthReq = NULL;
     }
 
+#if 0
     if (pMac->lim.gpLimMlmJoinReq != NULL)
     {
         palFreeMemory(pMac->hHdd, pMac->lim.gpLimMlmJoinReq);
         pMac->lim.gpLimMlmJoinReq = NULL;
     }
+#endif
 
     #if 0
     if (pMac->lim.gpLimReassocReq != NULL)
@@ -1074,6 +1034,9 @@
     }
 #endif
 
+#ifdef WLAN_FEATURE_P2P
+    pMac->lim.actionFrameSessionId = 0xff;
+#endif
 
     return eSIR_SUCCESS;
 }
@@ -1091,13 +1054,7 @@
 
     if (ANI_DRIVER_TYPE(pMac) == eDRIVER_TYPE_MFG)
         return eSIR_SUCCESS;
-
-    palFreeMemory(pMac->hHdd, pMac->lim.limTimers.gpLimCnfWaitTimer);
-    pMac->lim.limTimers.gpLimCnfWaitTimer = NULL;
-    palFreeMemory(pMac->hHdd, pMac->lim.gpLimAIDpool);
-    pMac->lim.gpLimAIDpool = NULL;
-
-   
+    
     for(i =0; i < pMac->lim.maxBssId; i++)
     {
         if(pMac->lim.gpSession[i].valid == TRUE)
@@ -1105,7 +1062,11 @@
             peDeleteSession(pMac,&pMac->lim.gpSession[i]);
         }
     }
-
+    palFreeMemory(pMac->hHdd, pMac->lim.limTimers.gpLimCnfWaitTimer);
+    pMac->lim.limTimers.gpLimCnfWaitTimer = NULL;
+    palFreeMemory(pMac->hHdd, pMac->lim.gpLimAIDpool);
+    pMac->lim.gpLimAIDpool = NULL;
+    
     palFreeMemory(pMac->hHdd, pMac->lim.gpSession);
     pMac->lim.gpSession = NULL;
     /*
@@ -1436,9 +1397,9 @@
     {
     PELOG1(limLog( pMac, LOG1,
        FL ( "RxBd=%p mHdr=%p Type: %d Subtype: %d  Sizes:FC%d Mgmt%d\n"),
-       pRxBd, mHdr, mHdr->fc.type, mHdr->fc.subType, sizeof(tSirMacFrameCtl), sizeof(tSirMacMgmtHdr) );)
+       pRxPacketInfo, mHdr, mHdr->fc.type, mHdr->fc.subType, sizeof(tSirMacFrameCtl), sizeof(tSirMacMgmtHdr) );)
 
-    MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT, 0, 
+    MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT, NO_SESSION, 
                         LIM_TRACE_MAKE_RXMGMT(mHdr->fc.subType,  
                         (tANI_U16) (((tANI_U16) (mHdr->seqControl.seqNumHi << 4)) | mHdr->seqControl.seqNumLo)));)
     }
@@ -1496,49 +1457,6 @@
 
 
 /**
- * limCheckStateForLearnMode()
- *
- *FUNCTION:
- * This function is called by SCH to verify if LIM is in a state
- * to put system into Learn mode
- *
- *LOGIC:
- * NA
- *
- *ASSUMPTIONS:
- * NA
- *
- *NOTE:
- *
- * @param  pMac - Pointer to Global MAC structure
- * @return eSIR_SUCCESS - LIM is in a state to put system
- *                        into Learn Mode
- *         eSIR_FAILURE - LIM is NOT in a state to put system
- *                        into Learn Mode
- */
-
-tSirRetStatus
-limCheckStateForLearnMode(tpAniSirGlobal pMac)
-{
-    switch (pMac->lim.gLimSmeState)
-    {
-        case eLIM_SME_OFFLINE_STATE:
-        case eLIM_SME_IDLE_STATE:
-        case eLIM_SME_JOIN_FAILURE_STATE:
-        case eLIM_SME_NORMAL_STATE:
-        case eLIM_SME_LINK_EST_STATE:
-            // LIM is in a state to put system into Learn mode
-            return eSIR_SUCCESS;
-
-        default:
-            // LIM is NOT in a state to put system into Learn mode
-            return eSIR_FAILURE;
-    }
-} /*** end limCheckStateForLearnMode() ***/
-
-
-
-/**
  * limIsSystemInScanState()
  *
  *FUNCTION:
@@ -1738,7 +1656,7 @@
     pMac->lim.gLimMeasParams.shortDurationCount++;
     limDeactivateAndChangeTimer(pMac, eLIM_LEARN_DURATION_TIMER);
 
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_LEARN_DURATION_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_LEARN_DURATION_TIMER));
     if (tx_timer_activate(&pMac->lim.gLimMeasParams.learnDurationTimer)
                                            != TX_SUCCESS)
     {
@@ -1786,7 +1704,7 @@
 
     if (pMac->lim.gLimSpecMgmt.fQuietEnabled)
     {
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_QUIET_BSS_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_QUIET_BSS_TIMER));
 #ifdef GEN6_TODO
         /* revisit this piece of code to assign the appropriate sessionId below
          * priority - HIGH
@@ -1805,7 +1723,7 @@
     else
     {
         limDeactivateAndChangeTimer(pMac, eLIM_LEARN_INTERVAL_TIMER);
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_LEARN_INTERVAL_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_LEARN_INTERVAL_TIMER));
 #ifdef GEN6_TODO
         /* revisit this piece of code to assign the appropriate sessionId below
         */
@@ -1960,7 +1878,7 @@
                 mmhMsg.type = eWNI_SME_WDS_INFO_IND;
                 mmhMsg.bodyptr = pSirSmeWdsInfoInd;
                 mmhMsg.bodyval = 0;
-                MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+                MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
                 limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
                 pMac->lim.gLimNumWdsInfoInd++;
             }
@@ -2227,12 +2145,27 @@
 {
 
     tSirSmeApNewCaps   apNewCaps;
-    tANI_U32                cShortSlot, nShortSlot;
- 
-    apNewCaps.capabilityInfo = limGetU16((tANI_U8 *) &pBeacon->capabilityInfo);
+    tANI_U32           nShortSlot;
+    tANI_U32 val = 0;
+    tANI_U32 phyMode;
 
-    if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, &cShortSlot) != eSIR_SUCCESS)
-        limLog(pMac, LOGP, FL("unable to get short slot time\n"));
+    // Check Admin mode first. If it is disabled just return
+    if (wlan_cfgGetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, &val)
+                   != eSIR_SUCCESS)
+    {
+        limLog(pMac, LOGP,
+               FL("cfg get WNI_CFG_11G_SHORT_SLOT_TIME failed\n"));
+        return eSIR_FAILURE;
+    }
+    if (val == false)
+        return eSIR_SUCCESS;
+
+    // Check for 11a mode or 11b mode. In both cases return since slot time is constant and cannot/should not change in beacon
+    limGetPhyMode(pMac, &phyMode, psessionEntry);
+    if ((phyMode == WNI_CFG_PHY_MODE_11A) || (phyMode == WNI_CFG_PHY_MODE_11B))
+        return eSIR_SUCCESS;
+
+    apNewCaps.capabilityInfo = limGetU16((tANI_U8 *) &pBeacon->capabilityInfo);
 
     //  Earlier implementation: determine the appropriate short slot mode based on AP advertised modes
     // when erp is present, apply short slot always unless, prot=on  && shortSlot=off
@@ -2255,16 +2188,14 @@
     */
     nShortSlot = SIR_MAC_GET_SHORT_SLOT_TIME(apNewCaps.capabilityInfo);
 
-    if (nShortSlot != cShortSlot)
+    if (nShortSlot != psessionEntry->shortSlotTimeSupported)
     {
         // Short slot time capability of AP has changed. Adopt to it.
         PELOG1(limLog(pMac, LOG1, FL("Shortslot capability of AP changed: %d\n"),  nShortSlot);)
         ((tpSirMacCapabilityInfo)&psessionEntry->limCurrentBssCaps)->shortSlotTime = (tANI_U16)nShortSlot;
+        psessionEntry->shortSlotTimeSupported = nShortSlot;
         pBeaconParams->fShortSlotTime = (tANI_U8) nShortSlot;
         pBeaconParams->paramChangeBitmap |= PARAM_SHORT_SLOT_TIME_CHANGED;
-
-        if (cfgSetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, nShortSlot) != eSIR_SUCCESS)
-            PELOGE(limLog(pMac, LOGE,  FL("could not update short slot time at CFG\n"));)
     }
     return eSIR_SUCCESS;
 }
@@ -2447,7 +2378,7 @@
     msg.type = WDA_INIT_RADAR_IND;
     msg.bodyptr = NULL;
     msg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
     status = wdaPostCtrlMsg(pMac, &msg);
     if (status != eHAL_STATUS_SUCCESS)
     {
diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.c b/CORE/MAC/src/pe/lim/limAssocUtils.c
index 9402dda..60a1591 100644
--- a/CORE/MAC/src/pe/lim/limAssocUtils.c
+++ b/CORE/MAC/src/pe/lim/limAssocUtils.c
@@ -609,7 +609,7 @@
 
     if (pMac->lim.gLimAddtsSent)
     {
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_ADDTS_RSP_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, psessionEntry->peSessionId, eLIM_ADDTS_RSP_TIMER));
         tx_timer_deactivate(&pMac->lim.limTimers.gLimAddtsRspTimer);
     }
 
@@ -654,9 +654,9 @@
 
     if ((psessionEntry->limSystemRole == eLIM_STA_ROLE)||(psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE))
     {
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, eLIM_MLM_WT_DEL_STA_RSP_STATE));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, eLIM_MLM_WT_DEL_STA_RSP_STATE));
         psessionEntry->limMlmState = eLIM_MLM_WT_DEL_STA_RSP_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, eLIM_MLM_WT_DEL_STA_RSP_STATE));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, eLIM_MLM_WT_DEL_STA_RSP_STATE));
         /* Deactivating probe after heart beat timer */
         limDeactivateAndChangeTimer(pMac, eLIM_PROBE_AFTER_HB_TIMER);
         limHeartBeatDeactivateAndChangeTimer(pMac, psessionEntry);
@@ -843,8 +843,23 @@
         smetransactionId = psessionEntry->transactionId;
 
         psessionEntry->limSmeState = eLIM_SME_JOIN_FAILURE_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
 
+        //if it is a reassoc failure to join new AP
+        if(mlmStaContext.resultCode == eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE)
+        {
+            if(mlmStaContext.resultCode != eSIR_SME_SUCCESS )
+            {
+                peDeleteSession(pMac, psessionEntry);
+                psessionEntry = NULL;
+            } 
+
+            limSendSmeJoinReassocRsp(pMac, eWNI_SME_REASSOC_RSP,
+                               mlmStaContext.resultCode, mlmStaContext.protStatusCode, psessionEntry,
+                               smesessionId, smetransactionId);
+        }
+        else
+        {
         palFreeMemory( pMac->hHdd, psessionEntry->pLimJoinReq);
         psessionEntry->pLimJoinReq = NULL;
 
@@ -856,6 +871,7 @@
         
         limSendSmeJoinReassocRsp(pMac, eWNI_SME_JOIN_RSP, mlmStaContext.resultCode, mlmStaContext.protStatusCode,
                                  psessionEntry, smesessionId, smetransactionId);
+        }
         
     } 
 
@@ -1050,7 +1066,7 @@
     if(SIR_BAND_5_GHZ == rfBand)
     {
         //we are HT. if we are 11A, then protection is not required.
-        if(true == psessionEntry->htCapabality)
+        if(true == psessionEntry->htCapability)
         {
             //we are HT and 11A station is leaving.
             //protection consideration required.
@@ -1093,7 +1109,7 @@
         erpEnabled = pStaDs->erpEnabled;
         //we are HT or 11G and 11B station is getting deleted.
         if (((phyMode == WNI_CFG_PHY_MODE_11G) ||
-              psessionEntry->htCapabality) &&
+              psessionEntry->htCapability) &&
               (erpEnabled == eHAL_CLEAR))
         {
             PELOG1(limLog(pMac, LOG1, FL("(%d) A legacy STA is disassociated. Addr is "),
@@ -1124,7 +1140,7 @@
             }
         }
         //(non-11B station is leaving) or (we are not 11G or HT AP)
-        else if(psessionEntry->htCapabality)
+        else if(psessionEntry->htCapability)
         { //we are HT AP and non-11B station is leaving.
 
             //11g station is leaving            
@@ -1160,7 +1176,7 @@
     }
 
     //LSIG TXOP not supporting staiton leaving. applies to 2.4 as well as 5 GHZ.
-    if((true == psessionEntry->htCapabality) &&
+    if((true == psessionEntry->htCapability) &&
         (true == pStaDs->mlmStaContext.htCapability))
     {
         //HT non-GF leaving
@@ -1318,7 +1334,7 @@
              }
           }
        }
-       else 
+       else
 #endif
        {
            if (pMac->lim.gLimNoShortSlotParams.numNonShortSlotSta> 0)
@@ -1354,9 +1370,7 @@
          {
             pBeaconParams->fShortSlotTime = true;
             pBeaconParams->paramChangeBitmap |= PARAM_SHORT_SLOT_TIME_CHANGED;
-
-            if (cfgSetInt(pMac,  WNI_CFG_SHORT_SLOT_TIME,  true) != eSIR_SUCCESS)
-                PELOGE(limLog(pMac, LOGE,  FL("could not update short slot time at CFG\n"));)
+            psessionEntry->shortSlotTimeSupported = true;
          }
       }
       else 
@@ -1373,10 +1387,8 @@
             {
                pBeaconParams->fShortSlotTime = true;
                pBeaconParams->paramChangeBitmap |= PARAM_SHORT_SLOT_TIME_CHANGED;
-
-               if (cfgSetInt(pMac,  WNI_CFG_SHORT_SLOT_TIME,  true) != eSIR_SUCCESS)
-                     PELOGE(limLog(pMac, LOGE,  FL("could not update short slot time at CFG\n"));)
-             }
+               psessionEntry->shortSlotTimeSupported = true;
+            }
           }
        }
    }
@@ -1409,12 +1421,11 @@
                           tSirResultCodes resultCode,
                           tANI_U16 protStatusCode,tpPESession psessionEntry)
 {
-    tANI_U8                  chanNum;
+    tANI_U8             chanNum, secChanOffset;
     tLimMlmReassocCnf   mlmReassocCnf;
 
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, eLIM_MLM_LINK_ESTABLISHED_STATE));
     psessionEntry->limMlmState = eLIM_MLM_LINK_ESTABLISHED_STATE;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, eLIM_MLM_LINK_ESTABLISHED_STATE));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, eLIM_MLM_LINK_ESTABLISHED_STATE));
 
     // 'Change' timer for future activations
     limDeactivateAndChangeTimer(pMac, eLIM_REASSOC_FAIL_TIMER);
@@ -1435,8 +1446,9 @@
 
    /*  To support BT-AMP */
    chanNum = psessionEntry->currentOperChannel;
+   secChanOffset = psessionEntry->htSecondaryChannelOffset;
 
-    limSetChannel(pMac, psessionEntry->limCurrentTitanHtCaps, chanNum, psessionEntry->maxTxPower, psessionEntry->peSessionId);
+    limSetChannel(pMac, chanNum, secChanOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
 
     /** @ToDo : Need to Integrate the STOP the DataTransfer to the AP from 11H code */
 
@@ -1480,7 +1492,71 @@
     return eANI_BOOLEAN_FALSE;
 } /*** end limIsReassocInProgress() ***/
 
+#ifdef WLAN_FEATURE_11AC
+tSirRetStatus limPopulateVhtMcsSet(tpAniSirGlobal pMac,
+                                  tpSirSupportedRates pRates,
+                                  tDot11fIEVHTCaps *pPeerVHTCaps,
+                                  tpPESession psessionEntry)
+{
+    tANI_U32 val;
 
+    if(IS_DOT11_MODE_VHT(psessionEntry->dot11mode))
+    {
+        if ( wlan_cfgGetInt( pMac,WNI_CFG_VHT_RX_MCS_MAP,&val) != 
+            eSIR_SUCCESS )
+        {
+            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT RX MCS MAP\n"));)
+            goto error;
+        }
+        pRates->vhtRxMCSMap = (tANI_U16)val;
+    
+        if ( wlan_cfgGetInt( pMac,WNI_CFG_VHT_TX_MCS_MAP,&val ) != 
+            eSIR_SUCCESS )
+        {
+            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT TX MCS MAP\n"));)
+            goto error;
+        }
+        pRates->vhtTxMCSMap = (tANI_U16)val;
+
+        if ( wlan_cfgGetInt( pMac,WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE,&val ) != 
+            eSIR_SUCCESS )
+        {
+            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT RX Supported data rate MAP\n"));)
+            goto error;
+        }
+        pRates->vhtRxHighestDataRate = (tANI_U16)val;
+    
+        if ( wlan_cfgGetInt( pMac,WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE,&val ) != 
+            eSIR_SUCCESS )
+        {
+            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT RX Supported data rate MAP\n"));)
+            goto error;
+        }
+        pRates->vhtTxHighestDataRate = (tANI_U16)val;
+
+        if( pPeerVHTCaps != NULL)
+        {
+            pRates->vhtTxHighestDataRate = SIR_MIN(pRates->vhtTxHighestDataRate, pPeerVHTCaps->txSupDataRate);
+            pRates->vhtRxHighestDataRate = SIR_MIN(pRates->vhtRxHighestDataRate, pPeerVHTCaps->rxHighSupDataRate);
+
+            // Aquire PEER MCS map if we exceed.
+            // We compare/update only the last 2 bits of the map as we support only single BSS.
+            // Firmware takes care of this comparison
+            pRates->vhtRxMCSMap &= ~(0x3); // Clearing the last 2 bits in the bitmap
+            pRates->vhtRxMCSMap |= (pPeerVHTCaps->rxMCSMap & 0x3); // Updating the last 2 bits in the bitmap
+
+            // Firmware takes care of this comparison
+            pRates->vhtTxMCSMap &= ~(0x3); // Clearing the last 2 bits in the bitmap
+            pRates->vhtTxMCSMap |= (pPeerVHTCaps->txMCSMap & 0x3); // Updating the last 2 bits in the bitmap
+        }
+    }
+    return eSIR_SUCCESS;
+error:
+
+    return eSIR_FAILURE;
+
+}
+#endif
 
 /**
  * limPopulateOwnRateSet
@@ -1505,13 +1581,23 @@
  * @return eSIR_SUCCESS or eSIR_FAILURE
  *
  */
-
+#ifdef WLAN_FEATURE_11AC
+tSirRetStatus
+limPopulateOwnRateSet(tpAniSirGlobal pMac,
+                      tpSirSupportedRates pRates,
+                      tANI_U8* pSupportedMCSSet,
+                      tANI_U8 basicOnly,
+                      tpPESession psessionEntry,
+                      tDot11fIEVHTCaps *pVHTCaps)
+#else
 tSirRetStatus
 limPopulateOwnRateSet(tpAniSirGlobal pMac,
                       tpSirSupportedRates pRates,
                       tANI_U8* pSupportedMCSSet,
                       tANI_U8 basicOnly,
                       tpPESession psessionEntry)
+#endif
+
 {
     tSirMacRateSet          tempRateSet;
     tSirMacRateSet          tempRateSet2;
@@ -1659,8 +1745,9 @@
             PELOGW(limLog(pMac, LOG2,FL("%x ") , pRates->supportedMCSSet[i]);)
     }
 
-
-
+#ifdef WLAN_FEATURE_11AC
+    limPopulateVhtMcsSet(pMac, pRates , pVHTCaps,psessionEntry);
+#endif
 
     return eSIR_SUCCESS;
 
@@ -1669,8 +1756,6 @@
     return eSIR_FAILURE;
 } /*** limPopulateOwnRateSet() ***/
 
-
-
 /**
  * limPopulateMatchingRateSet
  * FUNCTION:
@@ -1700,7 +1785,18 @@
  *
  * @return:  eSIR_SUCCESS or eSIR_FAILURE
  */
+#ifdef WLAN_FEATURE_11AC
+tSirRetStatus
+limPopulateMatchingRateSet(tpAniSirGlobal pMac,
+                           tpDphHashNode pStaDs,
+                           tSirMacRateSet *pOperRateSet,
+                           tSirMacRateSet *pExtRateSet,
+                           tANI_U8* pSupportedMCSSet,
+                           tSirMacPropRateSet *pAniLegRateSet,
+                           tpPESession  psessionEntry,
+                           tDot11fIEVHTCaps *pVHTCaps)
 
+#else
 tSirRetStatus
 limPopulateMatchingRateSet(tpAniSirGlobal pMac,
                            tpDphHashNode pStaDs,
@@ -1709,6 +1805,7 @@
                            tANI_U8* pSupportedMCSSet,
                            tSirMacPropRateSet *pAniLegRateSet,
                            tpPESession  psessionEntry)
+#endif
 {
    tSirMacRateSet          tempRateSet;
    tSirMacRateSet          tempRateSet2;
@@ -1929,6 +2026,9 @@
         }
     }
 
+#ifdef WLAN_FEATURE_11AC
+    limPopulateVhtMcsSet(pMac, &pStaDs->supportedRates, pVHTCaps, psessionEntry);
+#endif
     /**
       * Set the erpEnabled bit iff the phy is in G mode and at least
       * one A rate is supported
@@ -2041,9 +2141,20 @@
     //Update HT Capability
 
     if ((limGetSystemRole(psessionEntry) == eLIM_AP_ROLE) ||(limGetSystemRole(psessionEntry) == eLIM_BT_AMP_AP_ROLE) || (limGetSystemRole(psessionEntry) == eLIM_STA_IN_IBSS_ROLE))
+    {
         pAddStaParams->htCapable = pStaDs->mlmStaContext.htCapability;
+#ifdef WLAN_FEATURE_11AC
+        pAddStaParams->vhtCapable = pStaDs->mlmStaContext.vhtCapability;
+#endif
+    }
     else
-          pAddStaParams->htCapable = psessionEntry->htCapabality;
+    {
+        pAddStaParams->htCapable = psessionEntry->htCapability;
+#ifdef WLAN_FEATURE_11AC
+        pAddStaParams->vhtCapable = psessionEntry->vhtCapability;
+#endif
+
+    }
 
     pAddStaParams->greenFieldCapable = pStaDs->htGreenfield;
     pAddStaParams->maxAmpduDensity= pStaDs->htAMpduDensity;
@@ -2055,6 +2166,18 @@
     pAddStaParams->maxAmsduSize = pStaDs->htMaxAmsduLength;
     pAddStaParams->txChannelWidthSet = pStaDs->htSupportedChannelWidthSet;
     pAddStaParams->mimoPS = pStaDs->htMIMOPSState;
+
+#ifdef WLAN_FEATURE_11AC
+    if(pAddStaParams->vhtCapable)
+    {
+        pAddStaParams->vhtTxChannelWidthSet = psessionEntry->vhtTxChannelWidthSet;
+
+        /* TODO. Need to discuss this. Overwriting here.
+         * Stick to SAP's configuration for HT supported Channel width */
+        pAddStaParams->txChannelWidthSet = limGetHTCapability( pMac, eHT_SUPPORTED_CHANNEL_WIDTH_SET, psessionEntry);
+    }
+#endif
+
     /* Update PE session ID*/
     pAddStaParams->sessionId = psessionEntry->peSessionId;
 
@@ -2102,7 +2225,8 @@
   //we need to defer the message until we get the response back from HAL.
     if (pAddStaParams->respReqd)
         SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
-  msgQ.type = WDA_ADD_STA_REQ;
+
+    msgQ.type = WDA_ADD_STA_REQ;
 
     msgQ.reserved = 0;
     msgQ.bodyptr = pAddStaParams;
@@ -2110,11 +2234,13 @@
 
     limLog( pMac, LOGE, FL( "Sending SIR_HAL_ADD_STA_REQ for assocId %d\n" ),
             pStaDs->assocId);
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
     retCode = wdaPostCtrlMsg( pMac, &msgQ );
     if( eSIR_SUCCESS != retCode)
     {
+       if (pAddStaParams->respReqd)
+          SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
         limLog( pMac, LOGE, FL("ADD_STA_REQ for aId %d failed (reason %X)\n"),
                             pStaDs->assocId, retCode );
         palFreeMemory(pMac->hHdd, (void*)pAddStaParams);
@@ -2201,13 +2327,13 @@
         //when limDelSta is called from processSmeAssocCnf then mlmState is already set properly.
         if(eLIM_MLM_WT_ASSOC_DEL_STA_RSP_STATE != GET_LIM_STA_CONTEXT_MLM_STATE(pStaDs))
         {
-            MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, eLIM_MLM_WT_DEL_STA_RSP_STATE));
+            MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, eLIM_MLM_WT_DEL_STA_RSP_STATE));
             SET_LIM_STA_CONTEXT_MLM_STATE(pStaDs, eLIM_MLM_WT_DEL_STA_RSP_STATE);
         }
         if ( (eLIM_STA_ROLE == GET_LIM_SYSTEM_ROLE(psessionEntry)) || 
              (eLIM_BT_AMP_STA_ROLE == GET_LIM_SYSTEM_ROLE(psessionEntry)) )
         {
-            MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, eLIM_MLM_WT_DEL_STA_RSP_STATE));
+            MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, eLIM_MLM_WT_DEL_STA_RSP_STATE));
 
             psessionEntry->limMlmState = eLIM_MLM_WT_DEL_STA_RSP_STATE; 
     
@@ -2228,10 +2354,12 @@
 
     limLog( pMac, LOGE, FL( "Sending SIR_HAL_DELETE_STA_REQ for STAID: %X and AssocID: %d\n" ),
     pDelStaParams->staIdx, pDelStaParams->assocId);
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
     retCode = wdaPostCtrlMsg( pMac, &msgQ );
     if( eSIR_SUCCESS != retCode)
     {
+        if(fRespReqd)
+           SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
         limLog( pMac, LOGE, FL("Posting DELETE_STA_REQ to HAL failed, reason=%X\n"),
                         retCode );
         palFreeMemory(pMac->hHdd, (void*)pDelStaParams);
@@ -2272,7 +2400,7 @@
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
     limLog( pMac, LOGE, FL( "Sending SIR_HAL_ADD_STA_REQ... (aid %d)" ), pAddStaParams->assocId);
 #endif
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
     psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
     psessionEntry->limMlmState = eLIM_MLM_WT_ADD_STA_RSP_STATE;
@@ -2358,11 +2486,15 @@
     pAddStaParams->updateSta = updateSta;
 
     pAddStaParams->shortPreambleSupported = psessionEntry->beaconParams.fShortPreamble;
-    limPopulateOwnRateSet(pMac, &pAddStaParams->supportedRates, NULL, false,psessionEntry);
 
-    if( psessionEntry->htCapabality)
+#ifdef WLAN_FEATURE_11AC
+    limPopulateOwnRateSet(pMac, &pAddStaParams->supportedRates, NULL, false,psessionEntry,NULL);
+#else
+    limPopulateOwnRateSet(pMac, &pAddStaParams->supportedRates, NULL, false,psessionEntry);
+#endif
+    if( psessionEntry->htCapability)
     {
-        pAddStaParams->htCapable = psessionEntry->htCapabality;
+        pAddStaParams->htCapable = psessionEntry->htCapability;
 #ifdef DISABLE_GF_FOR_INTEROP
         /*
          * To resolve the interop problem with Broadcom AP, 
@@ -2406,7 +2538,10 @@
         pAddStaParams->fShortGI40Mhz     = limGetHTCapability( pMac, eHT_SHORT_GI_40MHZ);
 #endif
     }
-
+#ifdef WLAN_FEATURE_11AC
+    pAddStaParams->vhtCapable = psessionEntry->vhtCapability;
+    pAddStaParams->vhtTxChannelWidthSet = pMac->lim.apChanWidth;
+#endif
     if(wlan_cfgGetInt(pMac, WNI_CFG_LISTEN_INTERVAL, &listenInterval) != eSIR_SUCCESS)
        limLog(pMac, LOGP, FL("Couldn't get LISTEN_INTERVAL\n"));
     pAddStaParams->listenInterval = (tANI_U16)listenInterval;
@@ -2432,7 +2567,7 @@
 
     limLog( pMac, LOGW, FL( "Sending SIR_HAL_ADD_STA_REQ... (aid %d)" ),
           pAddStaParams->assocId);
-  MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+  MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
   if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
@@ -2688,7 +2823,7 @@
         if ( pBPR->HTInfo.present )
             limUpdateStaRunTimeHTInfo( pMac, &pBPR->HTInfo, psessionEntry);
         psessionEntry->limMlmState = eLIM_MLM_JOINED_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, eLIM_MLM_JOINED_STATE));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, eLIM_MLM_JOINED_STATE));
 
 #if (WNI_POLARIS_FW_PRODUCT == AP)
         // In case of BP, we need to adopt to all rates
@@ -2811,7 +2946,7 @@
     else
         pDelBssParams->bssIdx          = bssIdx;
     psessionEntry->limMlmState = eLIM_MLM_WT_DEL_BSS_RSP_STATE;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, eLIM_MLM_WT_DEL_BSS_RSP_STATE));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, eLIM_MLM_WT_DEL_BSS_RSP_STATE));
 
     pDelBssParams->status= eHAL_STATUS_SUCCESS;
     pDelBssParams->respReqd = 1;
@@ -2826,10 +2961,11 @@
     msgQ.bodyptr = pDelBssParams;
     msgQ.bodyval = 0;
 
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
+        SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
         limLog( pMac, LOGE, FL("Posting DELETE_BSS_REQ to HAL failed, reason=%X\n"), retCode );
         palFreeMemory(pMac->hHdd, (void*)pDelBssParams);
     }
@@ -2929,7 +3065,7 @@
 
     pAddBssParams->nwType = bssDescription->nwType;
     
-    pAddBssParams->shortSlotTimeSupported = (tANI_U8)pAssocRsp->capabilityInfo.shortSlotTime;    
+    pAddBssParams->shortSlotTimeSupported = (tANI_U8)pAssocRsp->capabilityInfo.shortSlotTime;
     pAddBssParams->llaCoexist = (tANI_U8) psessionEntry->beaconParams.llaCoexist;    
     pAddBssParams->llbCoexist = (tANI_U8) psessionEntry->beaconParams.llbCoexist;
     pAddBssParams->llgCoexist = (tANI_U8) psessionEntry->beaconParams.llgCoexist;
@@ -2961,7 +3097,7 @@
             else
             {
                 pAddBssParams->txChannelWidthSet = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
-                pAddBssParams->currentExtChannel = eHT_SECONDARY_CHANNEL_OFFSET_NONE;
+                pAddBssParams->currentExtChannel = PHY_SINGLE_CHANNEL_CENTERED;
             }
             pAddBssParams->llnNonGFCoexist = (tANI_U8)pAssocRsp->HTInfo.nonGFDevicesPresent;
             pAddBssParams->fLsigTXOPProtectionFullSupport = (tANI_U8)pAssocRsp->HTInfo.lsigTXOPProtectionFullSupport;
@@ -2971,6 +3107,22 @@
 
     pAddBssParams->currentOperChannel = bssDescription->channelId;
 
+#ifdef WLAN_FEATURE_11AC
+    if (psessionEntry->vhtCapability && ( pAssocRsp->VHTCaps.present ))
+    {
+        pAddBssParams->vhtCapable = pAssocRsp->VHTCaps.present;
+        pAddBssParams->vhtTxChannelWidthSet = pAssocRsp->VHTOperation.chanWidth; 
+        pAddBssParams->currentExtChannel = limGet11ACPhyCBState ( pMac, 
+                                           pAddBssParams->currentOperChannel,
+                                           pAddBssParams->currentExtChannel );
+    }
+    else 
+    {
+        pAddBssParams->vhtCapable = 0;
+    }
+#endif
+
+
     // Populate the STA-related parameters here
     // Note that the STA here refers to the AP
     {
@@ -3012,6 +3164,14 @@
                 (chanWidthSupp) )
             {
                 pAddBssParams->staContext.txChannelWidthSet = ( tANI_U8 )pAssocRsp->HTInfo.recommendedTxWidthSet;
+                
+#ifdef WLAN_FEATURE_11AC
+                if (psessionEntry->vhtCapability && ( pBeaconStruct->VHTCaps.present ))
+                {
+                    pAddBssParams->staContext.vhtCapable = 1;
+                    pAddBssParams->staContext.vhtTxChannelWidthSet = pAssocRsp->VHTOperation.chanWidth; //pMac->lim.apChanWidth;
+                }
+#endif
             }
             else
             {
@@ -3078,7 +3238,8 @@
     }
 #endif
 
-    pAddBssParams->bSpectrumMgtEnabled = psessionEntry->spectrumMgtEnabled;
+    pAddBssParams->bSpectrumMgtEnabled = psessionEntry->spectrumMgtEnabled || 
+        limIsconnectedOnDFSChannel(bssDescription->channelId);
 
 #if defined WLAN_FEATURE_VOWIFI_11R
     pAddBssParams->extSetStaKeyParamValid = 0;
@@ -3089,7 +3250,7 @@
         psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_ASSOC_STATE;
     else
         psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_REASSOC_STATE;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
     //we need to defer the message until we get the response back from HAL.
     SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
@@ -3101,11 +3262,12 @@
     msgQ.bodyval = 0;
 
     limLog( pMac, LOG1, FL( "Sending SIR_HAL_ADD_BSS_REQ..." ));
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
     retCode = wdaPostCtrlMsg( pMac, &msgQ );
     if( eSIR_SUCCESS != retCode) 
     {
+        SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
         palFreeMemory(pMac->hHdd, pAddBssParams);
         limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X\n"),
                 retCode );
@@ -3189,7 +3351,7 @@
 
     pAddBssParams->nwType = bssDescription->nwType;
     
-    pAddBssParams->shortSlotTimeSupported = (tANI_U8)beaconStruct.capabilityInfo.shortSlotTime; 
+    pAddBssParams->shortSlotTimeSupported = (tANI_U8)beaconStruct.capabilityInfo.shortSlotTime;
     pAddBssParams->llaCoexist = (tANI_U8) psessionEntry->beaconParams.llaCoexist;
     pAddBssParams->llbCoexist = (tANI_U8) psessionEntry->beaconParams.llbCoexist;
     pAddBssParams->llgCoexist = (tANI_U8) psessionEntry->beaconParams.llgCoexist;
@@ -3219,7 +3381,7 @@
             else
             {
                 pAddBssParams->txChannelWidthSet = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
-                pAddBssParams->currentExtChannel = eHT_SECONDARY_CHANNEL_OFFSET_NONE;
+                pAddBssParams->currentExtChannel = PHY_SINGLE_CHANNEL_CENTERED;
             }
             pAddBssParams->llnNonGFCoexist = (tANI_U8)beaconStruct.HTInfo.nonGFDevicesPresent;
             pAddBssParams->fLsigTXOPProtectionFullSupport = (tANI_U8)beaconStruct.HTInfo.lsigTXOPProtectionFullSupport;
@@ -3229,6 +3391,21 @@
 
     pAddBssParams->currentOperChannel = bssDescription->channelId;
 
+#ifdef WLAN_FEATURE_11AC
+    if (psessionEntry->vhtCapability && ( beaconStruct.VHTCaps.present ))
+    {
+        pAddBssParams->vhtCapable = beaconStruct.VHTCaps.present;
+        pAddBssParams->vhtTxChannelWidthSet = beaconStruct.VHTOperation.chanWidth; 
+        pAddBssParams->currentExtChannel = limGet11ACPhyCBState ( pMac, 
+                                           pAddBssParams->currentOperChannel,
+                                           pAddBssParams->currentExtChannel );
+    }
+    else 
+    {
+        pAddBssParams->vhtCapable = 0;
+    }
+#endif
+
     // Populate the STA-related parameters here
     // Note that the STA here refers to the AP
     {
@@ -3255,6 +3432,13 @@
                 (chanWidthSupp) )
             {
                 pAddBssParams->staContext.txChannelWidthSet = ( tANI_U8 )beaconStruct.HTInfo.recommendedTxWidthSet;
+          #ifdef WLAN_FEATURE_11AC
+                if (psessionEntry->vhtCapability && ( beaconStruct.VHTCaps.present ))
+                {
+                    pAddBssParams->staContext.vhtCapable = 1;
+                    pAddBssParams->staContext.vhtTxChannelWidthSet = beaconStruct.VHTOperation.chanWidth; 
+                }
+          #endif
             }
             else
             {
@@ -3280,9 +3464,14 @@
             pAddBssParams->staContext.wmmEnabled = 0;
 
         //Update the rates
-        
+#ifdef WLAN_FEATURE_11AC
         limPopulateOwnRateSet(pMac, &pAddBssParams->staContext.supportedRates, 
-                                                    beaconStruct.HTCaps.supportedMCSSet, false,psessionEntry);
+                                        beaconStruct.HTCaps.supportedMCSSet, false,psessionEntry,
+                                        &beaconStruct.VHTCaps);
+#else
+        limPopulateOwnRateSet(pMac, &pAddBssParams->staContext.supportedRates, 
+                                        beaconStruct.HTCaps.supportedMCSSet, false,psessionEntry);
+#endif
         limFillSupportedRatesInfo(pMac, NULL, &pAddBssParams->staContext.supportedRates,psessionEntry);
 
     }
@@ -3311,7 +3500,8 @@
     
     pAddBssParams->halPersona = (tANI_U8)psessionEntry->pePersona; //update persona
 
-    pAddBssParams->bSpectrumMgtEnabled = psessionEntry->spectrumMgtEnabled;
+    pAddBssParams->bSpectrumMgtEnabled = psessionEntry->spectrumMgtEnabled || 
+        limIsconnectedOnDFSChannel(bssDescription->channelId);
 
 #if defined WLAN_FEATURE_VOWIFI_11R
     pAddBssParams->extSetStaKeyParamValid = 0;
@@ -3322,7 +3512,7 @@
     //pMac->lim.gLimMlmState = eLIM_MLM_WT_ADD_BSS_RSP_PREASSOC_STATE;
     psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_PREASSOC_STATE;
     
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
     //we need to defer the message until we get the response back from HAL.
     SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
@@ -3334,11 +3524,12 @@
     msgQ.bodyval = 0;
 
     limLog( pMac, LOG1, FL( "Sending SIR_HAL_ADD_BSS_REQ..." ));
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
     retCode = wdaPostCtrlMsg( pMac, &msgQ );
     if( eSIR_SUCCESS != retCode) 
     {
+        SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
         palFreeMemory(pMac->hHdd, pAddBssParams);
         limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X\n"),
                 retCode );
@@ -3439,7 +3630,7 @@
             else
             {
                 pAddBssParams->txChannelWidthSet = (tANI_U8)pAssocRsp->HTCaps.supportedChannelWidthSet;
-                pAddBssParams->currentExtChannel = eHT_SECONDARY_CHANNEL_OFFSET_NONE;
+                pAddBssParams->currentExtChannel = PHY_SINGLE_CHANNEL_CENTERED;
             }
             pAddBssParams->llnNonGFCoexist = (tANI_U8)pAssocRsp->HTInfo.nonGFDevicesPresent;
             pAddBssParams->fLsigTXOPProtectionFullSupport = (tANI_U8)pAssocRsp->HTInfo.lsigTXOPProtectionFullSupport;
@@ -3536,7 +3727,7 @@
         psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_ASSOC_STATE;
     else
         psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_REASSOC_STATE;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
     //we need to defer the message until we get the response back from HAL.
     SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
@@ -3548,7 +3739,7 @@
     msgQ.bodyval = 0;
 
     limLog( pMac, LOG1, FL( "Sending SIR_HAL_ADD_BSS_REQ..." ));
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
     retCode = halPostMsgApi( pMac, &msgQ );
     if( eSIR_SUCCESS != retCode) 
@@ -3609,7 +3800,7 @@
     if ( (psessionEntry->limSystemRole == eLIM_STA_ROLE)||(psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE))
     {
         psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
     }
 
     limSendDelStaCnf(pMac, staDsAddr, staDsAssocId, mlmStaContext, statusCode,psessionEntry);
@@ -3633,6 +3824,10 @@
                 return eSTA_11bg;
             case WNI_CFG_DOT11_MODE_11N:
                 return eSTA_11n;
+#ifdef WLAN_FEATURE_11AC
+            case WNI_CFG_DOT11_MODE_11AC:
+                return eSTA_11ac;
+#endif
             case WNI_CFG_DOT11_MODE_ALL:
             default:
                 return eSTA_11n;           
diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.h b/CORE/MAC/src/pe/lim/limAssocUtils.h
index a46f7ab..8b123fe 100644
--- a/CORE/MAC/src/pe/lim/limAssocUtils.h
+++ b/CORE/MAC/src/pe/lim/limAssocUtils.h
@@ -59,18 +59,42 @@
                                      tANI_U8 , tAniAuthType,
                                      tANI_U16, tANI_U8, tSirResultCodes, tpPESession);
 
+#ifdef WLAN_FEATURE_11AC
+tSirRetStatus limPopulateOwnRateSet(tpAniSirGlobal pMac,
+                                         tpSirSupportedRates pRates,
+                                         tANI_U8* pSupportedMCSSet,
+                                         tANI_U8 basicOnly,
+                                         tpPESession psessionEntry,
+                                         tDot11fIEVHTCaps *pVHTCaps);
+
+#else
 tSirRetStatus limPopulateOwnRateSet(tpAniSirGlobal pMac,
                                                                 tpSirSupportedRates pRates,
                                                                 tANI_U8* pSupportedMCSSet,
                                                                 tANI_U8 basicOnly,
                                                                 tpPESession psessionEntry);
+#endif
 
+#ifdef WLAN_FEATURE_11AC
+tSirRetStatus
+limPopulateMatchingRateSet(tpAniSirGlobal pMac,
+                           tpDphHashNode pStaDs,
+                           tSirMacRateSet *pOperRateSet,
+                           tSirMacRateSet *pExtRateSet,
+                           tANI_U8* pSupportedMCSSet,
+                           tSirMacPropRateSet *pAniLegRateSet,
+                           tpPESession  psessionEntry,
+                           tDot11fIEVHTCaps *pVHTCaps);
+#else
 tSirRetStatus   limPopulateMatchingRateSet(tpAniSirGlobal,
                                            tpDphHashNode,
                                            tSirMacRateSet *,
                                            tSirMacRateSet *,
                                            tANI_U8* pSupportedMCSSet,
                                            tSirMacPropRateSet *, tpPESession);
+
+
+#endif
 tSirRetStatus   limAddSta(tpAniSirGlobal, tpDphHashNode,tpPESession);
 tSirRetStatus   limDelBss(tpAniSirGlobal, tpDphHashNode, tANI_U16, tpPESession);
 tSirRetStatus   limDelSta(tpAniSirGlobal, tpDphHashNode, tANI_BOOLEAN, tpPESession);
diff --git a/CORE/MAC/src/pe/lim/limFT.c b/CORE/MAC/src/pe/lim/limFT.c
index 26d04f4..ceff4da 100644
--- a/CORE/MAC/src/pe/lim/limFT.c
+++ b/CORE/MAC/src/pe/lim/limFT.c
@@ -442,7 +442,7 @@
             else
             {
                 pAddBssParams->txChannelWidthSet = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
-                pAddBssParams->currentExtChannel = eHT_SECONDARY_CHANNEL_OFFSET_NONE;
+                pAddBssParams->currentExtChannel = PHY_SINGLE_CHANNEL_CENTERED;
             }
             pAddBssParams->llnNonGFCoexist = (tANI_U8)beaconStruct.HTInfo.nonGFDevicesPresent;
             pAddBssParams->fLsigTXOPProtectionFullSupport = (tANI_U8)beaconStruct.HTInfo.lsigTXOPProtectionFullSupport;
@@ -510,9 +510,14 @@
             pAddBssParams->staContext.wmmEnabled = 0;
 
         //Update the rates
-        
+#ifdef WLAN_FEATURE_11AC
+        limPopulateOwnRateSet(pMac, &pAddBssParams->staContext.supportedRates, 
+                             beaconStruct.HTCaps.supportedMCSSet, 
+                             false,pftSessionEntry,&beaconStruct.VHTCaps);
+#else
         limPopulateOwnRateSet(pMac, &pAddBssParams->staContext.supportedRates, 
                                                     beaconStruct.HTCaps.supportedMCSSet, false,pftSessionEntry);
+#endif
         limFillSupportedRatesInfo(pMac, NULL, &pAddBssParams->staContext.supportedRates,pftSessionEntry);
 
     }
@@ -583,7 +588,7 @@
     pftSessionEntry->peSessionId = sessionId;
 
     pftSessionEntry->dot11mode = psessionEntry->dot11mode;
-    pftSessionEntry->htCapabality = psessionEntry->htCapabality;
+    pftSessionEntry->htCapability = psessionEntry->htCapability;
 
     pftSessionEntry->limWmeEnabled = psessionEntry->limWmeEnabled;
     pftSessionEntry->limQosEnabled = psessionEntry->limQosEnabled;
@@ -649,11 +654,6 @@
                        
     pftSessionEntry->limCurrentBssCaps = pbssDescription->capabilityInfo;
     pftSessionEntry->limReassocBssCaps = pbssDescription->capabilityInfo;
-            
-    pftSessionEntry->limCurrentTitanHtCaps=
-                    pbssDescription->titanHtCaps;
-    pftSessionEntry->limReassocTitanHtCaps=
-        pftSessionEntry->limCurrentTitanHtCaps;
 
     regMax = cfgGetRegulatoryMaxTransmitPower( pMac, pftSessionEntry->currentOperChannel ); 
     localPowerConstraint = regMax;
@@ -1082,7 +1082,7 @@
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
     limLog( pMac, LOGE, FL( "Sending SIR_HAL_ADD_BSS_REQ..." ));
 #endif
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
     retCode = wdaPostCtrlMsg( pMac, &msgQ );
     if( eSIR_SUCCESS != retCode) 
@@ -1271,7 +1271,7 @@
      * WDA_AGGR_QOS_RSP from HAL.
      */
     SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
-    MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msg.type));
 
     if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
     {
diff --git a/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c b/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c
index e98aeae..6b118a3 100644
--- a/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c
+++ b/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c
@@ -325,10 +325,16 @@
     tLimIbssPeerNode *pPeer,
     tpPESession       psessionEntry)
 {
+#ifdef WLAN_FEATURE_11AC
+    limPopulateMatchingRateSet(pMac, pStaDs, &pPeer->supportedRates,
+                               &pPeer->extendedRates, pPeer->supportedMCSSet,
+                               &pStaDs->mlmStaContext.propRateSet,psessionEntry,NULL);
+#else
     // Populate supported rateset
     limPopulateMatchingRateSet(pMac, pStaDs, &pPeer->supportedRates,
                                &pPeer->extendedRates, pPeer->supportedMCSSet,
                                &pStaDs->mlmStaContext.propRateSet,psessionEntry);
+#endif
 
     pStaDs->mlmStaContext.capabilityInfo = pPeer->capabilityInfo;
 } /*** end ibss_sta_info_update() ***/
@@ -550,20 +556,10 @@
      * so that the IBSS doesnt blindly start with short slot = 1. If IBSS start is part of coalescing then it will adapt
      * to peer's short slot using code below.
      */
-    if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, &cfg)
-                   != eSIR_SUCCESS)
-    {
-        limLog(pMac, LOGP, FL("cfg get WNI_CFG_SHORT_SLOT_TIME failed\n"));
-        return;
-    }
     /* If cfg is already set to current peer's capability then no need to set it again */
-    if (cfg != pBeacon->capabilityInfo.shortSlotTime)
+    if (psessionEntry->shortSlotTimeSupported != pBeacon->capabilityInfo.shortSlotTime)
     {
-        if (cfgSetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, pBeacon->capabilityInfo.shortSlotTime) != eSIR_SUCCESS)
-        {
-            limLog(pMac, LOGP, FL("could not update short slot time at CFG\n"));
-            return;
-        }
+        psessionEntry->shortSlotTimeSupported = pBeacon->capabilityInfo.shortSlotTime;
     }
     palCopyMemory( pMac->hHdd,
        (tANI_U8 *) &psessionEntry->pLimStartBssReq->operationalRateSet,
@@ -615,10 +611,10 @@
     mlmStartReq.bssType             = eSIR_IBSS_MODE;
     mlmStartReq.beaconPeriod        = pBeacon->beaconInterval;
     mlmStartReq.nwType              = psessionEntry->pLimStartBssReq->nwType; //psessionEntry->nwType is also OK????
-    mlmStartReq.htCapable           = psessionEntry->htCapabality;
+    mlmStartReq.htCapable           = psessionEntry->htCapability;
     mlmStartReq.htOperMode          = pMac->lim.gHTOperMode;
     mlmStartReq.dualCTSProtection   = pMac->lim.gHTDualCTSProtection;
-    mlmStartReq.txChannelWidthSet   = pMac->lim.gHTRecommendedTxWidthSet;
+    mlmStartReq.txChannelWidthSet   = psessionEntry->htRecommendedTxWidthSet;
 
     #if 0
     if (wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_CHANNEL, &cfg) != eSIR_SUCCESS)
@@ -1006,7 +1002,7 @@
         limGetPhyMode(pMac, &phyMode, psessionEntry);
 
         //We are 11G or 11n. Check if we need protection from 11b Stations.
-        if ((phyMode == WNI_CFG_PHY_MODE_11G) || (pMac->lim.htCapability))
+        if ((phyMode == WNI_CFG_PHY_MODE_11G) || (psessionEntry->htCapability))
         {
             /* As we found in the past, it is possible that a 11n STA sends
              * Beacon with HT IE but not ERP IE.  So the absense of ERP IE
@@ -1315,18 +1311,14 @@
     limIbssDelete(pMac,psessionEntry);
     psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
 
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
     psessionEntry->limSystemRole = eLIM_STA_ROLE;
 
     /* Change the short slot operating mode to Default (which is 1 for now) so that when IBSS starts next time with Libra
      * as originator, it picks up the default. This enables us to remove hard coding of short slot = 1 from limApplyConfiguration 
      */
-    if (cfgSetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, WNI_CFG_SHORT_SLOT_TIME_STADEF) != eSIR_SUCCESS)
-    {
-        limLog(pMac, LOGP, FL("could not update short slot time at CFG\n"));
-        return;
-    }
+    psessionEntry->shortSlotTimeSupported = WNI_CFG_SHORT_SLOT_TIME_STADEF;
 
     end:
     if(pDelBss != NULL)
@@ -1481,7 +1473,7 @@
         psessionEntry->limIbssActive = true;
         limSendSmeWmStatusChangeNtf(pMac, eSIR_SME_IBSS_ACTIVE, NULL, 0, psessionEntry->smeSessionId);
         limHeartBeatDeactivateAndChangeTimer(pMac, psessionEntry);
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_HEART_BEAT_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_HEART_BEAT_TIMER));
         if (limActivateHearBeatTimer(pMac) != TX_SUCCESS)
             limLog(pMac, LOGP, FL("could not activate Heartbeat timer\n"));
     }
@@ -1636,7 +1628,7 @@
         limGetPhyMode(pMac, &phyMode, psessionEntry);
         erpEnabled = pStaDs->erpEnabled;
         //we are HT or 11G and 11B station is getting deleted.
-        if ( ((phyMode == WNI_CFG_PHY_MODE_11G) || pMac->lim.htCapability) 
+        if ( ((phyMode == WNI_CFG_PHY_MODE_11G) || psessionEntry->htCapability)
               && (erpEnabled == eHAL_CLEAR))
         {
             PELOGE(limLog(pMac, LOGE, FL("(%d) A legacy STA is disassociated. Addr is "),
diff --git a/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c b/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
index f9c103b..810dd9e 100644
--- a/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
+++ b/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
@@ -298,12 +298,12 @@
     pLen = pBuf;
     pBuf += sizeof(tANI_U16);
     msgLength += sizeof(tANI_U16);
-    
+
     //sessionId
-    *pBuf = psessionEntry->peSessionId;
+    *pBuf = psessionEntry->smeSessionId;
     pBuf++;
     msgLength++;
-  
+
     //transactionId
     limCopyU16((tANI_U8*)pBuf, psessionEntry->transactionId);
     pBuf += sizeof(tANI_U16);
diff --git a/CORE/MAC/src/pe/lim/limLogDump.c b/CORE/MAC/src/pe/lim/limLogDump.c
index 8271119..f15c80e 100644
--- a/CORE/MAC/src/pe/lim/limLogDump.c
+++ b/CORE/MAC/src/pe/lim/limLogDump.c
@@ -83,7 +83,7 @@
 #endif
 
 
-char *dumpLim( tpAniSirGlobal pMac, char *p )
+char *dumpLim( tpAniSirGlobal pMac, char *p, tANI_U32 sessionId)
 {
   #ifdef FIXME_GEN6
   //iterate through the sessionTable and dump sta entries for each session.
@@ -91,6 +91,13 @@
 
   tANI_U16 i, j;
 
+  tpPESession psessionEntry = peFindSessionBySessionId(pMac, sessionId);
+
+  if (psessionEntry == NULL)
+  {
+    p += log_sprintf( pMac, p, "Invalid sessionId: %d \n ", sessionId);
+    return p;
+  }
 
   p += log_sprintf( pMac,p, "\n ----- LIM Debug Information ----- \n");
   p += log_sprintf( pMac,p, "LIM Role  = (%d) %s\n",
@@ -99,11 +106,8 @@
                   pMac->lim.gLimSmeState, limSmeStateStr(pMac->lim.gLimSmeState));
   p += log_sprintf( pMac,p, "MLM State = (%d) %s",
                   pMac->lim.gLimMlmState, limMlmStateStr(pMac->lim.gLimMlmState));
-
-  p += log_sprintf( pMac,p, "CHANNEL BONDING Mode (%1d) and State (X|X|X|AU|CS|U/D|O|A) (0x%1x)\n",
-                  pMac->lim.gCbMode, pMac->lim.gCbState);
-  p += log_sprintf( pMac,p, "802.11n HT Capability: %s\n",
-                  (pMac->lim.htCapability == 1) ? "Enabled" : "Disabled");
+  p += log_sprintf( pMac,p, "802.11n session HT Capability: %s\n",
+                  (psessionEntry->htCapability == 1) ? "Enabled" : "Disabled");
   p += log_sprintf( pMac,p, "gLimProcessDefdMsgs: %s\n",
                   (pMac->lim.gLimProcessDefdMsgs == 1) ? "Enabled" : "Disabled");
 
@@ -131,10 +135,6 @@
 
       p += log_sprintf( pMac,p, "Num of Hash Miss Event ignored             = %d\n",
                       pMac->lim.gLimNumHashMissIgnored);
-
-
-
-
   }
 
   p += log_sprintf( pMac,p, "Num of RxCleanup Count                     = %d\n",
@@ -152,11 +152,6 @@
   p += log_sprintf( pMac,p, "No. of Beacons Rxed During HB Interval     = %d\n",
                   pMac->lim.gLimRxedBeaconCntDuringHB);
   p += log_sprintf( pMac,p, "Self Operating Mode                              = %s\n", limDot11ModeStr(pMac, (tANI_U8)pMac->lim.gLimDot11Mode));
-
-
-
-
-
   p += log_sprintf( pMac,p, "\n");
 
   if (pMac->lim.gLimSystemRole == eLIM_AP_ROLE)
@@ -349,16 +344,13 @@
             p += log_sprintf( pMac,p, "\n");
         }
     }
-
-
 #endif
     p += log_sprintf( pMac, p, "HT operating Mode = %d, llbCoexist = %d, llgCoexist = %d, ht20Coexist = %d, nonGfPresent = %d, RifsMode = %d, lsigTxop = %d\n",
                       pMac->lim.gHTOperMode, pMac->lim.llbCoexist, pMac->lim.llgCoexist,
                       pMac->lim.ht20MhzCoexist, pMac->lim.gHTNonGFDevicesPresent,
                       pMac->lim.gHTRifsMode, pMac->lim.gHTLSigTXOPFullSupport);
-
     p += log_sprintf(pMac, p, "2nd Channel offset = %d\n",
-                  pMac->lim.gHTSecondaryChannelOffset);
+                  psessionEntry->hHTSecondaryChannelOffset);
 #endif
     return p;
 }
@@ -378,7 +370,7 @@
     tSirMsgQ mesg = { (tANI_U16) SIR_LIM_BEACON_GEN_IND, (tANI_U16) 0, (tANI_U32) 0 };
     
     pMac->lim.gLimSmeState = eLIM_SME_NORMAL_STATE;
-    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
     pMac->lim.gLimSystemRole = eLIM_AP_ROLE;
     
     p += log_sprintf( pMac, p,
@@ -546,7 +538,7 @@
     tSirMsgQ  msg;
     tSirSmeStartBssReq  *pStartBssReq;
     unsigned char *pBuf;
-    tAniCBSecondaryMode  cbMode;
+    ePhyChanBondState  cbMode;
     tSirNwType  nwType;
 
     p += log_sprintf( pMac,p, "sendSmeStartBssReq: Preparing eWNI_SME_START_BSS_REQ message\n");
@@ -592,9 +584,9 @@
     pBuf++;
 
     // Filling in CB mode
-    cbMode = eANI_CB_SECONDARY_NONE;
-    palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&cbMode, sizeof(tAniCBSecondaryMode) );
-    pBuf += sizeof(tAniCBSecondaryMode);
+    cbMode = PHY_SINGLE_CHANNEL_CENTERED;
+    palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&cbMode, sizeof(ePhyChanBondState) );
+    pBuf += sizeof(ePhyChanBondState);
 
     // Filling in RSN IE Length to zero
     palZeroMemory( pMac->hHdd, pBuf, sizeof(tANI_U16) );    //tSirRSNie->length
@@ -766,7 +758,7 @@
             p += log_sprintf( pMac,p, "bssType: (%d) %s \n", psessionEntry->bssType, limBssTypeStr(psessionEntry->bssType));
             p += log_sprintf( pMac,p, "operMode: %d \n", psessionEntry->operMode);
             p += log_sprintf( pMac,p, "dot11mode: %d \n", psessionEntry->dot11mode);
-            p += log_sprintf( pMac,p, "htCapabality: %d \n", psessionEntry->htCapabality);
+            p += log_sprintf( pMac,p, "htCapability: %d \n", psessionEntry->htCapability);
             p += log_sprintf( pMac,p, "limRFBand: %d \n", psessionEntry->limRFBand);
             p += log_sprintf( pMac,p, "limIbssActive: %d \n", psessionEntry->limIbssActive);
             p += log_sprintf( pMac,p, "limCurrentAuthType: %d \n", psessionEntry->limCurrentAuthType);
@@ -782,7 +774,6 @@
             p += log_sprintf( pMac,p, "limReassocBssCaps: %d \n", psessionEntry->limReassocBssCaps);
             p += log_sprintf( pMac,p, "limReassocBssQosCaps: %d \n", psessionEntry->limReassocBssQosCaps);
             p += log_sprintf( pMac,p, "limReassocBssPropCap: %d \n", psessionEntry->limReassocBssPropCap);
-            p += log_sprintf( pMac,p, "limReassocTitanHtCaps: %d \n", psessionEntry->limReassocTitanHtCaps);
             p += log_sprintf( pMac,p, "********************************************\n");
         }
     }
@@ -1499,30 +1490,37 @@
 static char* dump_lim_update_cb_Mode(tpAniSirGlobal pMac, tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3, tANI_U32 arg4, char *p)
 {
     tANI_U32 localPwrConstraint;
-    tpPESession psessionEntry = &pMac->lim.gpSession[0];  //TBD-RAJESH HOW TO GET sessionEntry?????
-    
-    if ( !pMac->lim.htCapability )
+    tpPESession psessionEntry = peFindSessionBySessionId(pMac, arg1);
+
+    if (psessionEntry == NULL)
+    {
+      p += log_sprintf( pMac, p, "Invalid sessionId: %d \n ", arg1);
+      return p;
+    }
+
+    if ( !psessionEntry->htCapability )
     {
         p += log_sprintf( pMac,p, "Error: Dot11 mode is non-HT, can not change the CB mode.\n");
         return p;
     }
-    
-    pMac->lim.gHTSecondaryChannelOffset = arg1;
-    setupCBState(pMac,  limGetAniCBState(pMac->lim.gHTSecondaryChannelOffset));
+
+    psessionEntry->htSupportedChannelWidthSet = arg2?1:0;
+    psessionEntry->htRecommendedTxWidthSet = psessionEntry->htSupportedChannelWidthSet;
+    psessionEntry->htSecondaryChannelOffset = arg2;
 
     if(eSIR_SUCCESS != cfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE,  
-                                    arg1 ? WNI_CFG_CHANNEL_BONDING_MODE_ENABLE : WNI_CFG_CHANNEL_BONDING_MODE_DISABLE))
+                                    arg2 ? WNI_CFG_CHANNEL_BONDING_MODE_ENABLE : WNI_CFG_CHANNEL_BONDING_MODE_DISABLE))
         p += log_sprintf(pMac,p, "cfgSetInt failed for WNI_CFG_CHANNEL_BONDING_MODE\n");
-    
+
     wlan_cfgGetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, &localPwrConstraint);
-        
-    limSendSwitchChnlParams(pMac, psessionEntry->currentOperChannel, pMac->lim.gHTSecondaryChannelOffset,
+
+    limSendSwitchChnlParams(pMac, psessionEntry->currentOperChannel, psessionEntry->htSecondaryChannelOffset,
                                                                   (tPowerdBm) localPwrConstraint, psessionEntry->peSessionId);
     if ( (limGetSystemRole(psessionEntry) == eLIM_AP_ROLE) ||
           (limGetSystemRole(psessionEntry) == eLIM_STA_IN_IBSS_ROLE))
            schSetFixedBeaconFields(pMac,psessionEntry);
     return p;
-    
+
 }
 
 static char* dump_lim_abort_scan(tpAniSirGlobal pMac, tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3, tANI_U32 arg4, char *p)
@@ -1712,6 +1710,7 @@
 static char *
 dump_lim_dot11h_stats( tpAniSirGlobal pMac, tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3, tANI_U32 arg4, char *p)
 {
+#if 0
     unsigned int i;
     (void) arg1; (void) arg2; (void) arg3; (void) arg4;
 
@@ -1780,6 +1779,7 @@
     }
     p += log_sprintf(pMac, p, "\n");
     
+#endif
     return p;
 }
 
@@ -1806,7 +1806,7 @@
 dump_lim_enable_quietIE( tpAniSirGlobal pMac, tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3, tANI_U32 arg4, char *p)
 {
     (void) arg2; (void) arg3; (void) arg4;
-
+#if 0
     if (arg1)
     {
         pMac->lim.gLimSpecMgmt.fQuietEnabled = eANI_BOOLEAN_TRUE;
@@ -1817,6 +1817,7 @@
         pMac->lim.gLimSpecMgmt.fQuietEnabled = eANI_BOOLEAN_FALSE;
         p += log_sprintf(pMac, p, "QuietIE disabled\n");
     }
+#endif
 
     return p;
 }
@@ -1858,8 +1859,8 @@
 static char *
 dump_lim_info( tpAniSirGlobal pMac, tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3, tANI_U32 arg4, char *p)
 {
-    (void) arg1; (void) arg2; (void) arg3; (void) arg4;
-    p = dumpLim( pMac, p );
+    (void) arg2; (void) arg3; (void) arg4;
+    p = dumpLim( pMac, p, arg1);
     return p;
 }
 
@@ -2305,10 +2306,61 @@
     return p;    
 }
 #endif
+static char *
+dump_lim_channel_switch_announcement( tpAniSirGlobal pMac, tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3, tANI_U32 arg4, char *p)
+{
+    tpPESession psessionEntry;
+    tANI_U8 nMode = arg2;
+    tANI_U8 nNewChannel = arg3;
+    tANI_U8 nCount = arg4;
+  tANI_U8 peer[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
 
+    if((psessionEntry = peFindSessionBySessionId(pMac,(tANI_U8)arg1) )== NULL)
+    {
+        p += log_sprintf( pMac,
+            p,"Session does not exist usage: 363 <0> sessionid channel \n");
+        printk("Session Not found!!!!\n");
+        return p;
+    }
+
+    limSendChannelSwitchMgmtFrame( pMac, peer, nMode, nNewChannel, nCount, psessionEntry );
+
+    psessionEntry->gLimChannelSwitch.switchCount = nCount;
+    psessionEntry->gLimSpecMgmt.dot11hChanSwState = eLIM_11H_CHANSW_RUNNING;
+    psessionEntry->gLimChannelSwitch.switchMode = nMode;
+    psessionEntry->gLimChannelSwitch.primaryChannel = nNewChannel;
+
+    schSetFixedBeaconFields(pMac, psessionEntry);
+    limSendBeaconInd(pMac, psessionEntry); 
+
+  return p;
+}
+
+static char *
+dump_lim_cancel_channel_switch_announcement( tpAniSirGlobal pMac, tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3, tANI_U32 arg4, char *p)
+{
+    tpPESession psessionEntry;
+
+    if((psessionEntry = peFindSessionBySessionId(pMac,(tANI_U8)arg1) )== NULL)
+    {
+        p += log_sprintf( pMac,
+            p,"Session does not exist usage: 363 <0> sessionid channel \n");
+        printk("Session Not found!!!!\n");
+        return p;
+    }
+    psessionEntry->gLimChannelSwitch.switchCount = 0;
+    psessionEntry->gLimSpecMgmt.dot11hChanSwState = eLIM_11H_CHANSW_INIT;
+    psessionEntry->gLimChannelSwitch.switchMode = 0;
+    psessionEntry->gLimChannelSwitch.primaryChannel = 0;
+
+    schSetFixedBeaconFields(pMac, psessionEntry);
+    limSendBeaconInd(pMac, psessionEntry); 
+
+  return p;
+}
 static tDumpFuncEntry limMenuDumpTable[] = {
     {0,     "PE (300-499)",                                          NULL},
-    {300,   "LIM: Dump state(s)/statistics",                         dump_lim_info},
+    {300,   "LIM: Dump state(s)/statistics <session id>",            dump_lim_info},
     {301,   "PE.LIM: dump TSPEC Table",                              dump_lim_tspec_table},
     {302,   "PE.LIM: dump specified TSPEC entry (id)",               dump_lim_tspec_entry},
     {303,   "PE.LIM: dump EDCA params",                              dump_lim_edca_params},
@@ -2347,7 +2399,7 @@
     {346,   "PE:LIM: Set the Dot11 Mode",                            dump_lim_set_dot11_mode},
     {347,   "PE:Enable or Disable Protection",                       dump_lim_set_protection_control},
     {348,   "PE:LIM: Send SM Power Mode Action frame",               dump_lim_send_SM_Power_Mode},
-    {349,   "PE: LIM: Change CB Mode",                               dump_lim_update_cb_Mode},
+    {349,   "PE: LIM: Change CB Mode <session id> <sec chnl offset>",dump_lim_update_cb_Mode},
     {350,   "PE: LIM: abort scan",                                   dump_lim_abort_scan},
     {351,   "PE: LIM: Start stop BG scan",                           dump_lim_start_stop_bg_scan},
     {352,   "PE: LIM: PE statistics <scanmask>",                     dump_lim_get_pe_statistics},
@@ -2370,6 +2422,8 @@
 #ifdef WLAN_FEATURE_VOWIFI_11R
     {363,   "PE.LIM: trigger pre auth/reassoc event",                dump_lim_ft_event},
 #endif
+    {364,   "PE.LIM: Send a channel switch announcement",            dump_lim_channel_switch_announcement},
+    {365,   "PE.LIM: Cancel channel switch announcement",            dump_lim_cancel_channel_switch_announcement},
 
 };
 
diff --git a/CORE/MAC/src/pe/lim/limP2P.c b/CORE/MAC/src/pe/lim/limP2P.c
index 6f4d465..1b99e87 100644
--- a/CORE/MAC/src/pe/lim/limP2P.c
+++ b/CORE/MAC/src/pe/lim/limP2P.c
@@ -60,6 +60,8 @@
 #define   BSSID_OFFSET           16
 #define   ADDR2_OFFSET           10
 #define   ACTION_OFFSET          24
+#define   LIM_MIN_REM_TIME_FOR_TX_ACTION_FRAME                     30
+#define   LIM_MIN_REM_TIME_EXT_FOR_TX_ACTION_FRAME                 40
 
 
 
@@ -76,7 +78,7 @@
                          tpSetLinkStateCallback callback, void *callbackArg);
 
 static tSirRetStatus limCreateSessionForRemainOnChn(tpAniSirGlobal pMac, tPESession **ppP2pSession);
-
+eHalStatus limP2PActionCnf(tpAniSirGlobal pMac, tANI_U32 txCompleteSuccess);
 /*------------------------------------------------------------------
  *
  * Below function is callback function, it is called when 
@@ -129,6 +131,8 @@
                 tANI_U32 val;
                 tSirMacAddr nullBssid = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
 
+                pMac->lim.p2pRemOnChanTimeStamp = vos_timer_get_system_time();
+                pMac->lim.gTotalScanDuration = MsgBuff->duration;
 
                 /* get the duration from the request */
                 val = SYS_MS_TO_TICKS(MsgBuff->duration);
@@ -315,6 +319,8 @@
     // Start timer here to come back to operating channel.
     pMac->lim.limTimers.gLimRemainOnChannelTimer.sessionId =
                                                 psessionEntry->peSessionId;
+    pMac->lim.p2pRemOnChanTimeStamp = vos_timer_get_system_time();
+    pMac->lim.gTotalScanDuration = MsgRemainonChannel->duration;
 
       /* get the duration from the request */
     val = SYS_MS_TO_TICKS(MsgRemainonChannel->duration);
@@ -367,6 +373,15 @@
     tpPESession psessionEntry;
     tSirMacAddr             nullBssid = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
 
+    //Timer might get extended while Sending Action Frame
+    //In that case don't process Channel Timeout
+    if (tx_timer_running(&pMac->lim.limTimers.gLimRemainOnChannelTimer))
+    {
+        limLog( pMac, LOGE, 
+                "still timer is running already and not processing limProcessRemainOnChnTimeout");
+        return;
+    }
+
     limDeactivateAndChangeTimer(pMac, eLIM_REMAIN_CHN_TIMER);
 
     if (NULL == pMac->lim.gpLimRemainOnChanReq)
@@ -480,6 +495,7 @@
            peDeleteSession( pMac, psessionEntry);
         }
     }
+
     /* Post the meessage to Sme */
     limSendSmeRsp(pMac, eWNI_SME_REMAIN_ON_CHN_RSP, status, 
                   MsgRemainonChannel->sessionId, 0);
@@ -488,6 +504,14 @@
     pMac->lim.gpLimRemainOnChanReq = NULL;
 
     pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
+
+    /* If remain on channel timer expired and action frame is pending then 
+     * indicaiton confirmation with status failure */
+    if (pMac->lim.actionFrameSessionId != 0xff)
+    {
+       limP2PActionCnf(pMac, 0);
+    }
+
     return;
 }
 
@@ -500,7 +524,7 @@
 void limSendSmeMgmtFrameInd(
                     tpAniSirGlobal pMac, tANI_U8 frameType,
                     tANI_U8  *frame, tANI_U32 frameLen, tANI_U16 sessionId,
-                    tANI_U32 rxChannel)
+                    tANI_U32 rxChannel, tpPESession psessionEntry)
 {
     tSirMsgQ              mmhMsg;
     tpSirSmeMgmtFrameInd pSirSmeMgmtFrame = NULL;
@@ -521,7 +545,21 @@
     pSirSmeMgmtFrame->mesgLen = length;
     pSirSmeMgmtFrame->sessionId = sessionId;
     pSirSmeMgmtFrame->frameType = frameType;
-    pSirSmeMgmtFrame->rxChan = rxChannel;
+
+    /* work around for 5Ghz channel is not correct since rxhannel 
+     * is 4 bits. So we don't indicate more than 16 channels 
+     */
+    if( (VOS_FALSE == 
+        tx_timer_running(&pMac->lim.limTimers.gLimRemainOnChannelTimer)) &&
+        (psessionEntry != NULL) && 
+        (SIR_BAND_5_GHZ == limGetRFBand(psessionEntry->currentOperChannel)) ) 
+    {
+        pSirSmeMgmtFrame->rxChan = psessionEntry->currentOperChannel;
+    }
+    else
+    {
+        pSirSmeMgmtFrame->rxChan = rxChannel;
+    }
 
     vos_mem_zero(pSirSmeMgmtFrame->frameBuf,frameLen);
     vos_mem_copy(pSirSmeMgmtFrame->frameBuf,frame,frameLen);
@@ -529,6 +567,41 @@
     mmhMsg.type = eWNI_SME_MGMT_FRM_IND;
     mmhMsg.bodyptr = pSirSmeMgmtFrame;
     mmhMsg.bodyval = 0;
+
+    if(VOS_TRUE == tx_timer_running(&pMac->lim.limTimers.gLimRemainOnChannelTimer) && 
+            ( (psessionEntry != NULL) && (psessionEntry->pePersona != VOS_P2P_GO_MODE)) &&
+            (frameType == SIR_MAC_MGMT_ACTION))
+    {
+        tANI_U32 curTime = vos_timer_get_system_time();
+        if((curTime - pMac->lim.p2pRemOnChanTimeStamp) > (pMac->lim.gTotalScanDuration - LIM_MIN_REM_TIME_FOR_TX_ACTION_FRAME))
+        {
+            unsigned int chanWaitTime, vStatus ;
+
+            limLog( pMac, LOG1, FL("Rx: Extend the gLimRemainOnChannelTimer"));
+
+            pMac->lim.p2pRemOnChanTimeStamp = vos_timer_get_system_time();
+            pMac->lim.gTotalScanDuration = LIM_MIN_REM_TIME_EXT_FOR_TX_ACTION_FRAME;
+
+            chanWaitTime = SYS_MS_TO_TICKS(40);
+            vStatus = tx_timer_deactivate(&pMac->lim.limTimers.gLimRemainOnChannelTimer);
+
+            if (VOS_STATUS_SUCCESS != vStatus)
+            {     
+                limLog( pMac, LOGE, FL("Rx: Extend the gLimRemainOnChannelTimer"));
+            } 
+
+            if (tx_timer_change(&pMac->lim.limTimers.gLimRemainOnChannelTimer, chanWaitTime, 0) != TX_SUCCESS)
+            {
+                limLog( pMac, LOGE, FL("Unable to change the gLimRemainOnChannelTimer"));
+            }
+
+            if (tx_timer_activate(&pMac->lim.limTimers.gLimRemainOnChannelTimer) != 0)
+            {
+                limLog( pMac, LOGE, FL("Unable to active the gLimRemainOnChannelTimer"));
+            } 
+        } 
+    }
+
     limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
     return;
 } /*** end limSendSmeListenRsp() ***/
@@ -536,20 +609,26 @@
 
 eHalStatus limP2PActionCnf(tpAniSirGlobal pMac, tANI_U32 txCompleteSuccess)
 {
-    limSendSmeRsp(pMac, eWNI_SME_ACTION_FRAME_SEND_CNF,
-            (txCompleteSuccess ? eSIR_SME_SUCCESS : eSIR_SME_SEND_ACTION_FAIL),
-             pMac->lim.actionFrameSessionId, 0);
+    if (pMac->lim.actionFrameSessionId != 0xff)
+    {
+        /* The session entry might be invalid(0xff) action confirmation received after
+         * remain on channel timer expired */
+        limSendSmeRsp(pMac, eWNI_SME_ACTION_FRAME_SEND_CNF,
+                (txCompleteSuccess ? eSIR_SME_SUCCESS : eSIR_SME_SEND_ACTION_FAIL),
+                pMac->lim.actionFrameSessionId, 0);
+        pMac->lim.actionFrameSessionId = 0xff;
+    }
 
     return eHAL_STATUS_SUCCESS;
 }
 
 
-void limSetHtCaps(tpAniSirGlobal pMac,tANI_U8 *pIeStartPtr,tANI_U32 nBytes)
+void limSetHtCaps(tpAniSirGlobal pMac, tpPESession psessionEntry, tANI_U8 *pIeStartPtr,tANI_U32 nBytes)
 {
     v_U8_t              *pIe=NULL;
     tDot11fIEHTCaps     dot11HtCap;
 
-    PopulateDot11fHTCaps(pMac,&dot11HtCap);
+    PopulateDot11fHTCaps(pMac, psessionEntry, &dot11HtCap);
     pIe = limGetIEPtr(pMac,pIeStartPtr, nBytes,
                                        DOT11F_EID_HTCAPS,ONE_BYTE);
    limLog( pMac, LOGE, FL("pIe 0x%x dot11HtCap.supportedMCSSet[0]=0x%x"),
@@ -772,9 +851,53 @@
 
         if (SIR_MAC_MGMT_PROBE_RSP == pFc->subType)
         {
-            limSetHtCaps( pMac,(tANI_U8*)pMbMsg->data + PROBE_RSP_IE_OFFSET,
+            limSetHtCaps( pMac, psessionEntry, (tANI_U8*)pMbMsg->data + PROBE_RSP_IE_OFFSET,
                            nBytes);
         }
+        
+        /* The minimum wait for any action frame should be atleast 100 ms.
+         * If supplicant sends action frame at the end of already running remain on channel time
+         * Then there is a chance to miss the response of the frame. So increase the remain on channel
+         * time for all action frame to make sure that we receive the response frame */
+        if ((SIR_MAC_MGMT_ACTION == pFc->subType) &&
+                (0 != pMbMsg->wait))
+        {
+            if (tx_timer_running(&pMac->lim.limTimers.gLimRemainOnChannelTimer))
+            {
+                tANI_U32 val = 0;
+                tx_timer_deactivate(&pMac->lim.limTimers.gLimRemainOnChannelTimer);
+                /* get the duration from the request */
+                pMac->lim.p2pRemOnChanTimeStamp = vos_timer_get_system_time();
+                pMac->lim.gTotalScanDuration = pMbMsg->wait;
+
+                val = SYS_MS_TO_TICKS(pMbMsg->wait);
+
+                limLog(pMac, LOG1,
+                        FL("Tx: Extending the gLimRemainOnChannelTimer\n"));
+                if (tx_timer_change(
+                            &pMac->lim.limTimers.gLimRemainOnChannelTimer, val, 0)
+                        != TX_SUCCESS)
+                {
+                    limLog(pMac, LOGP,
+                            FL("Unable to change remain on channel Timer val\n"));
+                    return;
+                }
+                else if(TX_SUCCESS != tx_timer_activate(
+                            &pMac->lim.limTimers.gLimRemainOnChannelTimer))
+                {
+                    limLog(pMac, LOGP,
+                            FL("Unable to activate remain on channel Timer\n"));
+                    limDeactivateAndChangeTimer(pMac, eLIM_REMAIN_CHN_TIMER);
+                    return;
+                }
+            }
+            else
+            {
+                limSendSmeRsp(pMac, eWNI_SME_ACTION_FRAME_SEND_CNF, 
+                        eHAL_STATUS_FAILURE, pMbMsg->sessionId, 0);
+                return;
+            }
+        }
     }
 
 
@@ -812,15 +935,21 @@
      */
     txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
 
-    if (SIR_MAC_MGMT_PROBE_RSP == pFc->subType)
+    if ( (SIR_MAC_MGMT_PROBE_RSP == pFc->subType) ||
+         (pMbMsg->noack)
+        )
     {
         halstatus = halTxFrame( pMac, pPacket, (tANI_U16)nBytes,
                         HAL_TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS,
                         7,/*SMAC_SWBD_TX_TID_MGMT_HIGH */ limTxComplete, pFrame,
                         txFlag );
 
-        limSendSmeRsp(pMac, eWNI_SME_ACTION_FRAME_SEND_CNF, 
+        if (!pMbMsg->noack)
+        {
+           limSendSmeRsp(pMac, eWNI_SME_ACTION_FRAME_SEND_CNF, 
                halstatus, pMbMsg->sessionId, 0);
+        }
+        pMac->lim.actionFrameSessionId = 0xff;
     }
     else
     {
@@ -834,10 +963,14 @@
              limLog( pMac, LOGE, FL("could not send action frame!\n" ));
              limSendSmeRsp(pMac, eWNI_SME_ACTION_FRAME_SEND_CNF, halstatus, 
                 pMbMsg->sessionId, 0);
+             pMac->lim.actionFrameSessionId = 0xff;
         }
         else
         {
              pMac->lim.actionFrameSessionId = pMbMsg->sessionId;
+             limLog( pMac, LOGE, FL("lim.actionFrameSessionId = %lu\n" ), 
+                     pMac->lim.actionFrameSessionId);
+
         }
     }
 
diff --git a/CORE/MAC/src/pe/lim/limProcessActionFrame.c b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
index 4c89a87..016cc10 100644
--- a/CORE/MAC/src/pe/lim/limProcessActionFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
@@ -57,6 +57,7 @@
 #if defined WLAN_FEATURE_VOWIFI
 #include "rrmApi.h"
 #endif
+#include "limSessionUtils.h"
 
 #if defined FEATURE_WLAN_CCX
 #include "ccxApi.h"
@@ -88,12 +89,21 @@
 void limStopTxAndSwitchChannel(tpAniSirGlobal pMac, tANI_U8 sessionId)
 {
     tANI_U8 isFullPowerRequested = 0;
+    tpPESession psessionEntry;
+
+    psessionEntry = peFindSessionBySessionId( pMac , sessionId );
+
+    if( NULL == psessionEntry )
+    {
+      limLog(pMac, LOGE, FL("Session %d  not active\n "), sessionId);
+      return;
+    }
 
     PELOG1(limLog(pMac, LOG1, FL("Channel switch Mode == %d\n"), 
-                       pMac->lim.gLimChannelSwitch.switchMode);)
+                       psessionEntry->gLimChannelSwitch.switchMode);)
 
-    if (pMac->lim.gLimChannelSwitch.switchMode == eSIR_CHANSW_MODE_SILENT ||
-        pMac->lim.gLimChannelSwitch.switchCount <= SIR_CHANSW_TX_STOP_MAX_COUNT)
+    if (psessionEntry->gLimChannelSwitch.switchMode == eSIR_CHANSW_MODE_SILENT ||
+        psessionEntry->gLimChannelSwitch.switchCount <= SIR_CHANSW_TX_STOP_MAX_COUNT)
     {
         /* Freeze the transmission */
         limFrameTransmissionControl(pMac, eLIM_TX_ALL, eLIM_STOP_TX);
@@ -112,11 +122,12 @@
         limFrameTransmissionControl(pMac, eLIM_TX_ALL, eLIM_RESUME_TX);
     }
 
+    pMac->lim.limTimers.gLimChannelSwitchTimer.sessionId = sessionId;
     /* change the channel immediatly only if the channel switch count is 0 and the 
      * device is not in powersave 
      * If the device is in powersave channel switch should happen only after the
      * device comes out of the powersave */
-    if (pMac->lim.gLimChannelSwitch.switchCount == 0) 
+    if (psessionEntry->gLimChannelSwitch.switchCount == 0) 
     {
         if(limIsSystemInActiveState(pMac))
         {
@@ -131,10 +142,8 @@
         }
         return;
     }
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_CHANNEL_SWITCH_TIMER));
 
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_CHANNEL_SWITCH_TIMER));
-
-    pMac->lim.limTimers.gLimChannelSwitchTimer.sessionId = sessionId;
 
     if (tx_timer_activate(&pMac->lim.limTimers.gLimChannelSwitchTimer) != TX_SUCCESS)
     {
@@ -156,31 +165,54 @@
 tSirRetStatus limStartChannelSwitch(tpAniSirGlobal pMac, tpPESession psessionEntry)
 {
     PELOG1(limLog(pMac, LOG1, FL("Starting the channel switch\n"));)
+    
+    /*If channel switch is already running and it is on a different session, just return*/  
+    /*This need to be removed for MCC */
+    if( limIsChanSwitchRunning (pMac) &&
+        psessionEntry->gLimSpecMgmt.dot11hChanSwState != eLIM_11H_CHANSW_RUNNING )
+    {
+       limLog(pMac, LOGW, FL("Ignoring channel switch on session %d\n"), psessionEntry->peSessionId);
+       return eSIR_SUCCESS;
+    }
+     
     /* Deactivate and change reconfigure the timeout value */
-    limDeactivateAndChangeTimer(pMac, eLIM_CHANNEL_SWITCH_TIMER);
+    //limDeactivateAndChangeTimer(pMac, eLIM_CHANNEL_SWITCH_TIMER);
+    if (tx_timer_deactivate(&pMac->lim.limTimers.gLimChannelSwitchTimer) != eSIR_SUCCESS)
+    {
+        limLog(pMac, LOGP, FL("tx_timer_deactivate failed!\n"));
+        return eSIR_FAILURE;
+    }
+
+    if (tx_timer_change(&pMac->lim.limTimers.gLimChannelSwitchTimer,
+                psessionEntry->gLimChannelSwitch.switchTimeoutValue,
+                            0) != TX_SUCCESS)
+    {
+        limLog(pMac, LOGP, FL("tx_timer_change failed \n"));
+        return eSIR_FAILURE;
+    }
 
     /* Follow the channel switch, forget about the previous quiet. */
     //If quiet is running, chance is there to resume tx on its timeout.
     //so stop timer for a safer side.
-    if (pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN)
+    if (psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN)
     {
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_QUIET_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, psessionEntry->peSessionId, eLIM_QUIET_TIMER));
         if (tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietTimer) != TX_SUCCESS)
         {
             limLog(pMac, LOGP, FL("tx_timer_deactivate failed\n"));
             return eSIR_FAILURE;
         }
     }
-    else if (pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING)
+    else if (psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING)
     {
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_QUIET_BSS_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, psessionEntry->peSessionId, eLIM_QUIET_BSS_TIMER));
         if (tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietBssTimer) != TX_SUCCESS)
         {
             limLog(pMac, LOGP, FL("tx_timer_deactivate failed\n"));
             return eSIR_FAILURE;
         }
     }
-    pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
+    psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
 
     /* Prepare for 11h channel switch */
     limPrepareFor11hChannelSwitch(pMac, psessionEntry);
@@ -276,37 +308,26 @@
 
         beaconPeriod = (tANI_U16) val;
 
-        pMac->lim.gLimChannelSwitch.primaryChannel = pChannelSwitchFrame->ChanSwitchAnn.newChannel;
-        pMac->lim.gLimChannelSwitch.switchCount = pChannelSwitchFrame->ChanSwitchAnn.switchCount;
-        pMac->lim.gLimChannelSwitch.switchTimeoutValue = SYS_MS_TO_TICKS(beaconPeriod) *
-                                                         pMac->lim.gLimChannelSwitch.switchCount;
-        pMac->lim.gLimChannelSwitch.switchMode = pChannelSwitchFrame->ChanSwitchAnn.switchMode;
+        psessionEntry->gLimChannelSwitch.primaryChannel = pChannelSwitchFrame->ChanSwitchAnn.newChannel;
+        psessionEntry->gLimChannelSwitch.switchCount = pChannelSwitchFrame->ChanSwitchAnn.switchCount;
+        psessionEntry->gLimChannelSwitch.switchTimeoutValue = SYS_MS_TO_TICKS(beaconPeriod) *
+                                                         psessionEntry->gLimChannelSwitch.switchCount;
+        psessionEntry->gLimChannelSwitch.switchMode = pChannelSwitchFrame->ChanSwitchAnn.switchMode;
 
        PELOG3(limLog(pMac, LOG3, FL("Rcv Chnl Swtch Frame: Timeout in %d ticks\n"),
-                             pMac->lim.gLimChannelSwitch.switchTimeoutValue);)
+                             psessionEntry->gLimChannelSwitch.switchTimeoutValue);)
 
         /* Only primary channel switch element is present */
-        pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_ONLY;
-        pMac->lim.gLimChannelSwitch.secondarySubBand = eANI_CB_SECONDARY_NONE;
+        psessionEntry->gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_ONLY;
+        psessionEntry->gLimChannelSwitch.secondarySubBand = PHY_SINGLE_CHANNEL_CENTERED;
 
-        if(GET_CB_ADMIN_STATE(pMac->lim.gCbState))
+        if (psessionEntry->htSupportedChannelWidthSet)
         {
-            switch(pChannelSwitchFrame->ExtChanSwitchAnn.secondaryChannelOffset)
+            if ((pChannelSwitchFrame->ExtChanSwitchAnn.secondaryChannelOffset == PHY_DOUBLE_CHANNEL_LOW_PRIMARY) ||
+                (pChannelSwitchFrame->ExtChanSwitchAnn.secondaryChannelOffset == PHY_DOUBLE_CHANNEL_HIGH_PRIMARY))
             {
-                case eHT_SECONDARY_CHANNEL_OFFSET_UP:
-                    pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY;
-                    pMac->lim.gLimChannelSwitch.secondarySubBand = eANI_CB_SECONDARY_UP;
-                    break;
-
-                case eHT_SECONDARY_CHANNEL_OFFSET_DOWN:
-                    pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY;
-                    pMac->lim.gLimChannelSwitch.secondarySubBand = eANI_CB_SECONDARY_DOWN;
-                    break;
-
-                case eHT_SECONDARY_CHANNEL_OFFSET_NONE:
-                default:
-                    /* Nothing to be done here */
-                    break;
+                psessionEntry->gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY;
+                psessionEntry->gLimChannelSwitch.secondarySubBand = pChannelSwitchFrame->ExtChanSwitchAnn.secondaryChannelOffset;
             }
         }
 
@@ -779,7 +800,7 @@
     else
     {
       //send message to HAL to delete TS
-      if(eSIR_SUCCESS != limSendHalMsgDelTs(pMac, pSta->staIndex, tspecIdx, delts))
+      if(eSIR_SUCCESS != limSendHalMsgDelTs(pMac, pSta->staIndex, tspecIdx, delts, psessionEntry->peSessionId))
       {
         limLog(pMac, LOGW, FL("DelTs with UP %d failed in limSendHalMsgDelTs - ignoring request\n"),
                          tsinfo->traffic.userPrio);
@@ -1987,7 +2008,7 @@
                  // type is ACTION
                  limSendSmeMgmtFrameInd(pMac, pHdr->fc.subType, 
                     (tANI_U8*)pHdr, frameLen + sizeof(tSirMacMgmtHdr), 0, 
-                    WDA_GET_RX_CH( pRxPacketInfo ));
+                    WDA_GET_RX_CH( pRxPacketInfo ), psessionEntry);
               }
               else
               {
@@ -2068,7 +2089,7 @@
                   // type is ACTION
                   limSendSmeMgmtFrameInd(pMac, pHdr->fc.subType, 
                       (tANI_U8*)pHdr, frameLen + sizeof(tSirMacMgmtHdr), 0,
-                      WDA_GET_RX_CH( pBd ));
+                      WDA_GET_RX_CH( pBd ), NULL);
                 }
                 else
                 {
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
index 6ee945d..5754e5e 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
@@ -220,6 +220,18 @@
     limLog(pMac, LOG2, FL("Received AssocReq Frame: "));
     sirDumpBuf(pMac, SIR_LIM_MODULE_ID, LOG2, (tANI_U8 *) pBody, framelen);
 
+    if( palEqualMemory( pMac->hHdd,  (tANI_U8* ) pHdr->sa, (tANI_U8 *) pHdr->da, 
+                        (tANI_U8) (sizeof(tSirMacAddr))))
+    {
+        limSendAssocRspMgmtFrame(pMac,
+                    eSIR_MAC_UNSPEC_FAILURE_STATUS,
+                    1,
+                    pHdr->sa,
+                    subType, 0,psessionEntry);
+        limLog(pMac, LOGE, FL("Rejected Assoc Req frame Since same mac as SAP/GO\n"));
+        return ;
+    }
+
 #ifdef WLAN_SOFTAP_FEATURE
     // If TKIP counter measures active send Assoc Rsp frame to station with eSIR_MAC_MIC_FAILURE_REASON
     if ((psessionEntry->bTkipCntrMeasActive) && (psessionEntry->limSystemRole == eLIM_AP_ROLE))
@@ -601,7 +613,7 @@
 
     // Check for 802.11n HT caps compatibility; are HT Capabilities
     // turned on in lim?
-    if ( psessionEntry->htCapabality )
+    if ( psessionEntry->htCapability )
     {
         // There are; are they turned on in the STA?
         if ( pAssocReq->HTCaps.present )
@@ -870,6 +882,7 @@
             }
             limPrintMacAddr(pMac, pHdr->sa, LOG1);
             limPrintMlmState(pMac, LOG1, (tLimMlmStates) pStaDs->mlmStaContext.mlmState);
+
             goto error;
         } // if (pStaDs->mlmStaContext.mlmState != eLIM_MLM_LINK_ESTABLISHED_STATE)
 
@@ -1012,6 +1025,9 @@
     psessionEntry->parsedAssocReq[pStaDs->assocId] = pAssocReq;
 
     pStaDs->mlmStaContext.htCapability = pAssocReq->HTCaps.present;
+#ifdef WLAN_FEATURE_11AC
+    pStaDs->mlmStaContext.vhtCapability = pAssocReq->VHTCaps.present;
+#endif
     pStaDs->qos.addtsPresent = (pAssocReq->addtsPresent==0) ? false : true;
     pStaDs->qos.addts        = pAssocReq->addtsReq;
     pStaDs->qos.capability   = pAssocReq->qosCapability;
@@ -1067,10 +1083,30 @@
         pStaDs->htShortGI20Mhz = (tANI_U8)pAssocReq->HTCaps.shortGI20MHz;
         pStaDs->htShortGI40Mhz = (tANI_U8)pAssocReq->HTCaps.shortGI40MHz;
         pStaDs->htSupportedChannelWidthSet = (tANI_U8)pAssocReq->HTCaps.supportedChannelWidthSet;
+        /* peer just follows AP; so when we are softAP/GO, we just store our session entry's secondary channel offset here in peer INFRA STA
+         * However, if peer's 40MHz channel width support is disabled then secondary channel will be zero
+         */
+        pStaDs->htSecondaryChannelOffset = (pStaDs->htSupportedChannelWidthSet)?psessionEntry->htSecondaryChannelOffset:0;
+#ifdef WLAN_FEATURE_11AC
+        if (pAssocReq->VHTCaps.present)
+        {
+            pStaDs->vhtSupportedChannelWidthSet = (tANI_U8)pAssocReq->VHTCaps.supportedChannelWidthSet; 
+        }
+#endif
         pStaDs->baPolicyFlag = 0xFF;
     }
 
 
+#ifdef WLAN_FEATURE_11AC
+if (limPopulateMatchingRateSet(pMac,
+                               pStaDs,
+                               &(pAssocReq->supportedRates),
+                               &(pAssocReq->extendedRates),
+                               pAssocReq->HTCaps.supportedMCSSet,
+                               &(pAssocReq->propIEinfo.propRates),
+                               psessionEntry , &pAssocReq->VHTCaps) 
+                               != eSIR_SUCCESS)
+#else
 
     if (limPopulateMatchingRateSet(pMac,
                                    pStaDs,
@@ -1078,6 +1114,7 @@
                                    &(pAssocReq->extendedRates),
                                    pAssocReq->HTCaps.supportedMCSSet,
                                    &(pAssocReq->propIEinfo.propRates), psessionEntry) != eSIR_SUCCESS)
+#endif
     {
         // Could not update hash table entry at DPH with rateset
         limLog(pMac, LOGE,
@@ -1262,8 +1299,11 @@
         }
     }
 
-    if(pStaDs!= NULL)
+    /* If it is not duplicate Assoc request then only make to Null */
+    if ((pStaDs != NULL) &&
+          (pStaDs->mlmStaContext.mlmState != eLIM_MLM_WT_ADD_STA_RSP_STATE))
         psessionEntry->parsedAssocReq[pStaDs->assocId] = NULL;
+
     return;
 
 } /*** end limProcessAssocReqFrame() ***/
@@ -1396,10 +1436,6 @@
                            pAssocReq->rsn.length);
         }
 
-        //FIXME: we need to have the cb information seprated between HT and Titan later. 
-        if(pAssocReq->HTCaps.present)
-            limGetHtCbAdminState(pMac, pAssocReq->HTCaps, &pMlmAssocInd->titanHtCaps);
-
         // Fill in 802.11h related info
         if (pAssocReq->powerCapabilityPresent && pAssocReq->supportedChannelsPresent)
         {
@@ -1554,9 +1590,6 @@
             palCopyMemory( pMac->hHdd, &pMlmReassocInd->rsnIE.rsnIEdata[2], pAssocReq->rsn.info, pAssocReq->rsn.length);
         }
 
-        if(pAssocReq->HTCaps.present)
-              limGetHtCbAdminState(pMac, pAssocReq->HTCaps,  &pMlmReassocInd->titanHtCaps );
-
         // 802.11h support
         if (pAssocReq->powerCapabilityPresent && pAssocReq->supportedChannelsPresent)
         {
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
index b76995a..77cf321 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
@@ -128,6 +128,8 @@
                    pStaDs->htMaxRxAMpduFactor = pAssocRsp->HTCaps.maxRxAMPDUFactor;
                    limFillRxHighestSupportedRate(pMac, &rxHighestRate, pAssocRsp->HTCaps.supportedMCSSet);
                    pStaDs->supportedRates.rxHighestDataRate = rxHighestRate;
+                   /* This is for AP as peer STA and we are INFRA STA. We will put APs offset in dph node which is peer STA */
+                   pStaDs->htSecondaryChannelOffset = (tANI_U8)pAssocRsp->HTInfo.secondaryChannelOffset;
 
                    //FIXME_AMPDU
                    // In the future, may need to check for "assoc.HTCaps.delayedBA"
@@ -135,8 +137,19 @@
                    pStaDs->baPolicyFlag = 0xFF;
            }
        }
-    
-       if (limPopulateOwnRateSet(pMac, &pStaDs->supportedRates, pAssocRsp->HTCaps.supportedMCSSet, false,psessionEntry) != eSIR_SUCCESS) {
+
+#ifdef WLAN_FEATURE_11AC
+       if(IS_DOT11_MODE_VHT(psessionEntry->dot11mode))
+       {
+           pStaDs->mlmStaContext.vhtCapability = pAssocRsp->VHTCaps.present;
+       }
+       if (limPopulateOwnRateSet(pMac, &pStaDs->supportedRates, 
+                                pAssocRsp->HTCaps.supportedMCSSet,
+                                false,psessionEntry , &pAssocRsp->VHTCaps) != eSIR_SUCCESS) 
+#else
+       if (limPopulateOwnRateSet(pMac, &pStaDs->supportedRates, pAssocRsp->HTCaps.supportedMCSSet, false,psessionEntry) != eSIR_SUCCESS) 
+#endif
+       {
            limLog(pMac, LOGP, FL("could not get rateset and extended rate set\n"));
            return;
        }
@@ -231,10 +244,13 @@
     palCopyMemory( pMac->hHdd, psessionEntry->bssId,
                   psessionEntry->limReAssocbssId, sizeof(tSirMacAddr));
     psessionEntry->currentOperChannel = psessionEntry->limReassocChannelId;
+    psessionEntry->htSecondaryChannelOffset = psessionEntry->reAssocHtSupportedChannelWidthSet;
+    psessionEntry->htRecommendedTxWidthSet = psessionEntry->reAssocHtRecommendedTxWidthSet;
+    psessionEntry->htSecondaryChannelOffset = psessionEntry->reAssocHtSecondaryChannelOffset;
     psessionEntry->limCurrentBssCaps   = psessionEntry->limReassocBssCaps;
     psessionEntry->limCurrentBssQosCaps = psessionEntry->limReassocBssQosCaps;
     psessionEntry->limCurrentBssPropCap = psessionEntry->limReassocBssPropCap;
-    psessionEntry->limCurrentTitanHtCaps = psessionEntry->limReassocTitanHtCaps;
+
     palCopyMemory( pMac->hHdd, (tANI_U8 *) &psessionEntry->ssId,
                   (tANI_U8 *) &psessionEntry->limReassocSSID,
                   psessionEntry->limReassocSSID.length+1);
@@ -243,7 +259,7 @@
     psessionEntry->limAID = pAssocRsp->aid & 0x3FFF;
     /** Set the State Back to ReAssoc Rsp*/
     psessionEntry->limMlmState = eLIM_MLM_WT_REASSOC_RSP_STATE; 
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
     
 }
@@ -748,17 +764,15 @@
 #endif
        ) {
         PELOGE(limLog(pMac, LOGE,  FL("Assoc Rejected by the peer. Reason: %d\n"), mlmAssocCnf.resultCode);)
-        pMac->lim.gLimMlmState = eLIM_MLM_IDLE_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
         if (psessionEntry->pLimMlmJoinReq)
         {
             palFreeMemory( pMac->hHdd, psessionEntry->pLimMlmJoinReq);
             psessionEntry->pLimMlmJoinReq = NULL;
         }
-        if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE,psessionEntry->bssId, 
-             psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
-            PELOGE(limLog(pMac, LOGE,  FL("Failed to set the LinkState\n"));)
+
         if (subType == LIM_ASSOC)
         {
            limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
diff --git a/CORE/MAC/src/pe/lim/limProcessAuthFrame.c b/CORE/MAC/src/pe/lim/limProcessAuthFrame.c
index 08fd818..5049af5 100644
--- a/CORE/MAC/src/pe/lim/limProcessAuthFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAuthFrame.c
@@ -192,7 +192,7 @@
 
     pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
 
-    PELOG3(sirDumpBuf(pMac, SIR_LIM_MODULE_ID, LOG3, (tANI_U8*)pBd, ((tpHalBufDesc) pBd)->mpduDataOffset + frameLen);)
+    //PELOG3(sirDumpBuf(pMac, SIR_LIM_MODULE_ID, LOG3, (tANI_U8*)pBd, ((tpHalBufDesc) pBd)->mpduDataOffset + frameLen);)
 
 
    
@@ -1162,7 +1162,7 @@
                                                     encrAuthFrame,key_length);
 
                                 psessionEntry->limMlmState = eLIM_MLM_WT_AUTH_FRAME4_STATE;
-                                MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+                                MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
                                 limSendAuthMgmtFrame(pMac,
                                                      (tpSirMacAuthFrameBody) encrAuthFrame,
@@ -1243,7 +1243,7 @@
 
                                 psessionEntry->limMlmState =
                                 eLIM_MLM_WT_AUTH_FRAME4_STATE;
-                                MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+                                MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
                                 limSendAuthMgmtFrame(pMac,
                                                      (tpSirMacAuthFrameBody) encrAuthFrame,
diff --git a/CORE/MAC/src/pe/lim/limProcessBeaconFrame.c b/CORE/MAC/src/pe/lim/limProcessBeaconFrame.c
index e797901..5b2e128 100644
--- a/CORE/MAC/src/pe/lim/limProcessBeaconFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessBeaconFrame.c
@@ -119,8 +119,8 @@
         }
 
 
-        MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, beacon.timeStamp[0]);)
-        MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, beacon.timeStamp[1]);)
+       MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, psessionEntry->peSessionId, beacon.timeStamp[0]);)
+       MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, psessionEntry->peSessionId, beacon.timeStamp[1]);)
 
 
         if ((pMac->lim.gLimMlmState  == eLIM_MLM_WT_PROBE_RESP_STATE) ||
diff --git a/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c b/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c
index 726da44..0e82c0d 100644
--- a/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c
+++ b/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c
@@ -129,101 +129,6 @@
 
 } /*** end limSetDefaultKeyIdAndKeys() ***/
 
-
-/**
- * handleCBCFGChange()
- *
- *FUNCTION:
- *
- *PARAMS:
- *
- *LOGIC:
- *
- *ASSUMPTIONS:
- * If this API is invoked with
- *   cfgId == ANI_IGNORE_CFG_ID
- * Then,
- *   this routine will traverse thru' ALL the
- *   related CFG's that are statically setup
- * Else,
- *   only update this "1" CFG identified by cfgId
- *
- *NOTE:
- *
- * @param  pMac  - Pointer to Global MAC structure
- * @param  cfgId - ID of CFG parameter that got updated
- * @return None
- */
-void handleCBCFGChange( tpAniSirGlobal pMac, tANI_U32 cfgId )
-{
-tANI_U32 cfg, val, i = 0;
-tANI_U32 defaultCfgList[] = { 
-  WNI_CFG_CHANNEL_BONDING_MODE,
-  ANI_IGNORE_CFG_ID };
-
-  do
-  {
-    //
-    // Determine if we have to use our own default CFG list
-    // OR should we use the argument passed to us
-    //
-    if( ANI_IGNORE_CFG_ID == cfgId )
-      cfg = defaultCfgList[i]; // "n" iterations reqd
-    else
-      cfg = cfgId; // Just "1" iteration reqd
-
-    switch( cfg )
-    {
-      case WNI_CFG_CHANNEL_BONDING_MODE:
-        if( eSIR_SUCCESS != wlan_cfgGetInt( pMac,
-              WNI_CFG_CHANNEL_BONDING_MODE,
-              &val ))
-        {
-          limLog( pMac, LOGW,
-              FL("Unable to retrieve CHANNEL BONDING Mode from CFG. Defaulting to DISABLE\n"));
-          pMac->lim.gCbMode = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
-        }
-        else
-          pMac->lim.gCbMode = (tANI_U8) val;
-
-        // Now, set the CHANNEL BONDING state apropriately
-        switch( pMac->lim.gCbMode )
-        {
-          // Always OFF
-          case WNI_CFG_CHANNEL_BONDING_MODE_DISABLE:
-            SET_CB_STATE_DISABLE( pMac->lim.gCbState );
-            break;
-
-          // Always ON
-          case WNI_CFG_CHANNEL_BONDING_MODE_ENABLE:
-            SET_CB_STATE_ENABLE( pMac->lim.gCbState );
-            break;
-
-          default:
-            SET_CB_STATE_ENABLE( pMac->lim.gCbState );
-            break;
-        }
-        break;
-
-      default:
-          break;
-    }
-
-    // DEBUG LOG the TITAN CFG's
-    limLog( pMac, LOG1,
-        FL("The TITAN related global CFG's are: "
-          "cbMode - %1d cbState - %1d\n"),
-        pMac->lim.gCbMode, pMac->lim.gCbState);
-
-    // If only "1" CFG needs an update, then return
-    if( ANI_IGNORE_CFG_ID == cfgId )
-      i++;
-    else
-      break;
-
-  } while( ANI_IGNORE_CFG_ID != defaultCfgList[i] ); // End-Of-List?
-}
-
 /** -------------------------------------------------------------
 \fn limSetCfgProtection
 \brief sets lim global cfg cache from the config.
@@ -371,10 +276,8 @@
 {
     tANI_U32 val1, val2;
     tANI_U16 val16;
-    tANI_U8 val8;
     tSirMacHTCapabilityInfo   *pHTCapabilityInfo;
     tSirMacHTParametersInfo *pAmpduParamInfo;
-    tSirMacHTInfoField1         *pHTInfoField1;
 
     PELOG3(limLog(pMac, LOG3, FL("Handling CFG parameter id %X update\n"), cfgId);)
     switch (cfgId)
@@ -436,7 +339,7 @@
                    (pMac->lim.gLimSmeState == eLIM_SME_NORMAL_STATE)))
             {
                 // Reactivate Background scan timer
-                MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_BACKGROUND_SCAN_TIMER));
+                MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_BACKGROUND_SCAN_TIMER));
                 if (tx_timer_activate(
                       &pMac->lim.limTimers.gLimBackgroundScanTimer) != TX_SUCCESS)
                 {
@@ -473,7 +376,7 @@
                 pMac->lim.limTimers.gLimPreAuthClnupTimer.sessionId = sessionId;
 #endif
                 // Reactivate pre-auth cleanup timer
-                MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_PRE_AUTH_CLEANUP_TIMER));
+                MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_PRE_AUTH_CLEANUP_TIMER));
                 if (tx_timer_activate(&pMac->lim.limTimers.gLimPreAuthClnupTimer)
                                                        != TX_SUCCESS)
                 {
@@ -499,44 +402,6 @@
 
             break;
 
-    case WNI_CFG_CHANNEL_BONDING_MODE:
-         handleCBCFGChange( pMac, cfgId );
-         //for Secondary channel, change setupCBMode function OR the caller of that function during Join (STA) or Start BSS(AP/IBSS)
-         //Now update the HT Capability CFG based on Channel Bonding CFG
-         if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS) 
-            {
-                PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG\n"));)
-                break;
-            }
-        if (wlan_cfgGetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, &val2) != eSIR_SUCCESS) 
-            {
-                PELOGE(limLog(pMac, LOGE, FL("could not retrieve Channel Bonding CFG\n"));)
-                break;
-            }
-        val16 = ( tANI_U16 ) val1;
-        pHTCapabilityInfo = ( tSirMacHTCapabilityInfo* ) &val16;
-
-        //channel bonding mode could be set to anything from 0 to 4(Titan had these modes)
-        //But for Taurus we have only two modes: enable(>0) or disable(=0)
-        pHTCapabilityInfo->supportedChannelWidthSet = val2 ? WNI_CFG_CHANNEL_BONDING_MODE_ENABLE : WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
-        if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) != eSIR_SUCCESS)
-            PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG\n"));)
-
-         if (wlan_cfgGetInt(pMac, WNI_CFG_HT_INFO_FIELD1, &val1) != eSIR_SUCCESS) 
-            {
-                PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT INFO Field1 CFG\n"));)
-                break;
-            }
-        val8 = ( tANI_U8 ) val1;
-        pHTInfoField1 = ( tSirMacHTInfoField1* ) &val8;
-        pHTInfoField1->recommendedTxWidthSet = (tANI_U8)pHTCapabilityInfo->supportedChannelWidthSet;
-        pMac->lim.gHTRecommendedTxWidthSet = pHTInfoField1->recommendedTxWidthSet;
-        if(cfgSetInt(pMac, WNI_CFG_HT_INFO_FIELD1, *(tANI_U8*)pHTInfoField1) != eSIR_SUCCESS)
-            PELOGE(limLog(pMac, LOGE, FL("could not update HT Info Field\n"));)
-
-        break;
-
-
     case WNI_CFG_TRIG_STA_BK_SCAN:
         if(limUpdateTriggerStaBkScanFlag(pMac) != eSIR_SUCCESS)
         {
@@ -819,15 +684,14 @@
 
     limUpdateConfig(pMac,psessionEntry);
 
-    if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, &val)
-            != eSIR_SUCCESS)
+    if (phyMode == WNI_CFG_PHY_MODE_11A)
     {
-        limLog(pMac, LOGP, FL("cfg get WNI_CFG_SHORT_SLOT_TIME failed\n"));
-        return;
+        // 11a mode always uses short slot
+        // Check this since some APs in 11a mode broadcast long slot in their beacons. As per standard, always use what PHY mandates.
+        psessionEntry->shortSlotTimeSupported = true;
     }
-    if (phyMode == WNI_CFG_PHY_MODE_11G)
+    else if (phyMode == WNI_CFG_PHY_MODE_11G)
     {
-
         if ((psessionEntry->pePersona == VOS_STA_SAP_MODE) ||
            (psessionEntry->pePersona == VOS_P2P_GO_MODE))
         {
@@ -842,22 +706,12 @@
         else if (psessionEntry->limMlmState == eLIM_MLM_WT_REASSOC_RSP_STATE)
             // Reassociating with AP.
             val = SIR_MAC_GET_SHORT_SLOT_TIME( psessionEntry->limReassocBssCaps);
-
- 
-        if (cfgSetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, val) != eSIR_SUCCESS)
-        {
-            limLog(pMac, LOGP, FL("could not update short slot time at CFG\n"));
-            return;
-        }
+        psessionEntry->shortSlotTimeSupported = val;
     }
-    else
+    else // if (phyMode == WNI_CFG_PHY_MODE_11B) - use this if another phymode is added later ON
     {
-        // Reset short slot time at CFG
-        if (cfgSetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, 0) != eSIR_SUCCESS)
-        {
-            limLog(pMac, LOGP, FL("could not update short slot time at CFG\n"));
-            return;
-    }
+        // Will reach here in 11b case
+        psessionEntry->shortSlotTimeSupported = false;
     }
     //apply protection related config.
 
diff --git a/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c b/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c
index 1147e90..79cfe66 100644
--- a/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c
@@ -110,7 +110,7 @@
 
     PELOGE(limLog(pMac, LOGE,
         FL("received Deauth frame (mlm state = %s) with reason code %d from "),
-        limMlmStateStr(pMac->lim.gLimMlmState), reasonCode);
+        limMlmStateStr(psessionEntry->limMlmState), reasonCode);
     limPrintMacAddr(pMac, pHdr->sa, LOGE);)
       
     if ( (psessionEntry->limSystemRole == eLIM_AP_ROLE )||(psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE) )
@@ -259,7 +259,7 @@
                         mlmDeauthInd.reasonCode = reasonCode;
 
                         psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
-                        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+                        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
                         
                         limPostSmeMessage(pMac,
@@ -290,7 +290,7 @@
 
                         psessionEntry->limMlmState =
                                    psessionEntry->limPrevMlmState;
-                        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, psessionEntry->limMlmState));
+                        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
                         // Deactive Association response timeout
                         limDeactivateAndChangeTimer(
diff --git a/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c b/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c
index 1e138a9..ff1697a 100644
--- a/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c
@@ -206,7 +206,7 @@
             case eSIR_MAC_DISASSOC_LEAVING_BSS_REASON:
                 // Valid reasonCode in received Disassociation frame
                 // as long as we're not about to channel switch
-                if(pMac->lim.gLimChannelSwitch.state != eLIM_CHANNEL_SWITCH_IDLE)
+                if(psessionEntry->gLimChannelSwitch.state != eLIM_CHANNEL_SWITCH_IDLE)
                 {
                     limLog(pMac, LOGW,
                         FL("Ignoring disassoc frame due to upcoming "
diff --git a/CORE/MAC/src/pe/lim/limProcessLmmMessages.c b/CORE/MAC/src/pe/lim/limProcessLmmMessages.c
index 27c95ce..b95251e 100644
--- a/CORE/MAC/src/pe/lim/limProcessLmmMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessLmmMessages.c
@@ -674,7 +674,7 @@
         pMac->lim.gLimSmeState = eLIM_SME_LINK_EST_WT_SCAN_STATE;
     else
         return;
-    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
 
     /* The commented piece of code here is to handle the Measurement Request from WSM as Scan
      * request in the LIM in Linux Station. Currently, the station uses Measurement request to 
@@ -686,7 +686,7 @@
     {
         pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
         pMac->lim.gLimMlmState     = eLIM_MLM_LEARN_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
         pMac->lim.gLimSystemInScanLearnMode = eANI_BOOLEAN_TRUE;
     }
 #if 0
diff --git a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
index a0d3ca7..1639fdb 100644
--- a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
+++ b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
@@ -98,8 +98,7 @@
 
 
 /* this function should not changed */
-  if((pMac->lim.gLimSmeState == eLIM_SME_SUSPEND_STATE) &&
-      (limMsg->type != SIR_LIM_RESUME_ACTIVITY_NTF))
+  if(pMac->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE)
   {
       // Defer processsing this message
       if (limDeferMsg(pMac, limMsg) != TX_SUCCESS)
@@ -126,7 +125,6 @@
         (limMsg->type != WDA_SET_BSSKEY_RSP)&&
         (limMsg->type != WDA_SET_STAKEY_RSP)&&
         (limMsg->type != WDA_SET_STA_BCASTKEY_RSP) &&
-        (limMsg->type != SIR_LIM_RESUME_ACTIVITY_NTF)&&
         (limMsg->type != eWNI_SME_START_REQ) &&
         (limMsg->type != WDA_AGGR_QOS_RSP) &&
         (limMsg->type != WDA_REMOVE_BSSKEY_RSP) &&
@@ -145,6 +143,9 @@
 #ifdef WLAN_FEATURE_P2P 
         (limMsg->type != WDA_P2P_NOA_ATTR_IND) &&
 #endif
+#ifdef FEATURE_OEM_DATA_SUPPORT
+        (limMsg->type != WDA_START_OEM_DATA_RSP) &&
+#endif
         (limMsg->type != WDA_ADD_TS_RSP))
     {
         PELOG1(limLog(pMac, LOG1, FL("Defer the current message %s , gLimProcessDefdMsgs is false and system is not in scan/learn mode\n"),
@@ -301,11 +302,11 @@
 #endif
     if(retCode == TX_SUCCESS)
         {
-            MTRACE(macTraceMsgRx(pMac, 0, LIM_TRACE_MAKE_RXMSG(pMsg->type, LIM_MSG_DEFERRED));)
+            MTRACE(macTraceMsgRx(pMac, NO_SESSION, LIM_TRACE_MAKE_RXMSG(pMsg->type, LIM_MSG_DEFERRED));)
         }
     else
         {
-            MTRACE(macTraceMsgRx(pMac, 0, LIM_TRACE_MAKE_RXMSG(pMsg->type, LIM_MSG_DROPPED));)
+            MTRACE(macTraceMsgRx(pMac, NO_SESSION, LIM_TRACE_MAKE_RXMSG(pMsg->type, LIM_MSG_DROPPED));)
         }
 
 
@@ -658,7 +659,7 @@
         limSendSmeMgmtFrameInd( pMac, pHdr->fc.subType, (tANI_U8*)pHdr, 
                      WDA_GET_RX_PAYLOAD_LEN(pBd) + sizeof(tSirMacMgmtHdr), 
                      pLimMgmtRegistration->sessionId,
-                     WDA_GET_RX_CH(pBd) );
+                     WDA_GET_RX_CH(pBd), psessionEntry );
     
         if ( (type == SIR_MAC_MGMT_FRAME) && (fc.type == SIR_MAC_MGMT_FRAME)
               && (subType == SIR_MAC_MGMT_RESERVED15) )
@@ -1082,6 +1083,61 @@
     }
 }
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+void limOemDataRspHandleResumeLinkRsp(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* mlmOemDataRsp)
+{
+    if(status != eHAL_STATUS_SUCCESS)
+    {
+        limLog(pMac, LOGE, FL("OEM Data Rsp failed to get the response for resume link\n"));
+    }
+
+    if(NULL != pMac->lim.gpLimMlmOemDataReq)
+    {
+        palFreeMemory(pMac->hHdd, pMac->lim.gpLimMlmOemDataReq);
+        pMac->lim.gpLimMlmOemDataReq = NULL;
+    }
+
+    //"Failure" status doesn't mean that Oem Data Rsp did not happen
+    //and hence we need to respond to upper layers. Only Resume link is failed, but
+    //we got the oem data response already.
+    //Post the meessage to MLM
+    limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)(mlmOemDataRsp));
+
+    return;
+}
+
+void limProcessOemDataRsp(tpAniSirGlobal pMac, tANI_U32* body)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    tpLimMlmOemDataRsp mlmOemDataRsp = NULL;
+    tpStartOemDataRsp oemDataRsp = NULL;
+
+    //Process all the messages for the lim queue
+    SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
+
+    oemDataRsp = (tpStartOemDataRsp)(body);
+
+    status = palAllocateMemory(pMac->hHdd, (void**)(&mlmOemDataRsp), sizeof(tLimMlmOemDataRsp));
+    if(status != eHAL_STATUS_SUCCESS)
+    {
+        limLog(pMac, LOGP, FL("could not allocate memory for mlmOemDataRsp\n"));
+        return;
+    }
+
+    //copy the memory into tLimMlmOemDataRsp and free the tStartOemDataRsp
+    //the structures tStartOemDataRsp and tLimMlmOemDataRsp have the same structure
+    palCopyMemory(pMac->hHdd, (void*)(mlmOemDataRsp), (void*)(oemDataRsp), sizeof(tLimMlmOemDataRsp));
+
+    //Now free the incoming memory
+    palFreeMemory(pMac->hHdd, (void*)(oemDataRsp));
+
+    limResumeLink(pMac, limOemDataRspHandleResumeLinkRsp, (tANI_U32*)mlmOemDataRsp);
+
+    return;
+}
+
+#endif
 
 
 /**
@@ -1120,6 +1176,8 @@
 #endif
     if(pMac->gDriverType == eDRIVER_TYPE_MFG)
     {
+        palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
+        limMsg->bodyptr = NULL;
         return;
     }
 #ifdef WLAN_DEBUG    
@@ -1131,61 +1189,15 @@
       limMsgStr(limMsg->type), limSmeStateStr(pMac->lim.gLimSmeState),
       limMlmStateStr(pMac->lim.gLimMlmState));)
 
-    MTRACE(macTraceMsgRx(pMac, 0, LIM_TRACE_MAKE_RXMSG(limMsg->type, LIM_MSG_PROCESSED));)
+    MTRACE(macTraceMsgRx(pMac, NO_SESSION, LIM_TRACE_MAKE_RXMSG(limMsg->type, LIM_MSG_PROCESSED));)
 
     switch (limMsg->type)
     {
-#if defined(ANI_DVT_DEBUG)
-        case SIR_LIM_SUSPEND_ACTIVITY_REQ:
-            // This message is from HAL notifying LIM
-            // to suspend activity. (PTT needs)
-            // Disable TFP & RHP
-            //halSetStaTxEnable(pMac, 1, eHAL_CLEAR);
-            //halStopDataTraffic(pMac);
-            //halSetRxEnable(pMac, eHAL_CLEAR);
-
-            pMac->lim.gLimPrevSmeState = pMac->lim.gLimSmeState;
-            pMac->lim.gLimSmeState     = eLIM_SME_SUSPEND_STATE;
-         MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
-
-            // Post message back to HAL
-            msgQ.type = WDA_SUSPEND_ACTIVITY_RSP;
-            MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
-            wdaPostCtrlMsg(pMac, &msgQ);
-            break;
-#endif
 
         case SIR_LIM_UPDATE_BEACON:
             limUpdateBeacon(pMac);
             break;
 
-        case SIR_LIM_RESUME_ACTIVITY_NTF:
-            // This message is from HAL notifying LIM
-            // to resume activity.
-            if (pMac->lim.gLimSmeState == eLIM_SME_SUSPEND_STATE)
-            {
-                limLog(pMac, LOGE,
-                   FL("Received RESUME_NTF in State %s on Role %d\n"),
-                   limSmeStateStr(pMac->lim.gLimSmeState), pMac->lim.gLimSystemRole);
-                pMac->lim.gLimSmeState = pMac->lim.gLimPrevSmeState;
-             MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
-
-                 handleCBCFGChange( pMac, ANI_IGNORE_CFG_ID );
-                 handleHTCapabilityandHTInfo(pMac);
-                 //initialize the TSPEC admission control table.
-                 limAdmitControlInit(pMac);
-                 limRegisterHalIndCallBack(pMac);
-            }
-            else
-            {
-                limLog(pMac, LOGE,
-                   FL("Received RESUME_NTF in inval State %X on Role %d\n"),
-                   pMac->lim.gLimSmeState, pMac->lim.gLimSystemRole);
-                limPrintSmeState(pMac, LOGE, pMac->lim.gLimSmeState);
-            }
-
-            break;
-
         case SIR_CFG_PARAM_UPDATE_IND:
             /// CFG parameter updated
             if (limIsSystemInScanState(pMac))
@@ -1223,6 +1235,11 @@
         case WDA_FINISH_SCAN_RSP:
             limProcessFinishScanRsp(pMac, limMsg->bodyptr);
             break;
+#ifdef FEATURE_OEM_DATA_SUPPORT
+        case WDA_START_OEM_DATA_RSP:
+            limProcessOemDataRsp(pMac, limMsg->bodyptr);
+            break;
+#endif
 
         case WDA_SWITCH_CHANNEL_RSP:
             limProcessSwitchChannelRsp(pMac, limMsg->bodyptr);
@@ -1305,6 +1322,9 @@
         case eWNI_SME_STAT_SUMM_REQ:
         case eWNI_SME_GET_SCANNED_CHANNEL_REQ:
         case eWNI_SME_GET_STATISTICS_REQ:
+#ifdef FEATURE_OEM_DATA_SUPPORT
+        case eWNI_SME_OEM_DATA_REQ:
+#endif
             // These messages are from HDD
             limProcessNormalHddMsg(pMac, limMsg, true);  //need to response to hdd
             break;
@@ -1389,28 +1409,6 @@
 
         case eWNI_PMC_SMPS_STATE_IND :
         {
-#ifdef SUPPORT_eWNI_PMC_SMPS_STATE_IND
-            tSirMbMsg *pMBMsg;
-            tSirMacHTMIMOPowerSaveState mimoPSstate;
-            /** Is System processing any SMPS Indication*/
-            if (!limIsSystemInSetMimopsState(pMac))
-            {
-                pMBMsg = (tSirMbMsg *)limMsg->bodyptr;
-                palCopyMemory(pMac->hHdd, &mimoPSstate, pMBMsg->data, sizeof(tSirMacHTMIMOPowerSaveState));
-                limSMPowerSaveStateInd(pMac, mimoPSstate);
-            }
-            else
-            {
-                if (limDeferMsg(pMac, limMsg) != TX_SUCCESS)
-                {
-                    PELOGE(limLog(pMac, LOGE, FL("Unable to Defer message(0x%X) limSmeState %d (prev sme state %d) sysRole %d mlm state %d (prev mlm state %d)\n"),
-                        limMsg->type, pMac->lim.gLimSmeState,  pMac->lim.gLimPrevSmeState,
-                        pMac->lim.gLimSystemRole,  pMac->lim.gLimMlmState,  pMac->lim.gLimPrevMlmState);)
-                    limLogSessionStates(pMac);
-                    limPrintMsgName(pMac, LOGE, limMsg->type);
-                }
-            }
-#endif
             if(limMsg->bodyptr){
             palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
             limMsg->bodyptr = NULL;
@@ -1480,7 +1478,10 @@
          * function used in timeout case(i.e SIR_LIM_CHANNEL_SWITCH_TIMEOUT) 
          * for switching the channel*/
         case eWNI_SME_PRE_CHANNEL_SWITCH_FULL_POWER:
-            limProcessChannelSwitchTimeout(pMac);
+            if ( !tx_timer_running(&pMac->lim.limTimers.gLimChannelSwitchTimer) )
+            {  
+                limProcessChannelSwitchTimeout(pMac);
+            }
             palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
             limMsg->bodyptr = NULL;
             break;
@@ -2043,8 +2044,8 @@
     }
 
     /* limInsystemInscanState() refers the psessionEntry,  how to get session Entry????*/
-    if (((pMac->lim.gLimAddtsSent) || (limIsSystemInScanState(pMac)) ||
-                (LIM_IS_RADAR_DETECTED(pMac))) && fDeferMsg)
+    if (((pMac->lim.gLimAddtsSent) || (limIsSystemInScanState(pMac)) /*||
+                (LIM_IS_RADAR_DETECTED(pMac))*/) && fDeferMsg)
     {
         // System is in DFS (Learn) mode or awaiting addts response
         // or if radar is detected, Defer processsing this message
@@ -2085,7 +2086,7 @@
 }
 
 void
-handleHTCapabilityandHTInfo(struct sAniSirGlobal *pMac)
+handleHTCapabilityandHTInfo(struct sAniSirGlobal *pMac, tpPESession psessionEntry)
 {
     tSirMacHTCapabilityInfo macHTCapabilityInfo;
     tSirMacHTParametersInfo macHTParametersInfo;
@@ -2094,13 +2095,7 @@
     tSirMacHTInfoField3 macHTInfoField3;
     tANI_U32  cfgValue;
     tANI_U8 *ptr;
-    tpPESession psessionEntry = &pMac->lim.gpSession[0];//TBD-RAJESH HOW TO GET sessionEntry?????
 
-    pMac->lim.htCapability = IS_DOT11_MODE_HT(psessionEntry->dot11mode);  
-
-
-
-    // Get HT Capabilities
     if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &cfgValue) != eSIR_SUCCESS)
     {
         limLog(pMac, LOGP, FL("Fail to retrieve WNI_CFG_HT_CAP_INFO value\n"));
@@ -2114,7 +2109,6 @@
     pMac->lim.gHTMaxAmsduLength = (tANI_U8)macHTCapabilityInfo.maximalAMSDUsize;
     pMac->lim.gHTShortGI20Mhz = (tANI_U8)macHTCapabilityInfo.shortGI20MHz;
     pMac->lim.gHTShortGI40Mhz = (tANI_U8)macHTCapabilityInfo.shortGI40MHz;
-    pMac->lim.gHTSupportedChannelWidthSet = (tANI_U8)macHTCapabilityInfo.supportedChannelWidthSet;
     pMac->lim.gHTPSMPSupport = (tANI_U8)macHTCapabilityInfo.psmp;
     pMac->lim.gHTDsssCckRate40MHzSupport = (tANI_U8)macHTCapabilityInfo.dsssCckMode40MHz;
 
@@ -2139,8 +2133,6 @@
     pMac->lim.gHTServiceIntervalGranularity = (tANI_U8)macHTInfoField1.serviceIntervalGranularity;
     pMac->lim.gHTControlledAccessOnly = (tANI_U8)macHTInfoField1.controlledAccessOnly;
     pMac->lim.gHTRifsMode = (tANI_U8)macHTInfoField1.rifsMode;
-    pMac->lim.gHTRecommendedTxWidthSet = (tANI_U8)macHTInfoField1.recommendedTxWidthSet;
-    pMac->lim.gHTSecondaryChannelOffset = (tSirMacHTSecondaryChannelOffset)macHTInfoField1.secondaryChannelOffset;
 
     if (wlan_cfgGetInt(pMac, WNI_CFG_HT_INFO_FIELD2, &cfgValue) != eSIR_SUCCESS)
     {
@@ -2160,10 +2152,20 @@
     *((tANI_U16 *)ptr) = (tANI_U16) (cfgValue & 0xffff);
     pMac->lim.gHTPCOActive = (tANI_U8)macHTInfoField3.pcoActive;
     pMac->lim.gHTPCOPhase = (tANI_U8)macHTInfoField3.pcoPhase;
-    psessionEntry->beaconParams.fLsigTXOPProtectionFullSupport = (tANI_U8)macHTInfoField3.lsigTXOPProtectionFullSupport;
     pMac->lim.gHTSecondaryBeacon = (tANI_U8)macHTInfoField3.secondaryBeacon;
     pMac->lim.gHTDualCTSProtection = (tANI_U8)macHTInfoField3.dualCTSProtection;
     pMac->lim.gHTSTBCBasicMCS = (tANI_U8)macHTInfoField3.basicSTBCMCS;
+
+    /* The lim globals for channelwidth and secondary chnl have been removed and should not be used during no session;
+     * instead direct cfg is read and used when no session for transmission of mgmt frames (same as old);
+     * For now, we might come here during init and join with sessionEntry = NULL; in that case just fill the globals which exist
+     * Sessionized entries values will be filled in join or add bss req. The ones which are missed in join are filled below
+     */
+    if (psessionEntry != NULL)
+    {
+        psessionEntry->htCapability = IS_DOT11_MODE_HT(psessionEntry->dot11mode);  
+        psessionEntry->beaconParams.fLsigTXOPProtectionFullSupport = (tANI_U8)macHTInfoField3.lsigTXOPProtectionFullSupport;
+    }
 }
 
 void limLogSessionStates(tpAniSirGlobal pMac)
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
index 10c27f1..91e6898 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
@@ -61,6 +61,9 @@
 // MLM REQ processing function templates
 static void limProcessMlmStartReq(tpAniSirGlobal, tANI_U32 *);
 static void limProcessMlmScanReq(tpAniSirGlobal, tANI_U32 *);
+#ifdef FEATURE_OEM_DATA_SUPPORT
+static void limProcessMlmOemDataReq(tpAniSirGlobal, tANI_U32 *);
+#endif
 static void limProcessMlmJoinReq(tpAniSirGlobal, tANI_U32 *);
 static void limProcessMlmAuthReq(tpAniSirGlobal, tANI_U32 *);
 static void limProcessMlmAssocReq(tpAniSirGlobal, tANI_U32 *);
@@ -84,26 +87,7 @@
 
 static void limProcessMlmRemoveKeyReq(tpAniSirGlobal pMac, tANI_U32 * pMsgBuf);
 void 
-limSetChannel(tpAniSirGlobal pMac, tANI_U32 titanHtcap, tANI_U8 channel, tPowerdBm maxTxPower, tANI_U8 peSessionId);
-
-
-/*
- * determine the secondary channel state for hal
- */
-static ePhyChanBondState
-mlm_get_ext_chnl(
-    tpAniSirGlobal      pMac,
-    tAniCBSecondaryMode chnl)
-{
-    if (chnl == eANI_CB_SECONDARY_UP)
-        return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
-    if (chnl == eANI_CB_SECONDARY_DOWN)
-        return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
-    return PHY_SINGLE_CHANNEL_CENTERED;
-
-}
-
-
+limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId);
 #define IS_MLM_SCAN_REQ_BACKGROUND_SCAN_AGGRESSIVE(pMac)    (pMac->lim.gpLimMlmScanReq->backgroundScanMode == eSIR_AGGRESSIVE_BACKGROUND_SCAN)
 
 
@@ -141,6 +125,9 @@
     {
         case LIM_MLM_START_REQ:             limProcessMlmStartReq(pMac, Msg->bodyptr);   break;
         case LIM_MLM_SCAN_REQ:              limProcessMlmScanReq(pMac, Msg->bodyptr);    break;
+#ifdef FEATURE_OEM_DATA_SUPPORT
+        case LIM_MLM_OEM_DATA_REQ: limProcessMlmOemDataReq(pMac, Msg->bodyptr); break;
+#endif
         case LIM_MLM_JOIN_REQ:              limProcessMlmJoinReq(pMac, Msg->bodyptr);    break;
         case LIM_MLM_AUTH_REQ:              limProcessMlmAuthReq(pMac, Msg->bodyptr);    break;
         case LIM_MLM_ASSOC_REQ:             limProcessMlmAssocReq(pMac, Msg->bodyptr);   break;
@@ -352,7 +339,7 @@
     pMac->lim.gpchangeChannelData = cbdata;
 
     limSendSwitchChnlParams(pMac, newChannel,
-        eHT_SECONDARY_CHANNEL_OFFSET_NONE,
+        PHY_SINGLE_CHANNEL_CENTERED,
         psessionEntry->maxTxPower, psessionEntry->peSessionId);
 
     return;
@@ -451,7 +438,7 @@
             pMac->lim.limTimers.gLimMinChannelTimer.sessionId = sessionId;
 #endif            
             
-            MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_MIN_CHANNEL_TIMER));
+            MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_MIN_CHANNEL_TIMER));
 
             if (tx_timer_activate(&pMac->lim.limTimers.gLimMinChannelTimer) != TX_SUCCESS)
             {
@@ -499,7 +486,7 @@
         PELOG2(limLog(pMac, LOG2, FL("START PASSIVE Scan chan %d\n"), channelNum);)
 
         /// Passive Scanning. Activate maxChannelTimer
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_MAX_CHANNEL_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, NO_SESSION, eLIM_MAX_CHANNEL_TIMER));
         if (tx_timer_deactivate(&pMac->lim.limTimers.gLimMaxChannelTimer)
                                       != TX_SUCCESS)
         {
@@ -525,6 +512,8 @@
                 tANI_U32 val1 = 0;
 
                 val = SYS_MS_TO_TICKS(val);
+                //TODO: consider sessions.
+#if 0
 #ifdef ANI_PRODUCT_TYPE_CLIENT
                 // If a background was triggered via Quiet BSS,
                 // then we need to adjust the MIN and MAX channel
@@ -542,9 +531,10 @@
                     val1 = SYS_MS_TO_TICKS(pMac->lim.gpLimMlmScanReq->maxChannelTime);
                 }
 #endif
+#endif
                 //Pick the longer stay time
                 val = (val > val1) ? val : val1;
-                MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_MAX_CHANNEL_TIMER));
+                MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_MAX_CHANNEL_TIMER));
                 if (tx_timer_change(&pMac->lim.limTimers.gLimMaxChannelTimer,
                                 val, 0) != TX_SUCCESS)
                 {
@@ -716,53 +706,9 @@
         pInitScanParam->notifyHost = FALSE;
         pInitScanParam->scanMode = eHAL_SYS_MODE_LEARN;
 
-#if defined(ANI_AP_CLIENT_SDK) 
-        if (GET_LIM_SYSTEM_ROLE(pMac) == eLIM_STA_ROLE)
-        {
-            pInitScanParam->frameType = SIR_MAC_DATA_NULL;
-            // We need to inform the AP only when we are
-            // in the LINK_ESTABLISHED state
-            if( eLIM_SME_LINK_EST_WT_SCAN_STATE != pMac->lim.gLimSmeState )
-            {
-                pInitScanParam->notifyBss = FALSE;
-                // FIXME - Handle this one carefully
-                pInitScanParam->notifyHost = FALSE;
-            }
-            __limCreateInitScanRawFrame(pMac, pInitScanParam);
-            pInitScanParam->checkLinkTraffic = trafficCheck;
-        }
-        else
-#endif
-        {
-            pInitScanParam->frameType = SIR_MAC_CTRL_CTS;
-            __limCreateInitScanRawFrame(pMac, pInitScanParam);
-            pInitScanParam->checkLinkTraffic = trafficCheck;
-        }
-
-#if (defined(ANI_PRODUCT_TYPE_AP) ||defined(ANI_PRODUCT_TYPE_AP_SDK))
-        /* Currently using the AP's scanDuration values for Linux station also. This should
-         * be revisited if this needs to changed depending on AP or Station */
-        {
-            if (pMac->lim.gpLimMeasReq->measControl.longChannelScanPeriodicity &&
-                    (pMac->lim.gLimMeasParams.shortDurationCount ==
-                     pMac->lim.gpLimMeasReq->measControl.longChannelScanPeriodicity))
-            {
-#ifdef ANI_AP_SDK
-                pInitScanParam->scanDuration = (tANI_U16)pMac->lim.gLimScanDurationConvert.longChannelScanDuration_tick;
-#else
-                pInitScanParam->scanDuration = (tANI_U16)pMac->lim.gpLimMeasReq->measDuration.longChannelScanDuration;
-#endif /* ANI_AP_SDK */
-            }
-            else
-            {
-#ifdef ANI_AP_SDK
-                pInitScanParam->scanDuration = pMac->lim.gLimScanDurationConvert.shortChannelScanDuration_tick;
-#else
-                pInitScanParam->scanDuration = (tANI_U16)pMac->lim.gpLimMeasReq->measDuration.shortChannelScanDuration;
-#endif /* ANI_AP_SDK */
-            }
-        }
-#endif       //#if (defined(ANI_PRODUCT_TYPE_AP) ||defined(ANI_PRODUCT_TYPE_AP_SDK))
+        pInitScanParam->frameType = SIR_MAC_CTRL_CTS;
+        __limCreateInitScanRawFrame(pMac, pInitScanParam);
+        pInitScanParam->checkLinkTraffic = trafficCheck;
     }
     else
     {
@@ -789,7 +735,7 @@
 
     pMac->lim.gLimHalScanState = nextState;
     SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
-    MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
 
     rc = wdaPostCtrlMsg(pMac, &msg);
     if (rc == eSIR_SUCCESS) {
@@ -870,7 +816,7 @@
         pMac->lim.gLimHalScanState = nextState;
         SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
 
-        MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+        MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
         PELOGW(limLog(pMac, LOGW, FL("Channel %d\n"), channelNum);)
 
             rc = wdaPostCtrlMsg(pMac, &msg);
@@ -943,7 +889,7 @@
 
         pMac->lim.gLimHalScanState = nextState;
         SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
-        MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+        MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
 
         rc = wdaPostCtrlMsg(pMac, &msg);
         if (rc == eSIR_SUCCESS) {
@@ -1036,9 +982,9 @@
     msg.type = WDA_FINISH_SCAN_REQ;
     msg.bodyptr = pFinishScanParam;
     msg.bodyval = 0;
-    pFinishScanParam->currentOperChannel = peGetResumeChannel(pMac);
-    //TODO: Fix CB State. Get it from session. similar to getChannel. 
-    pFinishScanParam->cbState = limGetPhyCBState( pMac );
+    
+    peGetResumeChannel(pMac, &pFinishScanParam->currentOperChannel, &pFinishScanParam->cbState);
+
     palZeroMemory( pMac->hHdd, (tANI_U8 *)&pFinishScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr));
 
     if (nextState == eLIM_HAL_FINISH_LEARN_WAIT_STATE)
@@ -1048,6 +994,7 @@
         pFinishScanParam->notifyBss = FALSE;
         pFinishScanParam->notifyHost = FALSE;
         pFinishScanParam->frameType = 0;
+
         pFinishScanParam->frameLength = 0;
         pMac->lim.gLimHalScanState = nextState;
     }
@@ -1073,7 +1020,7 @@
     }
 
     SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
-    MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
 
     rc = wdaPostCtrlMsg(pMac, &msg);
     if (rc == eSIR_SUCCESS) {
@@ -1256,6 +1203,154 @@
     PELOG1(limLog(pMac, LOG1, FL("Scan ended, took %d tu\n"), (tx_time_get() - pMac->lim.scanStartTime));)
 } /*** limRestorePreScanState() ***/
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+void limSendHalOemDataReq(tpAniSirGlobal pMac)
+{
+    tSirMsgQ msg;
+    tpStartOemDataReq pStartOemDataReq = NULL;
+    tSirRetStatus rc = eSIR_SUCCESS;
+    tpLimMlmOemDataRsp pMlmOemDataRsp;
+    tANI_U32 reqLen = 0;
+    if(NULL == pMac->lim.gpLimMlmOemDataReq)
+    {
+        PELOGE(limLog(pMac, LOGE,  FL("Null pointer\n"));)
+        goto error;
+    }
+
+    reqLen = sizeof(tStartOemDataReq);
+
+    if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, (void**)&pStartOemDataReq, reqLen))
+    {
+        PELOGE(limLog(pMac, LOGE,  FL("OEM_DATA: Could not allocate memory for pStartOemDataReq\n"));)
+        goto error;
+    }
+
+    palZeroMemory(pMac->hHdd, (tANI_U8*)(pStartOemDataReq), reqLen);
+
+    //Now copy over the information to the OEM DATA REQ to HAL
+    palCopyMemory(pMac->hHdd, pStartOemDataReq->selfMacAddr, pMac->lim.gpLimMlmOemDataReq->selfMacAddr, sizeof(tSirMacAddr));
+
+    palCopyMemory(pMac->hHdd, pStartOemDataReq->oemDataReq, pMac->lim.gpLimMlmOemDataReq->oemDataReq, OEM_DATA_REQ_SIZE);
+
+    //Create the message to be passed to HAL
+    msg.type = WDA_START_OEM_DATA_REQ;
+    msg.bodyptr = pStartOemDataReq;
+    msg.bodyval = 0;
+
+    SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
+
+    rc = wdaPostCtrlMsg(pMac, &msg);
+    if(rc == eSIR_SUCCESS)
+    {
+        return;
+    }
+
+    SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
+    palFreeMemory(pMac->hHdd, (void*)pStartOemDataReq);
+    PELOGE(limLog(pMac, LOGE,  FL("OEM_DATA: posting WDA_START_OEM_DATA_REQ to HAL failed\n"));)
+
+error:
+    pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
+
+    if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, (void**)(&pMlmOemDataRsp), sizeof(tLimMlmOemDataRsp)))
+    {
+        limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure\n"));
+        return;
+    }
+
+    if(NULL != pMac->lim.gpLimMlmOemDataReq)
+    {
+        palFreeMemory(pMac->hHdd, pMac->lim.gpLimMlmOemDataReq);
+        pMac->lim.gpLimMlmOemDataReq = NULL;
+    }
+
+    limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
+
+    return;
+}
+/**
+ * limSetOemDataReqModeFailed()
+ *
+ * FUNCTION:
+ *  This function is used as callback to resume link after the suspend fails while
+ *  starting oem data req mode.
+ * LOGIC:
+ *  NA
+ *
+ * ASSUMPTIONS:
+ *  NA
+ *
+ * NOTE:
+ *
+ * @param pMac - Pointer to Global MAC structure
+ * @return None
+ */
+
+void limSetOemDataReqModeFailed(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
+{
+    tpLimMlmOemDataRsp pMlmOemDataRsp;
+
+    pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
+
+    if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, (void**)(&pMlmOemDataRsp), sizeof(tLimMlmOemDataRsp)))
+    {
+        limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure\n"));
+        return;
+    }
+
+    if(NULL != pMac->lim.gpLimMlmOemDataReq)
+    {
+        palFreeMemory(pMac->hHdd, pMac->lim.gpLimMlmOemDataReq);
+        pMac->lim.gpLimMlmOemDataReq = NULL;
+    }
+
+    palZeroMemory(pMac->hHdd, pMlmOemDataRsp, sizeof(tLimMlmOemDataRsp));
+
+    limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
+
+    return;
+}
+
+/**
+ * limSetOemDataReqMode()
+ *
+ *FUNCTION:
+ * This function is called to setup system into OEM DATA REQ mode
+ *
+ *LOGIC:
+ * NA
+ *
+ *ASSUMPTIONS:
+ * NA
+ *
+ *NOTE:
+ *
+ * @param  pMac - Pointer to Global MAC structure
+ * @return None
+ */
+
+void limSetOemDataReqMode(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
+{
+    if(status != eHAL_STATUS_SUCCESS)
+    {
+        limLog(pMac, LOGE, FL("OEM_DATA: failed in suspend link\n"));
+        goto error;
+    }
+    else
+    {
+        PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Calling limSendHalOemDataReq\n"));)
+        limSendHalOemDataReq(pMac);
+        return;
+    }
+
+error:
+    limResumeLink(pMac, limSetOemDataReqModeFailed, NULL);
+    return ;
+} /*** end limSendHalOemDataReq() ***/
+
+#endif //FEATURE_OEM_DATA_SUPPORT
 
 static void
 mlm_add_sta(
@@ -1323,8 +1418,17 @@
 
 #endif
     }
-
+#ifdef WLAN_FEATURE_11AC
+    if (psessionEntry->vhtCapability)
+    {
+        pSta->vhtCapable = VOS_TRUE;
+    }
+#endif
+#ifdef WLAN_FEATURE_11AC
+    limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry,NULL);
+#else
     limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry);
+#endif
     limFillSupportedRatesInfo(pMac, NULL, &pSta->supportedRates,psessionEntry);
     
     limLog( pMac, LOGE, FL( "GF: %d, ChnlWidth: %d, MimoPS: %d, lsigTXOP: %d, dsssCCK: %d, SGI20: %d, SGI40%d\n") ,
@@ -1361,10 +1465,6 @@
     tpAddBssParams pAddBssParams = NULL;
     tANI_U32 retCode;
 
-#ifdef WLAN_SOFTAP_FEATURE
-    tANI_U32 val = 0;
-#endif
-    
     // Package WDA_ADD_BSS_REQ message parameters
 
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
@@ -1401,16 +1501,9 @@
     }
 
 #ifdef WLAN_SOFTAP_FEATURE  
-    if( wlan_cfgGetInt ( pMac, WNI_CFG_SHORT_SLOT_TIME, &val ) != eSIR_SUCCESS)
-    {
-        limLog ( pMac, LOGP, FL(" Error : unable to fetch the WNI_CFG_SHORT_SLOT_TIME\n"));
-        palFreeMemory(pMac->hHdd,(void *)pAddBssParams);
-        return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
-    }
-    pAddBssParams->shortSlotTimeSupported = (tANI_U8)val;
+    pAddBssParams->shortSlotTimeSupported = psessionEntry->shortSlotTimeSupported;
 #endif
 
-
     pAddBssParams->beaconInterval               = pMlmStartReq->beaconPeriod;
     pAddBssParams->dtimPeriod                   = pMlmStartReq->dtimPeriod;
     pAddBssParams->cfParamSet.cfpCount          = pMlmStartReq->cfParamSet.cfpCount;
@@ -1425,12 +1518,16 @@
     pAddBssParams->nwType = pMlmStartReq->nwType;
 
     pAddBssParams->htCapable            = pMlmStartReq->htCapable;
+#ifdef WLAN_FEATURE_11AC
+    pAddBssParams->vhtCapable           = psessionEntry->vhtCapability;
+    pAddBssParams->vhtTxChannelWidthSet = psessionEntry->vhtTxChannelWidthSet; 
+#endif
     pAddBssParams->htOperMode           = pMlmStartReq->htOperMode;
     pAddBssParams->dualCTSProtection    = pMlmStartReq->dualCTSProtection;
     pAddBssParams->txChannelWidthSet    = pMlmStartReq->txChannelWidthSet;
 
     pAddBssParams->currentOperChannel   = pMlmStartReq->channelNumber;
-    pAddBssParams->currentExtChannel    = mlm_get_ext_chnl(pMac, pMlmStartReq->cbMode);
+    pAddBssParams->currentExtChannel    = pMlmStartReq->cbMode;
 
     /* Update PE sessionId*/
     pAddBssParams->sessionId            = pMlmStartReq->sessionId; 
@@ -1459,7 +1556,7 @@
 
     // Set a new state for MLME
     psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_STATE;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
     pAddBssParams->halPersona=psessionEntry->pePersona; //pass on the session persona to hal
 
@@ -1478,7 +1575,7 @@
     msgQ.reserved   = 0;
     msgQ.bodyptr    = pAddBssParams;
     msgQ.bodyval    = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
     limLog( pMac, LOGW, FL( "Sending WDA_ADD_BSS_REQ...\n" ));
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
@@ -1718,6 +1815,7 @@
     {
         PELOGE(limLog(pMac, LOGE,
                FL("Sending START_SCAN from LIM while one req is pending\n"));)
+        palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf);
         return;
     }
 
@@ -1737,7 +1835,7 @@
             pMac->lim.gLimMlmState = eLIM_MLM_WT_PROBE_RESP_STATE;
         else // eSIR_PASSIVE_SCAN
             pMac->lim.gLimMlmState = eLIM_MLM_PASSIVE_SCAN_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
 
         pMac->lim.gLimSystemInScanLearnMode = 1;
 
@@ -1775,6 +1873,57 @@
     }
 } /*** limProcessMlmScanReq() ***/
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+static void limProcessMlmOemDataReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
+{
+    tLimMlmOemDataRsp*     pMlmOemDataRsp;
+    
+    if (((pMac->lim.gLimMlmState == eLIM_MLM_IDLE_STATE) ||
+         (pMac->lim.gLimMlmState == eLIM_MLM_JOINED_STATE) ||
+         (pMac->lim.gLimMlmState == eLIM_MLM_AUTHENTICATED_STATE) ||
+         (pMac->lim.gLimMlmState == eLIM_MLM_BSS_STARTED_STATE) ||
+         (pMac->lim.gLimMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)))
+    {
+        //Hold onto the oem data request criteria
+        pMac->lim.gpLimMlmOemDataReq = (tLimMlmOemDataReq*)pMsgBuf;
+
+        pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
+
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
+
+        //Now request for link suspension
+        limSuspendLink(pMac, eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN, limSetOemDataReqMode, NULL);
+    }
+    else
+    {
+        /**
+         * Should not have received oem data req in other states
+         * Log error
+         */
+
+        PELOGW(limLog(pMac, LOGW, FL("OEM_DATA: unexpected LIM_MLM_OEM_DATA_REQ in invalid state %X\n"),pMac->lim.gLimMlmState);)
+
+        limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
+
+        /// Free up buffer allocated
+        palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf);
+
+        /// Return Meas confirm with INVALID_PARAMETERS
+        if(eHAL_STATUS_SUCCESS == palAllocateMemory(pMac->hHdd, (void**)&pMlmOemDataRsp, sizeof(tLimMlmOemDataRsp)))
+        {
+            limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
+            palFreeMemory(pMac->hHdd, pMlmOemDataRsp);
+        }
+        else
+        {
+            limLog(pMac, LOGP, FL("Could not allocate memory for pMlmOemDataRsp\n"));
+            return;
+        }
+    }
+
+    return;
+}
+#endif //FEATURE_OEM_DATA_SUPPORT
 
 
 /**
@@ -1803,7 +1952,7 @@
 static void
 limProcessMlmPostJoinSuspendLink(tpAniSirGlobal pMac, eHalStatus status, tANI_U32 *ctx)
 {
-    tANI_U8             chanNum;
+    tANI_U8             chanNum, secChanOffset;
     tLimMlmJoinCnf      mlmJoinCnf;
     tpPESession         psessionEntry = (tpPESession)ctx;
     tSirLinkState       linkState;
@@ -1815,7 +1964,7 @@
     }
     psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
     psessionEntry->limMlmState = eLIM_MLM_WT_JOIN_BEACON_STATE;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
     limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
 
@@ -1831,7 +1980,8 @@
     {
         limLog(pMac, LOGE, FL("limSetLinkState to eSIR_LINK_PREASSOC_STATE Failed!!\n"));
         mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
-        pMac->lim.gLimMlmState = eLIM_MLM_IDLE_STATE;
+        psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
         goto error;
     }
 
@@ -1839,11 +1989,11 @@
     // chanNum = pMac->lim.gpLimMlmJoinReq->bssDescription.channelId;
     
     chanNum = psessionEntry->currentOperChannel;
+    secChanOffset = psessionEntry->htSecondaryChannelOffset;
     //store the channel switch sessionEntry in the lim global var
     psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_JOIN;
 
-    limSetChannel(pMac, psessionEntry->pLimMlmJoinReq->bssDescription.titanHtCaps,
-                        chanNum, psessionEntry->maxTxPower, psessionEntry->peSessionId); 
+    limSetChannel(pMac, chanNum, secChanOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId); 
 
     return;
 error:
@@ -1949,7 +2099,7 @@
         limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
         
         limLog(pMac, LOGE, FL("Unexpected Join request for role %d state %X\n"),
-               psessionEntry->limSystemRole, pMac->lim.gLimMlmState);
+               psessionEntry->limSystemRole, psessionEntry->limMlmState);
     }
 
 error: 
@@ -2115,28 +2265,9 @@
             limDeletePreAuthNode(pMac,
                                  pMac->lim.gpLimMlmAuthReq->peerMacAddr);
 
-        //assign appropriate sessionId to the timer object
-        pMac->lim.limTimers.gLimAuthFailureTimer.sessionId = sessionId;
-        
-        // Activate Auth failure timer
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_AUTH_FAIL_TIMER));
-        if (tx_timer_activate(&pMac->lim.limTimers.gLimAuthFailureTimer)
-                                       != TX_SUCCESS)
-        {
-            /// Could not start Auth failure timer.
-            // Log error
-            limLog(pMac, LOGP,
-                   FL("could not start Auth failure timer\n"));
-
-            /// Return Auth confirm with Resources Unavailable
-            mlmAuthCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
-
-            goto end;
-        }
-
         psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
         psessionEntry->limMlmState = eLIM_MLM_WT_AUTH_FRAME2_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
         /// Prepare & send Authentication frame
         authFrameBody.authAlgoNumber =
@@ -2148,6 +2279,22 @@
                              pMac->lim.gpLimMlmAuthReq->peerMacAddr,
                              LIM_NO_WEP_IN_FC,psessionEntry);
 
+        //assign appropriate sessionId to the timer object
+        pMac->lim.limTimers.gLimAuthFailureTimer.sessionId = sessionId;
+ 
+        // Activate Auth failure timer
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_AUTH_FAIL_TIMER));
+        if (tx_timer_activate(&pMac->lim.limTimers.gLimAuthFailureTimer)
+                                       != TX_SUCCESS)
+        {
+            /// Could not start Auth failure timer.
+            // Log error
+            limLog(pMac, LOGP,
+                   FL("could not start Auth failure timer\n"));
+            // Cleanup as if auth timer expired
+            limProcessAuthFailureTimeout(pMac);
+        }
+
         return;
     }
     else
@@ -2215,6 +2362,7 @@
     if( (psessionEntry = peFindSessionBySessionId(pMac,pMlmAssocReq->sessionId) )== NULL) 
     {
         limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
+        palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmAssocReq);
         return;
     }
 
@@ -2232,31 +2380,13 @@
          (psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE || psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) &&
          (palEqualMemory(pMac->hHdd,pMlmAssocReq->peerMacAddr, currentBssId, sizeof(tSirMacAddr))) )
     {
+
         /// map the session entry pointer to the AssocFailureTimer 
         pMac->lim.limTimers.gLimAssocFailureTimer.sessionId = pMlmAssocReq->sessionId;
 
-
-        /// Start association failure timer
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_ASSOC_FAIL_TIMER));
-        if (tx_timer_activate(&pMac->lim.limTimers.gLimAssocFailureTimer)
-                                              != TX_SUCCESS)
-        {
-            /// Could not start Assoc failure timer.
-            // Log error
-            limLog(pMac, LOGP,
-                   FL("could not start Association failure timer\n"));
-
-            /// Return Assoc confirm with Resources Unavailable
-
-            mlmAssocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
-            mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
-
-            goto end;
-        }
-
         psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
         psessionEntry->limMlmState = eLIM_MLM_WT_ASSOC_RSP_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
  
         /// Prepare and send Association request frame
         limSendAssocReqMgmtFrame(pMac, pMlmAssocReq,psessionEntry);
@@ -2273,6 +2403,19 @@
            psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
             PELOGE(limLog(pMac, LOGE,  FL("Failed to set the LinkState\n"));)
     }
+        /// Start association failure timer
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_ASSOC_FAIL_TIMER));
+        if (tx_timer_activate(&pMac->lim.limTimers.gLimAssocFailureTimer)
+                                              != TX_SUCCESS)
+        {
+            /// Could not start Assoc failure timer.
+            // Log error
+            limLog(pMac, LOGP,
+                   FL("could not start Association failure timer\n"));
+            // Cleanup as if assoc timer expired
+            limProcessAssocFailureTimeout(pMac,LIM_ASSOC );
+           
+        }
 
         return;
     }
@@ -2332,7 +2475,7 @@
 static void
 limProcessMlmReassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
 {
-    tANI_U8                       chanNum;
+    tANI_U8                       chanNum, secChannelOffset;
     struct tLimPreAuthNode  *pAuthNode;
     tLimMlmReassocReq       *pMlmReassocReq;
     tLimMlmReassocCnf       mlmReassocCnf;
@@ -2349,6 +2492,7 @@
     if((psessionEntry = peFindSessionBySessionId(pMac,pMlmReassocReq->sessionId)) == NULL)
     {
         PELOGE(limLog(pMac, LOGE,FL("Session Does not exist for given sessionId\n"));)
+        palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmReassocReq);
         return;
     }
     
@@ -2385,7 +2529,7 @@
 
         psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
         psessionEntry->limMlmState    = eLIM_MLM_WT_REASSOC_RSP_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
 #if 0
         // Update BSSID at CFG database
@@ -2407,7 +2551,7 @@
          */
 
         chanNum = psessionEntry->limReassocChannelId;
-
+        secChannelOffset = psessionEntry->reAssocHtSecondaryChannelOffset;
 
         /* To Support BT-AMP .. read channel number from psessionEntry*/
         //chanNum = psessionEntry->currentOperChannel;
@@ -2420,8 +2564,8 @@
         //psessionEntry->pLimReAssocReq = (void *)pMlmReassocReq;
         psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_REASSOC;
 
-        /** Switch channell to the new Operating channel for Reassoc*/
-        limSetChannel(pMac, psessionEntry->limReassocTitanHtCaps, chanNum, psessionEntry->maxTxPower, psessionEntry->peSessionId);
+        /** Switch channel to the new Operating channel for Reassoc*/
+        limSetChannel(pMac, chanNum, secChannelOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
 
         return;
     }
@@ -2571,7 +2715,7 @@
     pStaDs->mlmStaContext.cleanupTrigger = pMlmDisassocReq->disassocTrigger;
 
     /// Send Disassociate frame to peer entity
-    if (sendDisassocFrame)
+    if (sendDisassocFrame && (pMlmDisassocReq->reasonCode != eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON))
     {
     limSendDisassocMgmtFrame(pMac,
                              pMlmDisassocReq->reasonCode,
@@ -2582,13 +2726,6 @@
        sendDisassocFrame = 1;    
     }
 
-    if (psessionEntry->limSystemRole == eLIM_AP_ROLE) 
-    {
-       //SAP mode delay DEL STA for 300ms such that disassoc can be delivered at TIM
-       //100 ms for normal TIM and 300 ms for dynamic TIM
-       vos_sleep(300); 
-    }
-
     /// Receive path cleanup with dummy packet
     if(eSIR_SUCCESS != limCleanupRxPath(pMac, pStaDs,psessionEntry))
         {
@@ -2678,7 +2815,8 @@
         return;
     }
 
-    if( isLimSessionOffChannel(pMac, pMlmDisassocReq->sessionId) )
+    if( (psessionEntry->limSystemRole == eLIM_STA_ROLE) &&
+        isLimSessionOffChannel(pMac, pMlmDisassocReq->sessionId) )
     {
       //suspend link
       limSuspendLink(pMac, eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN, 
@@ -2720,6 +2858,7 @@
     {
     
         PELOGE(limLog(pMac, LOGE, FL("session does not exist for given sessionId\n"));)
+        palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDeauthReq);
         return;
     }
     #if 0
@@ -2782,7 +2921,7 @@
                         /// Prepare and Send LIM_MLM_DEAUTH_CNF
                         mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
                         psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
-                        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+                        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
                         goto end;
                     }
                     else
@@ -2812,6 +2951,7 @@
             break;
 
         case eLIM_STA_IN_IBSS_ROLE:
+            palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDeauthReq);
 
             return;
 
@@ -2890,14 +3030,6 @@
     limSendDeauthMgmtFrame(pMac, pMlmDeauthReq->reasonCode,
                            pMlmDeauthReq->peerMacAddr,psessionEntry);
 
-    if( (psessionEntry->limSystemRole == eLIM_AP_ROLE))
-    {
-      // Delay DEL STA for 300ms such that unicast deauth is 
-      // delivered at TIM(100 for normal or 300ms for dynamic) 
-      // to power save stations after setting PVB
-      vos_sleep(300);
-    }
-
     /// Receive path cleanup with dummy packet
     limCleanupRxPath(pMac, pStaDs,psessionEntry);
 
@@ -2968,7 +3100,8 @@
         return;
     }
 
-    if( isLimSessionOffChannel(pMac, pMlmDeauthReq->sessionId) )
+    if( (psessionEntry->limSystemRole == eLIM_STA_ROLE) &&
+        isLimSessionOffChannel(pMac, pMlmDeauthReq->sessionId) )
     {
       //suspend link
       limSuspendLink(pMac, eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN, 
@@ -3125,15 +3258,23 @@
   }
 
     if ((pMlmSetKeysReq->numKeys == 0) && (pMlmSetKeysReq->edType != eSIR_ED_NONE)) {
-    //
-    // Broadcast/Multicast Keys (for WEP!!) are NOT sent
-    // via this interface!!
-    //
-    // This indicates to HAL that the WEP Keys need to be
-    // extracted from the CFG and applied to hardware
-    defaultKeyId = 0xff;
-      }else
-    defaultKeyId = 0;
+        //
+        // Broadcast/Multicast Keys (for WEP!!) are NOT sent
+        // via this interface!!
+        //
+        // This indicates to HAL that the WEP Keys need to be
+        // extracted from the CFG and applied to hardware
+        defaultKeyId = 0xff;
+    }else if(pMlmSetKeysReq->key[0].keyId && 
+             ((pMlmSetKeysReq->edType == eSIR_ED_WEP40) || 
+              (pMlmSetKeysReq->edType == eSIR_ED_WEP104))){
+        /* If the Key Id is non zero and encryption mode is WEP, 
+         * the key index is coming from the upper layers so that key only 
+         * need to be used as the default tx key, This is being used only 
+         * in case of WEP mode in HAL */
+        defaultKeyId = pMlmSetKeysReq->key[0].keyId;
+    }else
+        defaultKeyId = 0;
 
     limLog( pMac, LOG1,
       FL( "Trying to set keys for STA Index [%d], using defaultKeyId [%d]\n" ),
@@ -3143,7 +3284,7 @@
     if(limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
   psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
   psessionEntry->limMlmState = eLIM_MLM_WT_SET_BSS_KEY_STATE;
-  MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+  MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
         limLog( pMac, LOG1, FL("Trying to set Group Keys...%d \n"), 
             psessionEntry->peSessionId);
 
@@ -3204,6 +3345,7 @@
     {
         PELOGE(limLog(pMac, LOGE,
                     FL("session does not exist for given sessionId\n"));)
+        palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
         return;
     }
 
@@ -3256,7 +3398,7 @@
     if(limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr )) //Second condition for IBSS or AP role.
     {
         psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_BSS_KEY_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));    
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));    
         // Package WDA_REMOVE_BSSKEY_REQ message parameters
         limSendRemoveBssKeyReq( pMac,pMlmRemoveKeyReq,psessionEntry);
         return;
@@ -3294,7 +3436,7 @@
 
 
     psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_STA_KEY_STATE;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
     // Package WDA_REMOVE_STAKEY_REQ message parameters
     limSendRemoveStaKeyReq( pMac,pMlmRemoveKeyReq,staIdx,psessionEntry);
@@ -3302,6 +3444,7 @@
  
 end:
     limPostSmeRemoveKeyCnf( pMac,
+      psessionEntry,
       pMlmRemoveKeyReq,
       &mlmRemoveKeyCnf );
 
@@ -3605,7 +3748,7 @@
         mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
 
         psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
         if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE, psessionEntry->bssId, 
             psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
             PELOGE(limLog(pMac, LOGE,  FL("Failed to set the LinkState\n"));)
@@ -3863,13 +4006,8 @@
             PELOGE(limLog(pMac, LOGE,  FL("(Re)Assoc Failure Timeout occurred.\n"));)
 
             psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
-            MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, psessionEntry->limMlmState));
-            
-            //Set the RXP mode to IDLE, so it starts filtering the frames.
-            if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE,psessionEntry->bssId, 
-                psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
-                PELOGE(limLog(pMac, LOGE,  FL("Failed to set the LinkState\n"));)
-         
+            MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
+
             // 'Change' timer for future activations
             limDeactivateAndChangeTimer(pMac, eLIM_ASSOC_FAIL_TIMER);
 
@@ -3916,7 +4054,7 @@
              * Set BSSID to currently associated AP address.
              */
             psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
-            MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+            MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
             limRestorePreReassocState(pMac, 
                 eSIR_SME_REASSOC_TIMEOUT_RESULT_CODE, eSIR_MAC_UNSPEC_FAILURE_STATUS,psessionEntry);
@@ -3951,7 +4089,7 @@
 
     /// Restore previous MLM state
     pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
     limRestorePreScanState(pMac);
 
     // Free up pMac->lim.gLimMlmScanReq
@@ -3998,6 +4136,7 @@
   {
       PELOGE(limLog(pMac, LOGE,
                FL("session does not exist for given sessionId\n"));)
+      palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
       return;
   }
   
@@ -4048,7 +4187,7 @@
 
     // Restore MLME state
     psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
   }
 
@@ -4090,6 +4229,7 @@
     {
         PELOGE(limLog(pMac, LOGE,
                   FL("session does not exist for given session ID\n"));)
+        palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
         return;
     }
   
@@ -4151,6 +4291,7 @@
     if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDelBAReq->sessionId))== NULL)
     {
         PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId\n"));)
+        palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
         return;
     }
 
@@ -4319,49 +4460,93 @@
 return eSIR_SUCCESS;
 }
 
+#ifdef WLAN_FEATURE_11AC
+ePhyChanBondState limGet11ACPhyCBState(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 htSecondaryChannelOffset )
+{
+    ePhyChanBondState cbState = PHY_SINGLE_CHANNEL_CENTERED;
+
+    if(!pMac->lim.apChanWidth)
+    {
+        return htSecondaryChannelOffset;
+    }
+
+    if ( (htSecondaryChannelOffset 
+                 == PHY_DOUBLE_CHANNEL_LOW_PRIMARY)
+       )
+    {
+        if ((channel + 2 ) == pMac->lim.apCenterChan )
+            cbState =  PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
+        else if ((channel + 6 ) == pMac->lim.apCenterChan )
+            cbState =  PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
+        else if ((channel - 2 ) == pMac->lim.apCenterChan )
+            cbState =  PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
+        else 
+            limLog (pMac, LOGP, 
+                       FL("Invalid Channel Number = %d Center Chan = %d \n"), 
+                                 channel, pMac->lim.apCenterChan);
+    }
+    if ( (htSecondaryChannelOffset 
+                 == PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
+       )
+    {
+        if ((channel - 2 ) == pMac->lim.apCenterChan )
+            cbState =  PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
+        else if ((channel + 2 ) == pMac->lim.apCenterChan )
+            cbState =  PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
+        else if ((channel - 6 ) == pMac->lim.apCenterChan )
+            cbState =  PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
+        else 
+           limLog (pMac, LOGP, 
+                         FL("Invalid Channel Number = %d Center Chan = %d \n"),
+                                            channel, pMac->lim.apCenterChan);
+    }
+    return cbState;
+}
+
+#endif
+
 void 
-limSetChannel(tpAniSirGlobal pMac, tANI_U32 titanHtcap, tANI_U8 channel, tPowerdBm maxTxPower, tANI_U8 peSessionId)
+limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId)
 {
 #if !defined WLAN_FEATURE_VOWIFI
     tANI_U32 localPwrConstraint;
 #endif
+    tpPESession peSession;
 
-    // Setup the CB State appropriately, prior to
-    // issuing a dphChannelChange(). This is done
-    // so that if CB is enabled, the CB Secondary
-    // Channel is setup correctly
-    
-     /* if local CB admin state is off or join req CB admin state is off, don't bother with CB channel setup */
-    PELOG1(limLog(pMac, LOG1, FL("Before : gCbState = 0x%x, gCbmode = %x\n"), pMac->lim.gCbState, pMac->lim.gCbMode);)
-    if(GET_CB_ADMIN_STATE(pMac->lim.gCbState) &&
-                    SME_GET_CB_ADMIN_STATE(titanHtcap)) {
-        PELOG1(limLog(pMac, LOG1, FL("station doing channel bonding\n"));)
-        setupCBState( pMac, (tAniCBSecondaryMode)SME_GET_CB_OPER_STATE(titanHtcap));
-    }else {
-        PELOG1(limLog(pMac, LOG1, FL("station not doing channel bonding\n"));)
-        setupCBState(pMac, eANI_CB_SECONDARY_NONE);
+    peSession = peFindSessionBySessionId (pMac, peSessionId);
+
+    if ( NULL == peSession)
+    {
+       limLog (pMac, LOGP, FL("Invalid PE session = %d\n"), peSessionId);
+       return;
     }
-
-    PELOG1(limLog(pMac, LOG1, FL("After :gCbState = 0x%x, gCbmode = %x\n"), pMac->lim.gCbState, pMac->lim.gCbMode);)
-
-    #if 0
-    if (wlan_cfgSetInt(pMac, WNI_CFG_CURRENT_CHANNEL, channel) != eSIR_SUCCESS) {
-           limLog(pMac, LOGP, FL("could not set CURRENT_CHANNEL at CFG\n"));
-           return;
-    }
-    #endif // TO SUPPORT BT-AMP
-
 #if defined WLAN_FEATURE_VOWIFI  
-    limSendSwitchChnlParams( pMac, channel, limGetPhyCBState( pMac ), maxTxPower, peSessionId);
+#ifdef WLAN_FEATURE_11AC
+    if ( peSession->vhtCapability )
+    {
+        limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset ), maxTxPower, peSessionId);
+    }
+    else
+#endif
+    {
+        limSendSwitchChnlParams( pMac, channel, secChannelOffset, maxTxPower, peSessionId);
+    }
 #else
     if (wlan_cfgGetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, &localPwrConstraint) != eSIR_SUCCESS) {
            limLog(pMac, LOGP, FL("could not read WNI_CFG_LOCAL_POWER_CONSTRAINT from CFG\n"));
            return;
     }
     // Send WDA_CHNL_SWITCH_IND to HAL
-    limSendSwitchChnlParams( pMac, channel, limGetPhyCBState( pMac ), (tPowerdBm)localPwrConstraint, peSessionId);
+#ifdef WLAN_FEATURE_11AC
+    if ( peSession->vhtCapability && pMac->lim.vhtCapabilityPresentInBeacon)
+    {
+        limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset ), maxTxPower, peSessionId);
+    }
+    else
 #endif
-   
+    {
+        limSendSwitchChnlParams( pMac, channel, secChannelOffset, (tPowerdBm)localPwrConstraint, peSessionId);
+    }
+#endif
+
  }
-
-
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
index 8bd6a01..f3256a8 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
@@ -50,15 +50,21 @@
 #include "limSendMessages.h"
 #include "limIbssPeerMgmt.h"
 #include "limSession.h"
+#include "limSessionUtils.h"
 #if defined WLAN_FEATURE_VOWIFI
 #include "rrmApi.h"
 #endif
 #if defined WLAN_FEATURE_VOWIFI_11R
 #include <limFT.h>
 #endif
+#include "wlan_qct_wda.h"
 
 static void limHandleSmeJoinResult(tpAniSirGlobal, tSirResultCodes, tANI_U16,tpPESession);
+static void limHandleSmeReaasocResult(tpAniSirGlobal, tSirResultCodes, tANI_U16, tpPESession);
 void limProcessMlmScanCnf(tpAniSirGlobal, tANI_U32 *);
+#ifdef FEATURE_OEM_DATA_SUPPORT
+void limProcessMlmOemDataReqCnf(tpAniSirGlobal, tANI_U32 *);
+#endif
 void limProcessMlmJoinCnf(tpAniSirGlobal, tANI_U32 *);
 void limProcessMlmAuthCnf(tpAniSirGlobal, tANI_U32 *);
 void limProcessMlmStartCnf(tpAniSirGlobal, tANI_U32 *);
@@ -114,6 +120,11 @@
             limProcessMlmScanCnf(pMac, pMsgBuf);
             break;
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+        case LIM_MLM_OEM_DATA_CNF:
+            limProcessMlmOemDataReqCnf(pMac, pMsgBuf);
+            break;
+#endif
 
         case LIM_MLM_AUTH_CNF:
             limProcessMlmAuthCnf(pMac, pMsgBuf);
@@ -201,7 +212,7 @@
         //case eLIM_SME_LINK_EST_WT_SCAN_STATE:  //TO SUPPORT BT-AMP
         //case eLIM_SME_NORMAL_CHANNEL_SCAN_STATE:   //TO SUPPORT BT-AMP
             pMac->lim.gLimSmeState = pMac->lim.gLimPrevSmeState;
-            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
             pMac->lim.gLimSystemInScanLearnMode = 0;
             break;
         default:
@@ -270,6 +281,43 @@
     }
 } /*** end limProcessMlmScanCnf() ***/
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+/**
+ * limProcessMlmOemDataReqCnf()
+ *
+ *FUNCTION:
+ * This function is called to processes LIM_MLM_OEM_DATA_REQ_CNF
+ * message from MLM State machine.
+ *
+ *LOGIC:
+ *
+ *ASSUMPTIONS:
+ *
+ *NOTE:
+ *
+ * @param pMac       Pointer to Global MAC structure
+ * @param pMsgBuf    A pointer to the MLM message buffer
+ *
+ * @return None
+ */
+
+void limProcessMlmOemDataReqCnf(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
+{
+    tLimMlmOemDataRsp*    measRsp;
+
+    tSirResultCodes resultCode = eSIR_SME_SUCCESS;
+
+    measRsp = (tLimMlmOemDataRsp*)(pMsgBuf);
+
+    //Now send the meas confirm message to the sme
+    limSendSmeOemDataRsp(pMac, (tANI_U32*)measRsp, resultCode);
+
+    //Dont free the memory here. It will be freed up by the callee
+
+    return;
+}
+#endif
 
 /**
  * limProcessMlmStartCnf()
@@ -333,7 +381,7 @@
          * Beacon file register.
          */
         psessionEntry->limSmeState = eLIM_SME_NORMAL_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
         if(psessionEntry->bssType == eSIR_BTAMP_STA_MODE)
         {
              limLog(pMac, LOG1, FL("*** Started BSS in BT_AMP STA SIDE***\n"));
@@ -427,7 +475,7 @@
     {
         /// Join failure
         psessionEntry->limSmeState = eLIM_SME_JOIN_FAILURE_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, psessionEntry->limSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
         /// Send Join response to Host
         limHandleSmeJoinResult(pMac, resultCode, ((tLimMlmJoinCnf *) pMsgBuf)->protStatusCode, psessionEntry );
     }
@@ -562,12 +610,10 @@
             {
                 PELOGE(limLog(pMac, LOGE, FL("Auth Failure occurred.\n"));)
                 psessionEntry->limSmeState = eLIM_SME_JOIN_FAILURE_STATE;
-                MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+                MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
                 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
-                MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
-                if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE,psessionEntry->bssId,
-                    psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
-                   PELOGE(limLog(pMac, LOGE,  FL("Failed to set the LinkState.\n"));)
+                MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
+
 #if defined(ANI_AP_CLIENT_SDK)
                 if (psessionEntry->limSystemRole == eLIM_STA_ROLE)
                 {
@@ -594,7 +640,7 @@
                  * Send Pre-auth failure response to host
                  */
                 psessionEntry->limSmeState = psessionEntry->limPrevSmeState;
-                MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+                MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
                 limSendSmeAuthRsp(
                             pMac,
                             ((tLimMlmAuthCnf *) pMsgBuf)->resultCode,
@@ -661,9 +707,10 @@
 
             pMlmAssocReq->capabilityInfo = caps;
            PELOG3(limLog(pMac, LOG3,
-               FL("Capabilities to be used in AssocReq=0x%X, privacy bit=%x\n"),
+               FL("Capabilities to be used in AssocReq=0x%X, privacy bit=%x shortSlotTime %x\n"),
                caps,
-               ((tpSirMacCapabilityInfo) &pMlmAssocReq->capabilityInfo)->privacy);)
+               ((tpSirMacCapabilityInfo) &pMlmAssocReq->capabilityInfo)->privacy,
+               ((tpSirMacCapabilityInfo) &pMlmAssocReq->capabilityInfo)->shortSlotTime);)
 
            /* If telescopic beaconing is enabled, set listen interval to
               WNI_CFG_TELE_BCN_MAX_LI */
@@ -702,7 +749,7 @@
             pMlmAssocReq->sessionId = psessionEntry->peSessionId;
             psessionEntry->limPrevSmeState = psessionEntry->limSmeState;
             psessionEntry->limSmeState     = eLIM_SME_WT_ASSOC_STATE;
-            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
             limPostMlmMessage(pMac,
                               LIM_MLM_ASSOC_REQ,
                               (tANI_U32 *) pMlmAssocReq);
@@ -714,7 +761,7 @@
              * Send Pre-auth response to host
              */
             psessionEntry->limSmeState = psessionEntry->limPrevSmeState;
-            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
             limSendSmeAuthRsp(
                         pMac,
                         ((tLimMlmAuthCnf *) pMsgBuf)->resultCode,
@@ -778,7 +825,7 @@
         // Association failure
         PELOG1(limLog(pMac, LOG1, FL("*** Association failure ***\n"));)
         psessionEntry->limSmeState = eLIM_SME_JOIN_FAILURE_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, pMac->lim.gLimSmeState));
 #if defined(ANI_AP_CLIENT_SDK)
         if (psessionEntry->limSystemRole == eLIM_STA_ROLE)
         {
@@ -803,7 +850,7 @@
         // Successful Association
         PELOG1(limLog(pMac, LOG1, FL("*** Associated with BSS ***\n"));)
         psessionEntry->limSmeState = eLIM_SME_LINK_EST_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
         /**
          * Need to send Join response with
          * Association success to Host.
@@ -873,7 +920,7 @@
         PELOG1(limLog(pMac, LOG1, FL("*** Reassociated with new BSS ***\n"));)
 
         psessionEntry->limSmeState = eLIM_SME_LINK_EST_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
 
         /**
         * Need to send Reassoc response with
@@ -888,7 +935,7 @@
         *   but we still have the link with the Older AP
         */
         psessionEntry->limSmeState = eLIM_SME_LINK_EST_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
 
         /**
         * Need to send Reassoc response with
@@ -900,15 +947,12 @@
     }else {
         // Reassociation failure
         psessionEntry->limSmeState = eLIM_SME_JOIN_FAILURE_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
         /**
          * Need to send Reassoc response with
          * Association failure to Host.
          */
-        limSendSmeJoinReassocRsp(
-                           pMac, eWNI_SME_REASSOC_RSP,
-                           pLimMlmReassocCnf->resultCode, pLimMlmReassocCnf->protStatusCode,psessionEntry,
-                           psessionEntry->smeSessionId,psessionEntry->transactionId);
+        limHandleSmeReaasocResult(pMac, pLimMlmReassocCnf->resultCode, pLimMlmReassocCnf->protStatusCode, psessionEntry);
     }
 } /*** end limProcessMlmReassocCnf() ***/
 
@@ -982,7 +1026,7 @@
     msgQ.type = eWNI_SME_REASSOC_IND;
     msgQ.bodyptr = pSirSmeReassocInd;
     msgQ.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
     limDiagEventReport(pMac, WLAN_PE_DIAG_REASSOC_IND_EVENT, psessionEntry, 0, 0);
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -1046,7 +1090,7 @@
     msgQ.type = eWNI_SME_AUTH_IND;
     msgQ.bodyptr = pSirSmeAuthInd;
     msgQ.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
     limDiagEventReport(pMac, WLAN_PE_DIAG_AUTH_IND_EVENT, NULL, 0, 0);
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -1095,7 +1139,6 @@
                                 pAssocInd->addIE.length);
 
     // Copy the new TITAN capabilities
-    pSirSmeAssocInd->titanHtCaps = pAssocInd->titanHtCaps;
     pSirSmeAssocInd->spectrumMgtIndicator = pAssocInd->spectrumMgtIndicator;
     if (pAssocInd->spectrumMgtIndicator == eSIR_TRUE)
     {
@@ -1195,7 +1238,7 @@
 #ifdef WLAN_SOFTAP_FEATURE
    pSirSmeAssocInd->reassocReq = pStaDs->mlmStaContext.subType;
 #endif
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
     limDiagEventReport(pMac, WLAN_PE_DIAG_ASSOC_IND_EVENT, psessionEntry, 0, 0);
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -1271,7 +1314,7 @@
         case eLIM_STA_ROLE:
         case eLIM_BT_AMP_STA_ROLE:
         psessionEntry->limSmeState = eLIM_SME_WT_DISASSOC_STATE;
-            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
             break;
         default: // eLIM_AP_ROLE //eLIM_BT_AMP_AP_ROLE
                 PELOG1(limLog(pMac, LOG1,
@@ -1357,7 +1400,7 @@
                 psessionEntry->limSmeState = psessionEntry->limPrevSmeState;
             else
                 psessionEntry->limSmeState = eLIM_SME_OFFLINE_STATE;
-            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
             // Send Promiscuous mode response to host
             limSendSmePromiscuousModeRsp(pMac);
         }
@@ -1367,7 +1410,7 @@
                 psessionEntry->limSmeState = psessionEntry->limPrevSmeState;
             else
                 psessionEntry->limSmeState = eLIM_SME_IDLE_STATE;
-            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
             limSendSmeDisassocNtf(pMac, pMlmDisassocCnf->peerMacAddr,
                                   resultCode,
                                   pMlmDisassocCnf->disassocTrigger,
@@ -1420,7 +1463,7 @@
         case eLIM_STA_ROLE:
         case eLIM_BT_AMP_STA_ROLE:
             psessionEntry->limSmeState = eLIM_SME_WT_DEAUTH_STATE;
-            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, psessionEntry->limSmeState));
+            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
 
         default: // eLIM_AP_ROLE
             {
@@ -1516,7 +1559,7 @@
         }
         else
             psessionEntry->limSmeState = psessionEntry->limPrevSmeState;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
 
         if (pMac->lim.gLimRspReqd)
             pMac->lim.gLimRspReqd = false;
@@ -1606,7 +1649,7 @@
             if ((psessionEntry->limSystemRole == eLIM_STA_ROLE)||(psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE))
             {
                 psessionEntry->limSmeState = eLIM_SME_IDLE_STATE;
-                MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+                MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
 
 #if defined(ANI_AP_CLIENT_SDK)
                 // Whenever there is a disassoc notification, make sure the bssId is cleared so that
@@ -1669,13 +1712,13 @@
 limProcessMlmSetKeysCnf(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
 {
     // Prepare and send SME_SETCONTEXT_RSP message
-    tLimMlmSetKeysCnf  *pMlmSetKeysCnf;
+    tLimMlmSetKeysCnf   *pMlmSetKeysCnf;
     tpPESession        psessionEntry;
 
     if(pMsgBuf == NULL)
     {
-           PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
-           return;
+        PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
+        return;
     }
     pMlmSetKeysCnf = (tLimMlmSetKeysCnf *) pMsgBuf;
     if ((psessionEntry = peFindSessionBySessionId(pMac, pMlmSetKeysCnf->sessionId))== NULL)
@@ -1718,13 +1761,13 @@
 limProcessMlmRemoveKeyCnf(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
 {
     // Prepare and send SME_REMOVECONTEXT_RSP message
-    tLimMlmRemoveKeyCnf  *pMlmRemoveKeyCnf;
+    tLimMlmRemoveKeyCnf *pMlmRemoveKeyCnf;
     tpPESession          psessionEntry;
 
     if(pMsgBuf == NULL)
     {
-           PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
-           return;
+        PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
+        return;
     }
     pMlmRemoveKeyCnf = (tLimMlmRemoveKeyCnf *) pMsgBuf;
     if((psessionEntry = peFindSessionBySessionId(pMac,pMlmRemoveKeyCnf->sessionId))== NULL)
@@ -1736,7 +1779,7 @@
         FL("Received MLM_REMOVEKEYS_CNF with resultCode = %d\n"),
         pMlmRemoveKeyCnf->resultCode );
     limSendSmeRemoveKeyRsp(pMac,
-                            pMlmRemoveKeyCnf->peerMacAddr,
+                           pMlmRemoveKeyCnf->peerMacAddr,
                             (tSirResultCodes) pMlmRemoveKeyCnf->resultCode,psessionEntry,
                             psessionEntry->smeSessionId,psessionEntry->transactionId);
 } /*** end limProcessMlmRemoveKeyCnf() ***/
@@ -1790,6 +1833,8 @@
             pStaDs->mlmStaContext.protStatusCode = protStatusCode;
             //Done: 7-27-2009. JIM_FIX_ME: at the end of limCleanupRxPath, make sure PE is sending eWNI_SME_JOIN_RSP to SME
             limCleanupRxPath(pMac, pStaDs, psessionEntry);
+            palFreeMemory( pMac->hHdd, psessionEntry->pLimJoinReq);
+            psessionEntry->pLimJoinReq = NULL;
             return;
         }
     }
@@ -1801,6 +1846,9 @@
     {
         if(NULL != psessionEntry)
         {
+           if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE,psessionEntry->bssId,
+                psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
+               PELOGE(limLog(pMac, LOGE,  FL("Failed to set the LinkState.\n"));)
             peDeleteSession(pMac,psessionEntry);
             psessionEntry = NULL;
         }
@@ -1810,6 +1858,68 @@
 } /*** end limHandleSmeJoinResult() ***/
 
 /**
+ * limHandleSmeReaasocResult()
+ *
+ *FUNCTION:
+ * This function is called to process reassoc failures
+ * upon receiving REASSOC_CNF with a failure code or
+ * MLM_REASSOC_CNF with a success code in case of STA role 
+ *
+ *LOGIC:
+ *
+ *ASSUMPTIONS:
+ *
+ *NOTE:
+ *
+ * @param  pMac         Pointer to Global MAC structure
+ * @param  resultCode   Failure code to be sent
+ *
+ *
+ * @return None
+ */
+static void
+limHandleSmeReaasocResult(tpAniSirGlobal pMac, tSirResultCodes resultCode, tANI_U16 protStatusCode, tpPESession psessionEntry)
+{
+    tpDphHashNode pStaDs = NULL;
+    tANI_U8         smesessionId;
+    tANI_U16        smetransactionId;
+
+    if(psessionEntry == NULL)
+    {
+        PELOGE(limLog(pMac, LOGE,FL("psessionEntry is NULL \n"));)
+        return;
+    }
+    smesessionId = psessionEntry->smeSessionId;
+    smetransactionId = psessionEntry->transactionId;
+    /* When associations is failed , delete the session created  and pass NULL  to  limsendsmeJoinReassocRsp() */
+    if(resultCode != eSIR_SME_SUCCESS)
+    {
+          pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
+          if (pStaDs != NULL)
+          {
+            pStaDs->mlmStaContext.disassocReason = eSIR_MAC_UNSPEC_FAILURE_REASON;
+            pStaDs->mlmStaContext.cleanupTrigger = eLIM_JOIN_FAILURE;
+            pStaDs->mlmStaContext.resultCode = resultCode;
+            pStaDs->mlmStaContext.protStatusCode = protStatusCode;
+            limCleanupRxPath(pMac, pStaDs, psessionEntry);
+            return;
+        }
+    }
+
+    //Delete teh session if REASSOC failure occurred.
+    if(resultCode != eSIR_SME_SUCCESS)
+    {
+        if(NULL != psessionEntry)
+        {
+            peDeleteSession(pMac,psessionEntry);
+            psessionEntry = NULL;
+        }
+    }
+    limSendSmeJoinReassocRsp(pMac, eWNI_SME_REASSOC_RSP, resultCode, protStatusCode,psessionEntry,
+                                                smesessionId,  smetransactionId);
+} /*** end limHandleSmeReassocResult() ***/
+
+/**
   * limProcessMlmAddStaRsp()
  *
  *FUNCTION:
@@ -1833,13 +1943,6 @@
     //in the case of nested request the new request initiated from the response will take care of resetting
     //the deffered flag.
     SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
-#ifdef ANI_PRODUCT_TYPE_AP
-    if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
-    {
-        limProcessApMlmAddStaRsp(pMac, limMsgQ);
-        return;
-    }
-#endif
     if ((psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE)
 #ifdef WLAN_SOFTAP_FEATURE
     || (psessionEntry->limSystemRole == eLIM_AP_ROLE)
@@ -1890,7 +1993,7 @@
             FL( "Unable to get the DPH Hash Entry for AID - %d\n" ),
             DPH_STA_HASH_INDEX_PEER);
         psessionEntry->limMlmState = eLIM_MLM_LINK_ESTABLISHED_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
         /*
         * Storing the self StaIndex(Generated by HAL) in session context,
         * instead of storing it in DPH Hash entry for Self STA.
@@ -1900,7 +2003,7 @@
         psessionEntry->staId = pAddStaParams->staIdx;
         //if the AssocRsp frame is not acknowledged, then keep alive timer will take care of the state
         limReactivateHeartBeatTimer(pMac, psessionEntry);
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_KEEPALIVE_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_KEEPALIVE_TIMER));
 
         //assign the sessionId to the timer Object
         pMac->lim.limTimers.gLimKeepaliveTimer.sessionId = psessionEntry->peSessionId;
@@ -1943,13 +2046,6 @@
    //     return;
   //  }
   SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
- #ifdef ANI_PRODUCT_TYPE_AP
-    if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
-    {
-        limProcessApMlmDelBssRsp(pMac, limMsgQ);
-        return;
-    }
-#endif
 
     if (((psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE)  ||
          (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)
@@ -2003,6 +2099,10 @@
     else
     {
         limLog( pMac, LOGP, FL( "DEL BSS failed!\n" ) );
+        if( NULL != pDelBssParams )
+        {
+            palFreeMemory( pMac->hHdd, (void *) pDelBssParams );
+    	}
         return;
     }
    end:
@@ -2028,58 +2128,6 @@
     return;
 }
 
-
-#ifdef ANI_PRODUCT_TYPE_AP
-void limProcessApMlmDelBssRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ)
-{
-    tSirResultCodes rc = eSIR_SME_SUCCESS;
-    tpDeleteBssParams pDelBss = (tpDeleteBssParams) limMsgQ->bodyptr;
-    if (pDelBss == NULL)
-    {
-        PELOGE(limLog(pMac, LOGE, FL("BSS: DEL_BSS_RSP with no body!\n"));)
-        rc = eSIR_SME_REFUSED;
-        goto end;
-    }
-    if( eLIM_MLM_WT_DEL_BSS_RSP_STATE != pMac->lim.gLimMlmState)
-    {
-            limLog( pMac, LOGE,
-                        FL( "Received unexpected WDA_DEL_BSS_RSP in state %X\n" ), pMac->lim.gLimMlmState);
-            rc = eSIR_SME_REFUSED;
-           goto end;
-    }
-    if (pDelBss->status != eHAL_STATUS_SUCCESS)
-    {
-        limLog(pMac, LOGP, FL("BSS: DEL_BSS_RSP error (%x) Bss %d "),
-               pDelBss->status, pDelBss->bssIdx);
-        rc = eSIR_SME_STOP_BSS_FAILURE;
-        goto end;
-    }
-    //Not used for station or softap.
-    rc = limSetLinkState(pMac, eSIR_LINK_IDLE_STATE);
-    if( rc != eSIR_SUCCESS )
-        goto end;
-    /** Softmac may send all the buffered packets right after resuming the transmission hence
-     * to occupy the medium during non channel occupancy period. So resume the transmission after
-     * HAL gives back the response.
-     */
-    if (LIM_IS_RADAR_DETECTED(pMac))
-    {
-         limFrameTransmissionControl(pMac, eLIM_TX_BSS_BUT_BEACON, eLIM_RESUME_TX);
-         LIM_SET_RADAR_DETECTED(pMac, eANI_BOOLEAN_FALSE);
-    }
-    dphHashTableClassInit(pMac);
-    limDeletePreAuthList(pMac);
-    //Is it ok to put LIM into IDLE state.
-    pMac->lim.gLimMlmState->limMlmState = eLIM_MLM_IDLE_STATE;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
-
-    end:
-    limSendSmeRsp(pMac, eWNI_SME_STOP_BSS_RSP, rc);
-    if(pDelBss != NULL)
-        palFreeMemory( pMac->hHdd, (void *) pDelBss );
-}
-#endif
-/* This code is same as limProcessApMlmDelBssRsp used for BT-AMP  */
 void limProcessBtAmpApMlmDelBssRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,tpPESession psessionEntry)
 {
     tSirResultCodes rc = eSIR_SME_SUCCESS;
@@ -2090,6 +2138,8 @@
     if(psessionEntry == NULL)
     {
         limLog(pMac, LOGE,FL("Session entry passed is NULL\n"));
+        if(pDelBss != NULL)
+            palFreeMemory( pMac->hHdd, (void *) pDelBss );
         return;
     }
 
@@ -2102,11 +2152,11 @@
     pMac->lim.gLimMlmState = eLIM_MLM_IDLE_STATE;
     if( eLIM_MLM_WT_DEL_BSS_RSP_STATE != psessionEntry->limMlmState)
     {
-        limLog(pMac, LOGE,
+            limLog( pMac, LOGE,
                FL( "Received unexpected WDA_DEL_BSS_RSP in state %X" ),
                psessionEntry->limMlmState);
-        rc = eSIR_SME_REFUSED;
-        goto end;
+            rc = eSIR_SME_REFUSED;
+           goto end;
     }
     if (pDelBss->status != eHAL_STATUS_SUCCESS)
     {
@@ -2126,11 +2176,13 @@
      * to occupy the medium during non channel occupancy period. So resume the transmission after
      * HAL gives back the response.
      */
+#if 0 //TODO: How to handle this per session
     if (LIM_IS_RADAR_DETECTED(pMac))
     {
          limFrameTransmissionControl(pMac, eLIM_TX_BSS_BUT_BEACON, eLIM_RESUME_TX);
          LIM_SET_RADAR_DETECTED(pMac, eANI_BOOLEAN_FALSE);
     }
+#endif
     dphHashTableClassInit(pMac, &psessionEntry->dph.dphHashTable);//TBD-RAJESH is it needed ?
     limDeletePreAuthList(pMac);
 #ifdef WLAN_SOFTAP_FEATURE
@@ -2158,16 +2210,11 @@
     if((psessionEntry = peFindSessionBySessionId(pMac,pDeleteStaParams->sessionId))==NULL)
     {
         limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
+        if(pDeleteStaParams != NULL)
+            palFreeMemory( pMac->hHdd, (void *) pDeleteStaParams );
         return;
     }
 
-#ifdef ANI_PRODUCT_TYPE_AP
-    if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
-    {
-        limProcessApMlmDelStaRsp(pMac, limMsgQ);
-        return;
-    }
-#endif
     if ((psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE)
 #ifdef WLAN_SOFTAP_FEATURE
       || (psessionEntry->limSystemRole == eLIM_AP_ROLE)
@@ -2182,89 +2229,6 @@
 #endif
 }
 
-#ifdef ANI_PRODUCT_TYPE_AP
-void limProcessApMlmDelStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ )
-{
-    tpDeleteStaParams pDelStaParams = (tpDeleteStaParams) limMsgQ->bodyptr;
-    tpDphHashNode pStaDs = dphGetHashEntry(pMac, pDelStaParams->assocId);
-    tSirResultCodes statusCode = eSIR_SME_SUCCESS;
-    if( eHAL_STATUS_SUCCESS == pDelStaParams->status )
-    {
-           limLog( pMac, LOGW,
-                      FL( "AP received the DEL_STA_RSP for assocID: %X.\n"), pDelStaParams->assocId);
-        if(pStaDs == NULL)
-        {
-             limLog( pMac, LOGE,
-                  FL( "DPH Entry for STA %X missing.\n"), pDelStaParams->assocId);
-             statusCode = eSIR_SME_REFUSED;
-             goto end;
-        }
-         if(( eLIM_MLM_WT_DEL_STA_RSP_STATE != pStaDs->mlmStaContext.mlmState) &&
-            ( eLIM_MLM_WT_ASSOC_DEL_STA_RSP_STATE != pStaDs->mlmStaContext.mlmState))
-        {
-            limLog( pMac, LOGE,
-              FL( "Received unexpected WDA_DEL_STA_RSP in state %s for staId %d assocId %d \n" ),
-               limMlmStateStr(pStaDs->mlmStaContext.mlmState), pStaDs->staIndex, pStaDs->assocId);
-            statusCode = eSIR_SME_REFUSED;
-           goto end;
-        }
-
-        PELOG1(limLog( pMac, LOG1,
-            FL("Deleted STA AssocID %d staId %d MAC "),
-            pStaDs->assocId, pStaDs->staIndex);
-        limPrintMacAddr(pMac, pStaDs->staAddr, LOG1);)
-       if(eLIM_MLM_WT_ASSOC_DEL_STA_RSP_STATE == pStaDs->mlmStaContext.mlmState)
-       {
-            if( 0 != limMsgQ->bodyptr )
-            {
-              palFreeMemory( pMac->hHdd, (void *) pDelStaParams );
-            }
-            if (limAddSta(pMac, pStaDs,psessionEntry) != eSIR_SUCCESS)
-            {
-                PELOGE(limLog(pMac, LOGE,
-                       FL("could not Add STA with assocId=%d\n"),
-                       pStaDs->assocId);)
-              // delete the TS if it has already been added.
-               // send the response with error status.
-                if(pStaDs->qos.addtsPresent)
-                {
-                  tpLimTspecInfo pTspecInfo;
-                  if(eSIR_SUCCESS == limTspecFindByAssocId(pMac, pStaDs->assocId,
-                            &pStaDs->qos.addts.tspec, &pMac->lim.tspecInfo[0], &pTspecInfo))
-                  {
-                    limAdmitControlDeleteTS(pMac, pStaDs->assocId, &pStaDs->qos.addts.tspec.tsinfo,
-                                                            NULL, &pTspecInfo->idx);
-                  }
-                }
-                limRejectAssociation(pMac,
-                         pStaDs->staAddr,
-                         pStaDs->mlmStaContext.subType,
-                         true, pStaDs->mlmStaContext.authType,
-                         pStaDs->assocId, true,
-                         (tSirResultCodes) eSIR_MAC_UNSPEC_FAILURE_STATUS);
-            }
-            return;
-        }
-   }
-    else
-    {
-        limLog( pMac, LOGW,
-             FL( "DEL STA failed!\n" ));
-        statusCode = eSIR_SME_REFUSED;
-    }
-    end:
-    if( 0 != limMsgQ->bodyptr )
-    {
-      palFreeMemory( pMac->hHdd, (void *) pDelStaParams );
-    }
-    if(eLIM_MLM_WT_ASSOC_DEL_STA_RSP_STATE != pStaDs->mlmStaContext.mlmState)
-    {
-       limPrepareAndSendDelStaCnf(pMac, pStaDs, statusCode,psessionEntry);
-    }
-      return;
-}
-#endif
-/* This is the copy of  limProcessApMlmDelStaRsp used for BT-AMP Support  */
 void limProcessBtAmpApMlmDelStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,tpPESession psessionEntry)
 {
     tpDeleteStaParams pDelStaParams = (tpDeleteStaParams) limMsgQ->bodyptr;
@@ -2403,95 +2367,6 @@
     return;
 }
 
-#ifdef ANI_PRODUCT_TYPE_AP
-void limProcessApMlmAddStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ )
-{
-    tpAddStaParams pAddStaParams = (tpAddStaParams) limMsgQ->bodyptr;
-    tpDphHashNode pStaDs = dphGetHashEntry(pMac, pAddStaParams->assocId);
-    if(pStaDs == NULL)
-    {
-        //TODO: any response to be sent out here ?
-        limLog( pMac, LOGE, FL( "DPH Entry for STA %X missing.\n"), pAddStaParams->assocId);
-        goto end;
-    }
-    //
-    // TODO & FIXME_GEN4
-    // Need to inspect tSirMsgQ.reserved for a valid Dialog token!
-    //
-    //TODO: any check for pMac->lim.gLimMlmState ?
-    if( eLIM_MLM_WT_ADD_STA_RSP_STATE != pStaDs->mlmStaContext.mlmState)
-    {
-        //TODO: any response to be sent out here ?
-        limLog( pMac, LOGE,
-                FL( "Received unexpected WDA_ADD_STA_RSP in state %X\n" ),
-                pStaDs->mlmStaContext.mlmState);
-        goto end;
-    }
-    if(eHAL_STATUS_SUCCESS != pAddStaParams->status)
-    {
-        PELOGE(limLog(pMac, LOGE, FL("Error! rcvd delSta rsp from HAL with status %d\n"),pAddStaParams->status);)
-        limRejectAssociation(pMac, pStaDs->staAddr,
-                 pStaDs->mlmStaContext.subType,
-                 true, pStaDs->mlmStaContext.authType,
-                 pStaDs->assocId, true,
-                 (tSirResultCodes) eSIR_MAC_UNSPEC_FAILURE_STATUS);
-        goto end;
-    }
-    pStaDs->bssId = pAddStaParams->bssIdx;
-    pStaDs->staIndex = pAddStaParams->staIdx;
-    pStaDs->ucUcastSig    = pAddStaParams->ucUcastSig;
-    pStaDs->ucBcastSig    = pAddStaParams->ucBcastSig;
-    if(pStaDs->qos.addtsPresent)
-    {
-        //need to send halMsg_AddTs to HAL.
-        tpLimTspecInfo pTspecInfo;
-        if(eSIR_SUCCESS ==
-           limTspecFindByAssocId(pMac, pStaDs->assocId, &pStaDs->qos.addts.tspec,
-                                 &pMac->lim.tspecInfo[0], &pTspecInfo))
-        {
-            if(eSIR_SUCCESS != limSendHalMsgAddTs(pMac, pStaDs->staIndex, pTspecInfo->idx, pStaDs->qos.addts.tspec))
-            {
-                // delete the TS that has already been added.
-                // send the response with error status.
-                limAdmitControlDeleteTS(pMac, pStaDs->assocId, &pStaDs->qos.addts.tspec.tsinfo, NULL, &pTspecInfo->idx);
-                PELOGE(limLog(pMac, LOGE,
-                 FL("limSendHalMsgAddTs failed for STA with assocId=%d\n"),
-                 pStaDs->assocId);)
-                limRejectAssociation(pMac,
-                   pStaDs->staAddr, pStaDs->mlmStaContext.subType,
-                   true, pStaDs->mlmStaContext.authType,
-                   pStaDs->assocId, false,
-                   (tSirResultCodes) eSIR_MAC_UNSPEC_FAILURE_STATUS);
-                if( 0 != limMsgQ->bodyptr )
-                {
-                    palFreeMemory( pMac->hHdd, (void *) pAddStaParams );
-                }
-                limDelSta(pMac, pStaDs, true,psessionEntry);
-                return;
-            }
-        }
-    }
-    //if the AssocRsp frame is not acknowledged, then keep alive timer will take care of the state
-    pStaDs->valid = 1;
-    pStaDs->mlmStaContext.mlmState = eLIM_MLM_LINK_ESTABLISHED_STATE;
-    PELOG1(limLog( pMac, LOG1,
-            FL("STA AssocID %d staId %d MAC "),
-            pStaDs->assocId,
-            pStaDs->staIndex);
-    limPrintMacAddr(pMac, pStaDs->staAddr, LOG1);)
-    // Send Re/Association Response with
-    // status code to requesting STA.
-    limSendAssocRspMgmtFrame(pMac, eSIR_SUCCESS, pStaDs->assocId, pStaDs->staAddr,
-                             pStaDs->mlmStaContext.subType, pStaDs,psessionEntry);
-end:
-    if( 0 != limMsgQ->bodyptr )
-    {
-        palFreeMemory( pMac->hHdd, (void *) pAddStaParams );
-    }
-    return;
-}
-#endif
-/* This is the copy of  limProcessApMlmAddStaRsp function .... used for BT-AMP AP Support */
 void limProcessBtAmpApMlmAddStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,tpPESession psessionEntry)
 {
     tpAddStaParams pAddStaParams = (tpAddStaParams) limMsgQ->bodyptr;
@@ -2602,6 +2477,8 @@
     if((psessionEntry = peFindSessionBySessionId(pMac,pAddBssParams->sessionId))== NULL)
     {
         PELOGE(limLog(pMac, LOGE,FL("session does not exist for given sessionId\n"));)
+        if( NULL != pAddBssParams )
+            palFreeMemory( pMac->hHdd, (void *) pAddBssParams );
         return;
     }
     /* Update PE session Id*/
@@ -2614,7 +2491,7 @@
             goto end;
         // Set MLME state
         psessionEntry->limMlmState = eLIM_MLM_BSS_STARTED_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId,  psessionEntry->limMlmState));
         if( eSIR_IBSS_MODE == pAddBssParams->bssType )
         {
             /** IBSS is 'active' when we receive
@@ -2625,7 +2502,7 @@
             psessionEntry->statypeForBss = STA_ENTRY_PEER; //to know session created for self/peer
             limResetHBPktCount( psessionEntry );
             limHeartBeatDeactivateAndChangeTimer(pMac, psessionEntry);
-            MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_HEART_BEAT_TIMER));
+            MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_HEART_BEAT_TIMER));
             if (limActivateHearBeatTimer(pMac) != TX_SUCCESS)
                 limLog(pMac, LOGP, FL("could not activate Heartbeat timer\n"));
         }
@@ -2717,7 +2594,7 @@
             goto end;
         // Set MLME state
         psessionEntry->limMlmState = eLIM_MLM_BSS_STARTED_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
         /** IBSS is 'active' when we receive
          * Beacon frames from other STAs that are part of same IBSS.
          * Mark internal state as inactive until then.
@@ -2726,7 +2603,7 @@
         limResetHBPktCount( psessionEntry );
         /* Timer related functions are not modified for BT-AMP : To be Done */
         limHeartBeatDeactivateAndChangeTimer(pMac, psessionEntry);
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_HEART_BEAT_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_HEART_BEAT_TIMER));
         if (limActivateHearBeatTimer(pMac) != TX_SUCCESS)
             limLog(pMac, LOGP, FL("could not activate Heartbeat timer\n"));
         psessionEntry->bssIdx     = (tANI_U8) pAddBssParams->bssIdx;
@@ -2844,14 +2721,14 @@
             // SUNIT_FIX_ME:  Set BOTH? Assume not. Please verify here and below.
             //pMac->lim.gLimMlmState = eLIM_MLM_JOINED_STATE;
             psessionEntry->limMlmState = eLIM_MLM_JOINED_STATE;
-            MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, eLIM_MLM_JOINED_STATE));
+            MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, eLIM_MLM_JOINED_STATE));
             pMlmAuthReq->sessionId = psessionEntry->peSessionId;
             psessionEntry->limPrevSmeState = psessionEntry->limSmeState;
             psessionEntry->limSmeState     = eLIM_SME_WT_AUTH_STATE;
             // remember staId in case of assoc timeout/failure handling
             psessionEntry->staId = pAddBssParams->staContext.staIdx;
 
-            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, psessionEntry->limSmeState));
+            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
             limPostMlmMessage(pMac,
                               LIM_MLM_AUTH_REQ,
                               (tANI_U32 *) pMlmAuthReq);
@@ -2861,7 +2738,7 @@
 joinFailure:
     {
         psessionEntry->limSmeState = eLIM_SME_JOIN_FAILURE_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, psessionEntry->limSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
 
         /// Send Join response to Host
         limHandleSmeJoinResult(pMac,  eSIR_SME_REFUSED, eSIR_MAC_UNSPEC_FAILURE_STATUS, psessionEntry);
@@ -2917,7 +2794,7 @@
     // start reassoc timer.
     pMac->lim.limTimers.gLimReassocFailureTimer.sessionId = psessionEntry->peSessionId;
     /// Start reassociation failure timer
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_REASSOC_FAIL_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_REASSOC_FAIL_TIMER));
     if (tx_timer_activate(&pMac->lim.limTimers.gLimReassocFailureTimer)
                                                != TX_SUCCESS)
     {
@@ -2993,18 +2870,22 @@
     pAddStaParams->updateSta = FALSE;
 
     pAddStaParams->shortPreambleSupported = (tANI_U8)psessionEntry->beaconParams.fShortPreamble;
+#ifdef WLAN_FEATURE_11AC
+    limPopulateOwnRateSet(pMac, &pAddStaParams->supportedRates, NULL, false,psessionEntry, NULL);
+#else
     limPopulateOwnRateSet(pMac, &pAddStaParams->supportedRates, NULL, false,psessionEntry);
+#endif
 
-    if( psessionEntry->htCapabality)
+    if( psessionEntry->htCapability)
     {
-        pAddStaParams->htCapable = psessionEntry->htCapabality;
+        pAddStaParams->htCapable = psessionEntry->htCapability;
 #ifdef DISABLE_GF_FOR_INTEROP
         /*
          * To resolve the interop problem with Broadcom AP,
          * where TQ STA could not pass traffic with GF enabled,
          * TQ STA will do Greenfield only with TQ AP, for
          * everybody else it will be turned off.
-        */
+         */
         if( (psessionEntry->pLimJoinReq != NULL) && (!psessionEntry->pLimJoinReq->bssDescription.aniIndicator))
         {
             limLog( pMac, LOGE, FL(" Turning off Greenfield, when adding self entry"));
@@ -3142,7 +3023,7 @@
 
          // Set MLME state
         psessionEntry->limMlmState = eLIM_MLM_WT_ADD_STA_RSP_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
         psessionEntry->statypeForBss = STA_ENTRY_PEER; //to know the session  started for self or for  peer oct6th
         // Now, send WDA_ADD_STA_REQ
         limLog( pMac, LOGW, FL( "On STA: ADD_BSS was successful\n" ));
@@ -3254,6 +3135,8 @@
     if((psessionEntry = peFindSessionBySessionId(pMac,pAddBssParams->sessionId))== NULL)
     {
         limLog( pMac, LOGE, FL( "Session Does not exist for given sessionId\n" ));
+            if( NULL != pAddBssParams )
+                palFreeMemory( pMac->hHdd, (void *) pAddBssParams );
         return;
     }
     /* update PE session Id*/
@@ -3324,14 +3207,14 @@
  */
 void limProcessMlmSetStaKeyRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ )
 {
-    tANI_U8 respReqd = 1;
+    tANI_U8           respReqd = 1;
     tLimMlmSetKeysCnf mlmSetKeysCnf;
     tANI_U8  sessionId = 0;
     tpPESession  psessionEntry;
     SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
     palZeroMemory( pMac->hHdd, (void *)&mlmSetKeysCnf, sizeof( tLimMlmSetKeysCnf ));
    //BTAMP
-    if(NULL == limMsgQ->bodyptr)
+    if( NULL == limMsgQ->bodyptr )
     {
         PELOGE(limLog(pMac, LOGE,FL("limMsgQ bodyptr is NULL\n"));)
         return;
@@ -3340,12 +3223,13 @@
     if((psessionEntry = peFindSessionBySessionId(pMac, sessionId))== NULL)
     {
         PELOGE(limLog(pMac, LOGE,FL("session does not exist for given sessionId\n"));)
+        palFreeMemory( pMac->hHdd, (void *) limMsgQ->bodyptr );
         return;
     }
     if( eLIM_MLM_WT_SET_STA_KEY_STATE != psessionEntry->limMlmState )
     {
         // Mesg received from HAL in Invalid state!
-        limLog( pMac, LOGW, FL( "Received unexpected [Mesg Id - %d] in state %X\n" ), limMsgQ->type, pMac->lim.gLimMlmState );
+        limLog( pMac, LOGW, FL( "Received unexpected [Mesg Id - %d] in state %X\n" ), limMsgQ->type, psessionEntry->limMlmState );
         // There's not much that MLME can do at this stage...
         respReqd = 0;
     }
@@ -3354,9 +3238,8 @@
 
     palFreeMemory( pMac->hHdd, (void *) limMsgQ->bodyptr );
     // Restore MLME state
-    //pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
     psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
     if( respReqd )
     {
         tpLimMlmSetKeysReq lpLimMlmSetKeysReq = (tpLimMlmSetKeysReq) pMac->lim.gpLimMlmSetKeysReq;
@@ -3365,27 +3248,27 @@
         {
             palCopyMemory( pMac->hHdd, (tANI_U8 *) &mlmSetKeysCnf.peerMacAddr, (tANI_U8 *) lpLimMlmSetKeysReq->peerMacAddr, sizeof(tSirMacAddr) );
 #ifdef ANI_PRODUCT_TYPE_AP
-      mlmSetKeysCnf.aid = lpLimMlmSetKeysReq->aid;
+            mlmSetKeysCnf.aid = lpLimMlmSetKeysReq->aid;
 #endif
             // Free the buffer cached for the global pMac->lim.gpLimMlmSetKeysReq
-            palFreeMemory( pMac->hHdd, (tANI_U8 *) pMac->lim.gpLimMlmSetKeysReq);
+            palFreeMemory(pMac->hHdd, (tANI_U8 *) pMac->lim.gpLimMlmSetKeysReq);
             pMac->lim.gpLimMlmSetKeysReq = NULL;
         }
         mlmSetKeysCnf.sessionId = sessionId;
-        limPostSmeMessage( pMac, LIM_MLM_SETKEYS_CNF, (tANI_U32 *) &mlmSetKeysCnf );
+        limPostSmeMessage(pMac, LIM_MLM_SETKEYS_CNF, (tANI_U32 *) &mlmSetKeysCnf);
     }
 }
 void limProcessMlmSetBssKeyRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ )
 {
     tANI_U8 respReqd = 1;
     tLimMlmSetKeysCnf mlmSetKeysCnf;
-    tANI_U16 resultCode;
-    tANI_U8  sessionId =0;
+    tANI_U16          resultCode;
+    tANI_U8           sessionId = 0;
     tpPESession  psessionEntry;
     SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
     palZeroMemory( pMac->hHdd, (void *)&mlmSetKeysCnf, sizeof( tLimMlmSetKeysCnf ));
    //BTAMP
-    if(NULL == limMsgQ->bodyptr)
+    if( NULL == limMsgQ->bodyptr )
     {
         PELOGE(limLog(pMac, LOGE,FL("limMsgQ bodyptr is null\n"));)
         return;
@@ -3394,6 +3277,7 @@
     if((psessionEntry = peFindSessionBySessionId(pMac, sessionId))== NULL)
     {
         PELOGE(limLog(pMac, LOGE,FL("session does not exist for given sessionId\n"));)
+        palFreeMemory( pMac->hHdd, (void *) limMsgQ->bodyptr );
         return;
     }
     if( eLIM_MLM_WT_SET_BSS_KEY_STATE == psessionEntry->limMlmState )
@@ -3401,10 +3285,10 @@
     else
         resultCode = (tANI_U16) (((tpSetStaKeyParams) limMsgQ->bodyptr)->status); //BCAST key also uses tpSetStaKeyParams. Done this way for readabilty.
 
-  //
-  // TODO & FIXME_GEN4
-  // Need to inspect tSirMsgQ.reserved for a valid Dialog token!
-  //
+    //
+    // TODO & FIXME_GEN4
+    // Need to inspect tSirMsgQ.reserved for a valid Dialog token!
+    //
   // Validate SME/LIM state - Read the above "ASSUMPTIONS"
   //if( eLIM_SME_LINK_EST_STATE == pMac->lim.gLimSmeState )
   //{
@@ -3413,7 +3297,7 @@
         eLIM_MLM_WT_SET_STA_BCASTKEY_STATE != psessionEntry->limMlmState )
     {
         // Mesg received from HAL in Invalid state!
-        limLog( pMac, LOGW, FL( "Received unexpected [Mesg Id - %d] in state %X\n" ), limMsgQ->type, pMac->lim.gLimMlmState );
+        limLog( pMac, LOGW, FL( "Received unexpected [Mesg Id - %d] in state %X\n" ), limMsgQ->type, psessionEntry->limMlmState );
         // There's not much that MLME can do at this stage...
         respReqd = 0;
     }
@@ -3422,10 +3306,9 @@
 
     palFreeMemory( pMac->hHdd, (void *) limMsgQ->bodyptr );
     // Restore MLME state
-    //pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
     psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
 
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
     if( respReqd )
     {
         tpLimMlmSetKeysReq lpLimMlmSetKeysReq = (tpLimMlmSetKeysReq) pMac->lim.gpLimMlmSetKeysReq;
@@ -3436,13 +3319,13 @@
         {
             palCopyMemory( pMac->hHdd, (tANI_U8 *) &mlmSetKeysCnf.peerMacAddr, (tANI_U8 *) lpLimMlmSetKeysReq->peerMacAddr, sizeof(tSirMacAddr) );
 #ifdef ANI_PRODUCT_TYPE_AP
-      mlmSetKeysCnf.aid = lpLimMlmSetKeysReq->aid;
+            mlmSetKeysCnf.aid = lpLimMlmSetKeysReq->aid;
 #endif
             // Free the buffer cached for the global pMac->lim.gpLimMlmSetKeysReq
-            palFreeMemory( pMac->hHdd, (tANI_U8 *) pMac->lim.gpLimMlmSetKeysReq);
+            palFreeMemory(pMac->hHdd, (tANI_U8 *) pMac->lim.gpLimMlmSetKeysReq);
             pMac->lim.gpLimMlmSetKeysReq = NULL;
         }
-        limPostSmeMessage( pMac, LIM_MLM_SETKEYS_CNF, (tANI_U32 *) &mlmSetKeysCnf );
+        limPostSmeMessage(pMac, LIM_MLM_SETKEYS_CNF, (tANI_U32 *) &mlmSetKeysCnf);
     }
 }
 /**
@@ -3463,54 +3346,77 @@
  */
 void limProcessMlmRemoveKeyRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ )
 {
-tLimMlmRemoveKeyCnf mlmRemoveCnf;
-tANI_U16 resultCode;
-tpLimMlmRemoveKeyReq lpLimMlmRemoveKeyReq = (tpLimMlmRemoveKeyReq) pMac->lim.gpLimMlmRemoveKeyReq;
-  SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
-  palZeroMemory( pMac->hHdd,
-      (void *) &mlmRemoveCnf,
-      sizeof( tLimMlmRemoveKeyCnf ));
-  // Validate MLME state
-    if( eLIM_MLM_WT_REMOVE_BSS_KEY_STATE != pMac->lim.gLimMlmState &&
-        eLIM_MLM_WT_REMOVE_STA_KEY_STATE != pMac->lim.gLimMlmState )
+    tANI_U8 respReqd = 1;
+    tLimMlmRemoveKeyCnf mlmRemoveCnf;
+    tANI_U16             resultCode;
+    tANI_U8              sessionId = 0;
+    tpPESession  psessionEntry;
+    SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
+    palZeroMemory( pMac->hHdd, (void *) &mlmRemoveCnf, sizeof( tLimMlmRemoveKeyCnf ));
+
+    if( NULL == limMsgQ->bodyptr )
     {
-      // Mesg received from HAL in Invalid state!
-      limLog( pMac, LOGW,
-          FL( "Received unexpected [Mesg Id - %d] in state %X\n" ),
-          limMsgQ->type,
-          pMac->lim.gLimMlmState );
-          return; //ignore the response.
+        PELOGE(limLog(pMac, LOGE,FL("limMsgQ bodyptr is NULL\n"));)
+        return;
     }
 
-  if( eLIM_MLM_WT_REMOVE_BSS_KEY_STATE == pMac->lim.gLimMlmState )
-    resultCode = (tANI_U16) (((tpRemoveBssKeyParams) limMsgQ->bodyptr)->status);
-  else
-    resultCode = (tANI_U16) (((tpRemoveStaKeyParams) limMsgQ->bodyptr)->status);
-  //
-  // TODO & FIXME_GEN4
-  // Need to inspect tSirMsgQ.reserved for a valid Dialog token!
-  //
+    if (limMsgQ->type == WDA_REMOVE_STAKEY_RSP)
+        sessionId = ((tpRemoveStaKeyParams) limMsgQ->bodyptr)->sessionId;
+    else if (limMsgQ->type == WDA_REMOVE_BSSKEY_RSP)
+        sessionId = ((tpRemoveBssKeyParams) limMsgQ->bodyptr)->sessionId;
 
-  if( 0 != limMsgQ->bodyptr )
-    palFreeMemory( pMac->hHdd, (void *) limMsgQ->bodyptr );
-  // Restore MLME state
-  pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
-  MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
-    // Prepare and Send LIM_MLM_REMOVEKEY_CNF
-    if( NULL != lpLimMlmRemoveKeyReq )
+    if((psessionEntry = peFindSessionBySessionId(pMac, sessionId))== NULL)
     {
-      palCopyMemory( pMac->hHdd,
-          (tANI_U8 *) &mlmRemoveCnf.peerMacAddr,
-          (tANI_U8 *) lpLimMlmRemoveKeyReq->peerMacAddr,
-          sizeof( tSirMacAddr ));
-      mlmRemoveCnf.resultCode = resultCode;
-      // Free the buffer cached for the global pMac->lim.gpLimMlmRemoveKeyReq
-      palFreeMemory( pMac->hHdd, (tANI_U8 *) pMac->lim.gpLimMlmRemoveKeyReq);
-      pMac->lim.gpLimMlmRemoveKeyReq = NULL;
-     }
-     limPostSmeMessage( pMac,
-        LIM_MLM_REMOVEKEY_CNF,
-        (tANI_U32 *) &mlmRemoveCnf );
+        PELOGE(limLog(pMac, LOGE,FL("session does not exist for given sessionId\n"));)
+        return;
+    }
+
+    if( eLIM_MLM_WT_REMOVE_BSS_KEY_STATE == psessionEntry->limMlmState )
+      resultCode = (tANI_U16) (((tpRemoveBssKeyParams) limMsgQ->bodyptr)->status);
+    else
+      resultCode = (tANI_U16) (((tpRemoveStaKeyParams) limMsgQ->bodyptr)->status);
+
+    // Validate MLME state
+    if( eLIM_MLM_WT_REMOVE_BSS_KEY_STATE != psessionEntry->limMlmState &&
+        eLIM_MLM_WT_REMOVE_STA_KEY_STATE != psessionEntry->limMlmState )
+    {
+        // Mesg received from HAL in Invalid state!
+        limLog(pMac, LOGW,
+            FL("Received unexpected [Mesg Id - %d] in state %X\n"),
+          limMsgQ->type,
+          psessionEntry->limMlmState );
+          respReqd = 0;
+    }
+    else
+        mlmRemoveCnf.resultCode = resultCode;
+
+    //
+    // TODO & FIXME_GEN4
+    // Need to inspect tSirMsgQ.reserved for a valid Dialog token!
+    //
+
+    palFreeMemory( pMac->hHdd, (void *) limMsgQ->bodyptr );
+
+    // Restore MLME state
+    psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
+
+    if( respReqd )
+    {
+        tpLimMlmRemoveKeyReq lpLimMlmRemoveKeyReq = (tpLimMlmRemoveKeyReq) pMac->lim.gpLimMlmRemoveKeyReq;
+        mlmRemoveCnf.sessionId = sessionId;
+
+    // Prepare and Send LIM_MLM_REMOVEKEY_CNF
+        if( NULL != lpLimMlmRemoveKeyReq )
+    {
+            palCopyMemory( pMac->hHdd, (tANI_U8 *) &mlmRemoveCnf.peerMacAddr, (tANI_U8 *) lpLimMlmRemoveKeyReq->peerMacAddr,
+                      sizeof( tSirMacAddr ));
+        // Free the buffer cached for the global pMac->lim.gpLimMlmRemoveKeyReq
+        palFreeMemory(pMac->hHdd, (tANI_U8 *) pMac->lim.gpLimMlmRemoveKeyReq);
+        pMac->lim.gpLimMlmRemoveKeyReq = NULL;
+    }
+        limPostSmeMessage( pMac, LIM_MLM_REMOVEKEY_CNF, (tANI_U32 *) &mlmRemoveCnf );
+    }
 }
 
 #if (defined(ANI_PRODUCT_TYPE_AP) || defined(ANI_PRODUCT_TYPE_AP_SDK))
@@ -3741,7 +3647,7 @@
         goto end;
     }
     /// Start reassociation failure timer
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_REASSOC_FAIL_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_REASSOC_FAIL_TIMER));
     if (tx_timer_activate(&pMac->lim.limTimers.gLimReassocFailureTimer)
                                                != TX_SUCCESS)
     {
@@ -3814,17 +3720,7 @@
         goto error;
     }
 
-    // Activate Join failure timer
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_JOIN_FAIL_TIMER));
-    if (tx_timer_activate(&pMac->lim.limTimers.gLimJoinFailureTimer) != TX_SUCCESS)
-    {
-        limLog(pMac, LOGP, FL("could not activate Join failure timer\n"));
-        psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
-         MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
-        //memory is freed up below.
-        psessionEntry->pLimMlmJoinReq = NULL;
-        goto error;
-    }
+   
     /* eSIR_BTAMP_AP_MODE stroed as bss type in session Table when join req is received, is to be veified   */
     if(psessionEntry->bssType == eSIR_BTAMP_AP_MODE)
     {
@@ -3867,6 +3763,19 @@
            psessionEntry->pLimMlmJoinReq->bssDescription.bssId, psessionEntry->currentOperChannel/*chanNum*/,
            psessionEntry->selfMacAddr, psessionEntry->dot11mode,
            psessionEntry->pLimJoinReq->addIEScan.length, psessionEntry->pLimJoinReq->addIEScan.addIEdata);
+
+    // Sending mgmt frame is a blocking call activate Join failure timer now
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_JOIN_FAIL_TIMER));
+    if (tx_timer_activate(&pMac->lim.limTimers.gLimJoinFailureTimer) != TX_SUCCESS)
+    {
+        limLog(pMac, LOGP, FL("could not activate Join failure timer\n"));
+        psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
+         MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, pMac->lim.gLimMlmState));
+        //memory is freed up below.
+        psessionEntry->pLimMlmJoinReq = NULL;
+        goto error;
+    }
+
     return;
 error:  
     if(NULL != psessionEntry)
@@ -4075,7 +3984,29 @@
             }
             else
             {
-               pMac->lim.gLimCurrentScanChannelId++;
+               //Skip Dfs Channel in case of P2P Search
+               //If skipDfsChnlInP2pSearch is set in ini
+               if( ( pMac->lim.gpLimMlmScanReq != NULL ) &&
+                   pMac->lim.gpLimMlmScanReq->p2pSearch &&
+                   pMac->lim.gpLimMlmScanReq->skipDfsChnlInP2pSearch )
+               {
+                  int flag = 0;
+                  while(!flag)
+                  {
+                     pMac->lim.gLimCurrentScanChannelId++;
+                     if( (pMac->lim.gLimCurrentScanChannelId >
+                   (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))||
+                        (limActiveScanAllowed(pMac, limGetCurrentScanChannel(pMac))))
+                     {
+                       flag=1; //Bail out from here
+                     }
+                  }
+               }
+               else
+               {
+                  pMac->lim.gLimCurrentScanChannelId++;
+               }
+
                limContinueChannelScan(pMac);
             }
             break;
@@ -4113,10 +4044,69 @@
     }
     return;
 }
+/**
+ *  limStopTxAndSwitch()
+ *
+ *FUNCTION:
+ * Start channel switch on all sessions that is in channel switch state.
+ *
+ * @param pMac                   - pointer to global adapter context
+ *
+ * @return None
+ *
+ */
+static void
+limStopTxAndSwitch (tpAniSirGlobal pMac)
+{
+    tANI_U8 i;
+
+    for(i =0; i < pMac->lim.maxBssId; i++)
+    {
+        if(pMac->lim.gpSession[i].valid && 
+            pMac->lim.gpSession[i].gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
+        {
+            limStopTxAndSwitchChannel(pMac, i);
+        }
+    }
+    return; 
+}
+/**
+ * limStartQuietOnSession()
+ *
+ *FUNCTION:
+ * This function is called to start quiet timer after finish scan if there is  
+ *      qeuieting on any session.
+ *
+ *LOGIC:
+ *
+ *ASSUMPTIONS:
+ * NA
+ *
+ *NOTE:
+ * NA
+ *
+ * @param  pMac    - Pointer to Global MAC structure
+ *
+ * @return None
+ */
+static void
+limStartQuietOnSession (tpAniSirGlobal pMac)
+{
+    tANI_U8 i;
+
+    for(i =0; i < pMac->lim.maxBssId; i++)
+    {
+        if(pMac->lim.gpSession[i].valid && 
+            pMac->lim.gpSession[i].gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN)
+        {
+            limStartQuietTimer(pMac, i);
+        }
+    }
+    return;
+}
 void limProcessFinishScanRsp(tpAniSirGlobal pMac,  void *body)
 {
     tpFinishScanParams      pFinishScanParam;
-    tANI_U8                 dummySessionId = 0;
     eHalStatus              status;
     SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
     pFinishScanParam = (tpFinishScanParams) body;
@@ -4127,21 +4117,21 @@
         case eLIM_HAL_FINISH_SCAN_WAIT_STATE:
             pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
             limCompleteMlmScan(pMac, eSIR_SME_SUCCESS);
-            if (pMac->lim.gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
+            if (limIsChanSwitchRunning(pMac))
             {
                 /** Right time to stop tx and start the timer for channel switch */
                 /* Sending Session ID 0, may not be correct, since SCAN is global there should not
                  * be any associated session id
                 */
-                limStopTxAndSwitchChannel(pMac, dummySessionId);
+                limStopTxAndSwitch(pMac);
             }
-            else if (pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN)
+            else if (limIsQuietBegin(pMac))
             {
                 /** Start the quieting */
                 /* Sending Session ID 0, may not be correct, since SCAN is global there should not
                  * be any associated session id
                 */
-                limStartQuietTimer(pMac, dummySessionId);
+                limStartQuietOnSession(pMac);
             }
 #ifdef ANI_PRODUCT_TYPE_AP
             /* For handling the measurement request from WSM as scan request in LIM*/
@@ -4283,6 +4273,7 @@
   if((psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBACnf->sessionId))== NULL)
   {
         PELOGE(limLog(pMac, LOGE,FL("session does not exist for given BSSId\n"));)
+        palFreeMemory( pMac->hHdd, (void *) pMsgBuf );
         return;
   }
   // First, extract the DPH entry
@@ -4301,7 +4292,7 @@
     PELOGE(limLog( pMac, LOGE,
         FL( "Received unexpected ADDBA CNF when STA BA state is %d\n" ),
         curBaState );)
-    palFreeMemory( pMac->hHdd, (void *) pMsgBuf );
+      palFreeMemory( pMac->hHdd, (void *) pMsgBuf );
     return;
   }
   // Restore STA BA state
@@ -4380,6 +4371,7 @@
     if((psessionEntry = peFindSessionBySessionId(pMac, pMlmDelBACnf->sessionId))== NULL)
    {
         limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
+        palFreeMemory( pMac->hHdd, (void *) pMsgBuf );
         return;
    }
     // First, extract the DPH entry
@@ -4388,6 +4380,7 @@
     {
         limLog( pMac, LOGE,
             FL( "STA context not found - ignoring DELBA CNF from HAL\n" ));
+        palFreeMemory( pMac->hHdd, (void *) pMsgBuf );
         return;
     }
     if(NULL == pMlmDelBACnf)
@@ -4403,6 +4396,7 @@
         limLog( pMac, LOGE,
         FL( "Received unexpected DELBA CNF when STA BA state is %d\n" ),
         curBaState );
+        palFreeMemory( pMac->hHdd, (void *) pMsgBuf );
         return;
     }
     // Restore STA BA state
@@ -4437,6 +4431,7 @@
     if((psessionEntry = peFindSessionByBssid(pMac,pBADeleteParams->bssId,&sessionId))== NULL)
     {
         PELOGE(limLog(pMac, LOGE,FL("session does not exist for given BSSId\n"));)
+        palFreeMemory( pMac->hHdd, (void *) limMsgQ->bodyptr );
         return;
     }
     // First, extract the DPH entry
@@ -4595,7 +4590,7 @@
     /** Skipped the DeleteDPH Hash Entry as we need it for the new BSS*/
     /** Set the MlmState to IDLE*/
     psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
    /* Update PE session Id*/
     mlmReassocCnf.sessionId = psessionEntry->peSessionId;
     switch (psessionEntry->limMlmState) {
@@ -4676,13 +4671,13 @@
             mlmReassocCnf.protStatusCode = pStaDs->mlmStaContext.cleanupTrigger;
             /** Set the SME State back to WT_Reassoc State*/
             psessionEntry->limSmeState = eLIM_SME_WT_REASSOC_STATE;
-            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
             limDeleteDphHashEntry(pMac, pStaDs->staAddr, pStaDs->assocId,psessionEntry);
             if((psessionEntry->limSystemRole == eLIM_STA_ROLE)||
                 (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE))
             {
                psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
-               MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+               MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
             }
             limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmReassocCnf);
         }
@@ -4694,7 +4689,7 @@
             mlmReassocCnf.protStatusCode = eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
             goto Error;
     }
-return;
+    return;
 Error:
     limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmReassocCnf);
 }
@@ -4773,7 +4768,8 @@
     tLimMlmReassocCnf           mlmReassocCnf;
     /** Skipped the DeleteDPH Hash Entry as we need it for the new BSS*/
     /** Set the MlmState to IDLE*/
-    pMac->lim.gLimMlmState = eLIM_MLM_IDLE_STATE;
+    psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
     switch (psessionEntry->limSmeState) {
 #if defined(ANI_PRODUCT_TYPE_CLIENT) || defined(ANI_AP_CLIENT_SDK)
         case eLIM_SME_WT_REASSOC_STATE : {
diff --git a/CORE/MAC/src/pe/lim/limProcessProbeReqFrame.c b/CORE/MAC/src/pe/lim/limProcessProbeReqFrame.c
index ecb7719..48f839c 100644
--- a/CORE/MAC/src/pe/lim/limProcessProbeReqFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessProbeReqFrame.c
@@ -549,7 +549,7 @@
                         pSirSmeProbeReq->sessionId = psessionEntry->smeSessionId;
                         palCopyMemory( pMac->hHdd, pSirSmeProbeReq->peerMacAddr, pHdr->sa, sizeof(tSirMacAddr));
                         pSirSmeProbeReq->devicePasswdId = probeReq.probeReqWscIeInfo.DevicePasswordID.id;
-                        MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+                        MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
                        if (limSysProcessMmhMsgApi(pMac, &msgQ,  ePROT) != eSIR_SUCCESS){
                             PELOG3(limLog(pMac, LOG3, FL("couldnt send the probe req to wsm "));)
                         }
@@ -731,7 +731,8 @@
     //send the probe req to SME.
     limSendSmeMgmtFrameInd( pMac, pHdr->fc.subType,
                (tANI_U8*)pHdr, (frameLen + sizeof(tSirMacMgmtHdr)), 
-               psessionEntry->smeSessionId, WDA_GET_RX_CH(pBd) );
+               psessionEntry->smeSessionId, WDA_GET_RX_CH(pBd),
+               psessionEntry);
 #ifdef WLAN_FEATURE_P2P_INTERNAL
     limSendP2PProbeResponse(pMac, pBd, psessionEntry);
 #endif
@@ -863,7 +864,7 @@
     palCopyMemory( pMac->hHdd, pSirSmeProbeReqInd->bssId, psessionEntry->bssId, sizeof(tSirMacAddr));
     palCopyMemory( pMac->hHdd, pSirSmeProbeReqInd->WPSPBCProbeReq.peerMacAddr, peerMacAddr, sizeof(tSirMacAddr));
 
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
     pSirSmeProbeReqInd->WPSPBCProbeReq.probeReqIELen = (tANI_U16)ProbeReqIELen;
     palCopyMemory( pMac->hHdd, pSirSmeProbeReqInd->WPSPBCProbeReq.probeReqIE, pProbeReqIE, ProbeReqIELen);
     
diff --git a/CORE/MAC/src/pe/lim/limProcessProbeRspFrame.c b/CORE/MAC/src/pe/lim/limProcessProbeRspFrame.c
index 6df50de..3d63939 100644
--- a/CORE/MAC/src/pe/lim/limProcessProbeRspFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessProbeRspFrame.c
@@ -237,8 +237,8 @@
                 {
                     limUpdateQuietIEFromBeacon(pMac, &(probeRsp.quietIE), psessionEntry);
                 }
-                else if ((pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN) ||
-                     (pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING))
+                else if ((psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN) ||
+                     (psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING))
                 {
                     PELOG1(limLog(pMac, LOG1, FL("Received a probe rsp without Quiet IE\n"));)
                     limCancelDot11hQuiet(pMac, psessionEntry);
@@ -249,7 +249,7 @@
                 {
                     limUpdateChannelSwitch(pMac, &probeRsp, psessionEntry);
                 }
-                else if (pMac->lim.gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
+                else if (psessionEntry->gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
                 {
                     limCancelDot11hChannelSwitch(pMac, psessionEntry);
                 }
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 9f1a1bf..9c8fd60 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -124,7 +124,7 @@
     if (TX_TIMER_VALID(pMac->lim.limTimers.gLimBackgroundScanTimer))
     {
         limDeactivateAndChangeTimer(pMac, eLIM_BACKGROUND_SCAN_TIMER);
-     MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_BACKGROUND_SCAN_TIMER));
+     MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_BACKGROUND_SCAN_TIMER));
         if (tx_timer_activate(&pMac->lim.limTimers.gLimBackgroundScanTimer) != TX_SUCCESS)
             limLog(pMac, LOGP, FL("could not activate background scan timer\n"));
         pMac->lim.gLimBackgroundScanStarted   = true;
@@ -316,7 +316,9 @@
 {
     /** fRadarDetCurOperChan will be set only if we detect radar in current
      * operating channel and System Role == AP ROLE */
-    if (LIM_IS_RADAR_DETECTED(pMac))
+    //TODO: Need to take care radar detection.
+    //if (LIM_IS_RADAR_DETECTED(pMac))
+    if( 0 )
     {
         if (limDeferMsg(pMac, pMsg) != TX_SUCCESS)
         {
@@ -365,7 +367,7 @@
     {
         pMac->lim.gLimSmeState = eLIM_SME_IDLE_STATE;
         
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
         
         /// By default do not return after first scan match
         pMac->lim.gLimReturnAfterFirstMatch = 0;
@@ -433,7 +435,7 @@
     }
 #endif
     PELOGW(limLog(pMac, LOGW, FL("sending WDA_SYS_READY_IND msg to HAL\n"));)
-    MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
 
     if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
     {
@@ -443,7 +445,62 @@
     return eANI_BOOLEAN_FALSE;
 }
 
+#ifdef WLAN_FEATURE_11AC
 
+tANI_U32 limGetCenterChannel(tpAniSirGlobal pMac,tANI_U8 primarychanNum,ePhyChanBondState secondaryChanOffset, tANI_U8 chanWidth)
+{
+    if (chanWidth == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
+    {
+        switch(secondaryChanOffset)
+        {
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
+                return primarychanNum;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
+               return primarychanNum + 2;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
+               return primarychanNum - 2;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
+               return primarychanNum + 6;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
+               return primarychanNum + 2;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
+               return primarychanNum - 2;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
+               return primarychanNum - 6;
+            default :
+               return eSIR_CFG_INVALID_ID;
+        }
+    }
+    else if (chanWidth == WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ)
+    {
+        switch(secondaryChanOffset)
+        {
+            case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
+                return primarychanNum + 2;
+            case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
+                return primarychanNum - 2;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
+                return primarychanNum;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
+               return primarychanNum + 2;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
+               return primarychanNum - 2;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
+               return primarychanNum + 2;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
+               return primarychanNum - 2;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
+               return primarychanNum + 2;
+            case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
+               return primarychanNum - 2;
+            default :
+               return eSIR_CFG_INVALID_ID;
+        }
+    }
+    return primarychanNum;
+}
+
+#endif
 /**
  * __limHandleSmeStartBssRequest()
  *
@@ -473,7 +530,6 @@
     tpSirSmeStartBssReq     pSmeStartBssReq;                //Local variable for Start BSS Req.. Added For BT-AMP Support 
     tSirResultCodes         retCode = eSIR_SME_SUCCESS;
     tANI_U32                autoGenBssId = FALSE;           //Flag Used in case of IBSS to Auto generate BSSID.
-    tSirMacHTChannelWidth   txWidthSet;
     tANI_U8                 sessionId;
     tpPESession             psessionEntry = NULL;
     tANI_U8                 smesessionId;
@@ -581,8 +637,12 @@
         /* Store the dot 11 mode in to the session Table*/
 
         psessionEntry->dot11mode = pSmeStartBssReq->dot11mode;
-        psessionEntry->htCapabality = IS_DOT11_MODE_HT(psessionEntry->dot11mode);
-
+        psessionEntry->htCapability = IS_DOT11_MODE_HT(psessionEntry->dot11mode);
+#ifdef WLAN_FEATURE_11AC
+        psessionEntry->vhtCapability = IS_DOT11_MODE_VHT(psessionEntry->dot11mode);
+        VOS_TRACE(VOS_MODULE_ID_PE,VOS_TRACE_LEVEL_FATAL,
+            FL("*****psessionEntry->vhtCapability = %d\n"),psessionEntry->vhtCapability);
+#endif
         palCopyMemory(pMac->hHdd, (void*)&psessionEntry->rateSet,
             (void*)&pSmeStartBssReq->operationalRateSet,
             sizeof(tSirMacRateSet));
@@ -667,41 +727,73 @@
         if (pSmeStartBssReq->channelId)
         {
             channelNumber = pSmeStartBssReq->channelId;
-            /*Update cbMode received from sme with LIM's updated cbMode*/
-            pSmeStartBssReq->cbMode = (tAniCBSecondaryMode)pMac->lim.gCbMode;
+            psessionEntry->htSupportedChannelWidthSet = (pSmeStartBssReq->cbMode)?1:0; // This is already merged value of peer and self - done by csr in csrGetCBModeFromIes
+            psessionEntry->htRecommendedTxWidthSet = psessionEntry->htSupportedChannelWidthSet;
+            psessionEntry->htSecondaryChannelOffset = pSmeStartBssReq->cbMode;
+            VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR,
+                      FL("cbMode %u"), pSmeStartBssReq->cbMode);
+#ifdef WLAN_FEATURE_11AC
+            if(psessionEntry->vhtCapability)
+            {
+                tANI_U32 centerChan;
+                tANI_U32 chanWidth;
 
-            setupCBState( pMac, pSmeStartBssReq->cbMode );
-            pMac->lim.gHTSecondaryChannelOffset = limGetHTCBState(pSmeStartBssReq->cbMode);
-#ifdef WLAN_SOFTAP_FEATURE
-            txWidthSet = (tSirMacHTChannelWidth)limGetHTCapability(pMac, eHT_RECOMMENDED_TX_WIDTH_SET, psessionEntry);
-#else
-            txWidthSet = (tSirMacHTChannelWidth)limGetHTCapability(pMac, eHT_RECOMMENDED_TX_WIDTH_SET);
-#endif
-
-            /*
-                * If there is a mismatch in secondaryChannelOffset being passed in the START_BSS request and
-                * ChannelBonding CFG, then MAC will override the 'ChannelBonding' CFG with what is being passed
-                * in StartBss Request.
-                * HAL RA and PHY will go out of sync, if both these values are not consistent and will result in TXP Errors
-                * when HAL RA tries to use 40Mhz rates when CB is turned off in PHY.
-                */
-            if(((pMac->lim.gHTSecondaryChannelOffset == eHT_SECONDARY_CHANNEL_OFFSET_NONE) &&
-                    (txWidthSet == eHT_CHANNEL_WIDTH_40MHZ)) ||
-                    ((pMac->lim.gHTSecondaryChannelOffset != eHT_SECONDARY_CHANNEL_OFFSET_NONE) &&
-                    (txWidthSet == eHT_CHANNEL_WIDTH_20MHZ)))
+                if (wlan_cfgGetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH,
+                          &chanWidth) != eSIR_SUCCESS)
                 {
-                   PELOGW(limLog(pMac, LOGW, FL("secondaryChannelOffset and txWidthSet don't match, resetting txWidthSet CFG\n"));)
-                    txWidthSet = (txWidthSet == eHT_CHANNEL_WIDTH_20MHZ) ? eHT_CHANNEL_WIDTH_40MHZ : eHT_CHANNEL_WIDTH_20MHZ;
-                    if (cfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, txWidthSet)
-                                        != eSIR_SUCCESS)
+                    limLog(pMac, LOGP,
+                      FL("Unable to retrieve Channel Width from CFG\n"));
+                }
+
+                if(chanWidth == eHT_CHANNEL_WIDTH_20MHZ || chanWidth == eHT_CHANNEL_WIDTH_40MHZ)
+                {
+                    if (cfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH, WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ)
+                                                                     != eSIR_SUCCESS)
                     {
                         limLog(pMac, LOGP, FL("could not set  WNI_CFG_CHANNEL_BONDING_MODE at CFG\n"));
                         retCode = eSIR_LOGP_EXCEPTION;
-                        goto free;
+                         goto free;
                     }
                 }
-        }
+                if (chanWidth == eHT_CHANNEL_WIDTH_80MHZ)
+                {
+                    if (cfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH, WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
+                                                                     != eSIR_SUCCESS)
+                    {
+                        limLog(pMac, LOGP, FL("could not set  WNI_CFG_CHANNEL_BONDING_MODE at CFG\n"));
+                        retCode = eSIR_LOGP_EXCEPTION;
+                         goto free;
+                    }
 
+                    centerChan = limGetCenterChannel(pMac,channelNumber,pSmeStartBssReq->cbMode,WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ);
+                    if(centerChan != eSIR_CFG_INVALID_ID)
+                    {
+                        limLog(pMac, LOGW, FL("***Center Channel for 80MHZ channel width = %ld\n"),centerChan);
+                        if (cfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1, centerChan)
+                                                                     != eSIR_SUCCESS)
+                        {
+                            limLog(pMac, LOGP, FL("could not set  WNI_CFG_CHANNEL_BONDING_MODE at CFG\n"));
+                            retCode = eSIR_LOGP_EXCEPTION;
+                            goto free;
+                        }
+                    }
+                }
+
+                /* All the translation is done by now for gVhtChannelWidth from .ini file to 
+                 * the actual values as defined in spec. So, grabing the spec value which is 
+                 * updated in .dat file by the above logic */
+                if (wlan_cfgGetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH,
+                                   &chanWidth) != eSIR_SUCCESS)
+                {
+                    limLog(pMac, LOGP,
+                      FL("Unable to retrieve Channel Width from CFG\n"));
+                }
+
+                psessionEntry->vhtTxChannelWidthSet = chanWidth;
+            }
+            psessionEntry->htSecondaryChannelOffset = limGetHTCBState(pSmeStartBssReq->cbMode);
+#endif
+        }
         else
         {
             PELOGW(limLog(pMac, LOGW, FL("Received invalid eWNI_SME_START_BSS_REQ\n"));)
@@ -719,18 +811,10 @@
 
 #ifdef FIXME_GEN6   //following code may not be required. limInitMlm is now being invoked during peStart
         /// Initialize MLM state machine
-#ifdef ANI_PRODUCT_TYPE_AP
-            /* The Role is not set yet. Currently assuming the AddBss in Linux will be called by AP only.
-             * This should be handled when IBSS functionality is implemented in the Linux
-             * TODO */
-            pMac->lim.gLimMlmState = eLIM_MLM_IDLE_STATE;
-            MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
-#else
         limInitMlm(pMac);
 #endif
-#endif
 
-        psessionEntry->htCapabality = IS_DOT11_MODE_HT(pSmeStartBssReq->dot11mode);
+        psessionEntry->htCapability = IS_DOT11_MODE_HT(pSmeStartBssReq->dot11mode);
 
 #ifdef WLAN_SOFTAP_FEATURE
             /* keep the RSN/WPA IE information in PE Session Entry
@@ -860,16 +944,13 @@
                       
         // Now populate the 11n related parameters
         pMlmStartReq->nwType    = psessionEntry->nwType;
-        pMlmStartReq->htCapable = psessionEntry->htCapabality;
+        pMlmStartReq->htCapable = psessionEntry->htCapability;
         //
         // FIXME_GEN4 - Determine the appropriate defaults...
         //
         pMlmStartReq->htOperMode        = pMac->lim.gHTOperMode;
         pMlmStartReq->dualCTSProtection = pMac->lim.gHTDualCTSProtection; // Unused
-        pMlmStartReq->txChannelWidthSet = pMac->lim.gHTRecommendedTxWidthSet;
-
-        //Update the global LIM parameter, which is used to populate HT Info IEs in beacons/probe responses.
-        pMac->lim.gHTSecondaryChannelOffset = limGetHTCBState(pMlmStartReq->cbMode);
+        pMlmStartReq->txChannelWidthSet = psessionEntry->htRecommendedTxWidthSet;
 
         /* sep26 review */
         psessionEntry->limRFBand = limGetRFBand(channelNumber);
@@ -890,18 +971,9 @@
                 limLog(pMac, LOGP, FL("Fail to get WNI_CFG_11H_ENABLED \n"));
         }
 
-#ifdef ANI_PRODUCT_TYPE_AP
-        PELOGE(limLog(pMac, LOGE, FL("Dot 11h is %s\n"), pMac->lim.gLim11hEnable?"Enabled":"Disabled");)
-        if (pMac->lim.gLim11hEnable)
-        { 
-           PELOG2(limLog(pMac, LOG2, FL("Cb state = %d, SecChanOffset = %d\n"),
-                   pMac->lim.gCbState, pMac->lim.gHTSecondaryChannelOffset);)
-            limRadarInit(pMac);
-        }
-#endif
         psessionEntry ->limPrevSmeState = psessionEntry->limSmeState;
         psessionEntry ->limSmeState     =  eLIM_SME_WT_START_BSS_STATE;
-     MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry ->limSmeState));
 
         limPostMlmMessage(pMac, LIM_MLM_START_REQ, (tANI_U32 *) pMlmStartReq);
         return;
@@ -1092,7 +1164,7 @@
          pMac->lim.gLimPrevSmeState = pMac->lim.gLimSmeState;
         
         pMac->lim.gLimSmeState = eLIM_SME_WT_SCAN_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
 
         if (pScanReq->returnFreshResults & SIR_BG_SCAN_PURGE_RESUTLS)
         {
@@ -1214,6 +1286,7 @@
         pMlmScanReq->dot11mode = pScanReq->dot11mode;
 #ifdef WLAN_FEATURE_P2P
         pMlmScanReq->p2pSearch = pScanReq->p2pSearch;
+        pMlmScanReq->skipDfsChnlInP2pSearch = pScanReq->skipDfsChnlInP2pSearch;
 #endif
 
         //Store the smeSessionID and transaction ID for later use.
@@ -1265,7 +1338,36 @@
 
 } /*** end __limProcessSmeScanReq() ***/
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
 
+static void __limProcessSmeOemDataReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
+{
+    tpSirOemDataReq    pOemDataReq;
+    tLimMlmOemDataReq* pMlmOemDataReq;
+
+    pOemDataReq = (tpSirOemDataReq) pMsgBuf; 
+
+    //post the lim mlm message now
+    if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, (void**)&pMlmOemDataReq, (sizeof(tLimMlmOemDataReq))))
+    {
+        limLog(pMac, LOGP, FL("palAllocateMemory failed for mlmOemDataReq\n"));
+        return;
+    }
+
+    //Initialize this buffer
+    palZeroMemory(pMac->hHdd, pMlmOemDataReq, (sizeof(tLimMlmOemDataReq)));
+
+    palCopyMemory(pMac->hHdd, pMlmOemDataReq->selfMacAddr, pOemDataReq->selfMacAddr, sizeof(tSirMacAddr)); 
+    palCopyMemory(pMac->hHdd, pMlmOemDataReq->oemDataReq, pOemDataReq->oemDataReq, OEM_DATA_REQ_SIZE);
+
+    //Issue LIM_MLM_OEM_DATA_REQ to MLM
+    limPostMlmMessage(pMac, LIM_MLM_OEM_DATA_REQ, (tANI_U32*)pMlmOemDataReq);
+
+    return;
+
+} /*** end __limProcessSmeOemDataReq() ***/
+
+#endif //FEATURE_OEM_DATA_SUPPORT
 
 
 /**
@@ -1285,7 +1387,6 @@
  * @param  *pMsgBuf  A pointer to the SME message buffer
  * @return None
  */
-
 static void
 __limProcessSmeJoinReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
 {
@@ -1338,9 +1439,6 @@
         }
         (void) palZeroMemory(pMac->hHdd, (void *) pSmeJoinReq, nSize);
  
-#if defined(ANI_PRODUCT_TYPE_CLIENT) || defined(ANI_AP_CLIENT_SDK)
-        handleHTCapabilityandHTInfo(pMac);
-#endif
         if ((limJoinReqSerDes(pMac, pSmeJoinReq, (tANI_U8 *)pMsgBuf) == eSIR_FAILURE) ||
                 (!limIsSmeJoinReqValid(pMac, pSmeJoinReq)))
         {
@@ -1400,7 +1498,8 @@
                 goto end;
             }
         }   
-        
+        handleHTCapabilityandHTInfo(pMac, psessionEntry);
+
         /* Store Session related parameters */
         /* Store PE session Id in session Table */
         psessionEntry->peSessionId = sessionId;
@@ -1428,18 +1527,25 @@
 
         psessionEntry->dot11mode  = pSmeJoinReq->dot11mode;
         psessionEntry->nwType = pSmeJoinReq->bssDescription.nwType;
+#ifdef WLAN_FEATURE_11AC
+        psessionEntry->vhtCapability = IS_DOT11_MODE_VHT(psessionEntry->dot11mode);
+        VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_FATAL,
+            "***__limProcessSmeJoinReq: vhtCapability=%d****\n",psessionEntry->vhtCapability);
+#endif
 
         /*Phy mode*/
         psessionEntry->gLimPhyMode = pSmeJoinReq->bssDescription.nwType;
 
         /* Copy The channel Id to the session Table */
         psessionEntry->currentOperChannel = pSmeJoinReq->bssDescription.channelId;
-
+        psessionEntry->htSupportedChannelWidthSet = (pSmeJoinReq->cbMode)?1:0; // This is already merged value of peer and self - done by csr in csrGetCBModeFromIes
+        psessionEntry->htRecommendedTxWidthSet = psessionEntry->htSupportedChannelWidthSet;
+        psessionEntry->htSecondaryChannelOffset = pSmeJoinReq->cbMode;
 
         /*Store Persona */
         psessionEntry->pePersona = pSmeJoinReq->staPersona;
         VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO,
-                  FL("PE PERSONA=%d"), psessionEntry->pePersona);
+                  FL("PE PERSONA=%d cbMode %u"), psessionEntry->pePersona, pSmeJoinReq->cbMode);
         
         /* Copy the SSID from smejoinreq to session entry  */  
         psessionEntry->ssId.length = pSmeJoinReq->ssId.length;
@@ -1553,10 +1659,6 @@
 
         pMac->lim.gLimCurrentBssCaps =
             pMac->lim.gpLimJoinReq->neighborBssList.bssList[0].capabilityInfo;
-
-        pMac->lim.gLimCurrentTitanHtCaps =
-             pMac->lim.gpLimJoinReq->neighborBssList.bssList[0].titanHtCaps;
-
         palCopyMemory( pMac->hHdd,
          (tANI_U8 *) &pMac->lim.gLimCurrentSSID,
          (tANI_U8 *) &pMac->lim.gpLimJoinReq->neighborBssList.bssList[0].ssId,
@@ -1569,30 +1671,19 @@
            (tANI_U8 *) &psessionEntry->pLimJoinReq->bssDescription.bssId,
            psessionEntry->pLimJoinReq->bssDescription.length + 2);
 
-#if 0
-
-        pMac->lim.gLimCurrentChannelId =
-           psessionEntry->pLimJoinReq->bssDescription.channelId;
-#endif //oct 9th review remove globals
-
-        
         psessionEntry->limCurrentBssCaps =
-               psessionEntry->pLimJoinReq->bssDescription.capabilityInfo;
-        
+           psessionEntry->pLimJoinReq->bssDescription.capabilityInfo;
 
-        psessionEntry->limCurrentTitanHtCaps=
-                psessionEntry->pLimJoinReq->bssDescription.titanHtCaps;
-
-            regMax = cfgGetRegulatoryMaxTransmitPower( pMac, psessionEntry->currentOperChannel ); 
-            localPowerConstraint = regMax;
-            limExtractApCapability( pMac,
-               (tANI_U8 *) psessionEntry->pLimJoinReq->bssDescription.ieFields,
-               limGetIElenFromBssDescription(&psessionEntry->pLimJoinReq->bssDescription),
-               &psessionEntry->limCurrentBssQosCaps,
-               &psessionEntry->limCurrentBssPropCap,
-               &pMac->lim.gLimCurrentBssUapsd //TBD-RAJESH  make gLimCurrentBssUapsd this session specific
-               , &localPowerConstraint
-               ); 
+        regMax = cfgGetRegulatoryMaxTransmitPower( pMac, psessionEntry->currentOperChannel ); 
+        localPowerConstraint = regMax;
+        limExtractApCapability( pMac,
+           (tANI_U8 *) psessionEntry->pLimJoinReq->bssDescription.ieFields,
+           limGetIElenFromBssDescription(&psessionEntry->pLimJoinReq->bssDescription),
+           &psessionEntry->limCurrentBssQosCaps,
+           &psessionEntry->limCurrentBssPropCap,
+           &pMac->lim.gLimCurrentBssUapsd //TBD-RAJESH  make gLimCurrentBssUapsd this session specific
+           , &localPowerConstraint
+           ); 
 #ifdef FEATURE_WLAN_CCX
             psessionEntry->maxTxPower = limGetMaxTxPower(regMax, localPowerConstraint, pMac->roam.configParam.nTxPowerCap);
 #else
@@ -1628,9 +1719,9 @@
         //To care of the scenario when STA transitions from IBSS to Infrastructure mode.
         pMac->lim.gLimIbssCoalescingHappened = false;
 
-        psessionEntry->limPrevSmeState = psessionEntry->limSmeState;
-        psessionEntry->limSmeState = eLIM_SME_WT_JOIN_STATE;
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+            psessionEntry->limPrevSmeState = psessionEntry->limSmeState;
+            psessionEntry->limSmeState = eLIM_SME_WT_JOIN_STATE;
+            MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
 
         PELOG1(limLog(pMac, LOG1, FL("SME JoinReq: SSID %d.%c%c%c%c%c%c\n"),
                psessionEntry->ssId.length,
@@ -1711,152 +1802,6 @@
 }
 #endif
 
-
-#if 0
-/**
- * __limProcessSmeAuthReq()
- *
- *FUNCTION:
- * This function is called to process SME_AUTH_REQ message
- * from HDD or upper layer application.
- *
- *LOGIC:
- *
- *ASSUMPTIONS:
- *
- *NOTE:
- *
- * @param  pMac      Pointer to Global MAC structure
- * @param  *pMsgBuf  A pointer to the SME message buffer
- * @return None
- */
-
-static void
-__limProcessSmeAuthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
-{
-
-    tAniAuthType       authMode;
-    tLimMlmAuthReq     *pMlmAuthReq;
-    tpSirSmeAuthReq    pSirSmeAuthReq;
-    tSirResultCodes    retCode = eSIR_SME_SUCCESS;
-    tpPESession        psessionEntry;
-    tANI_U8            sessionId;
-
-    
-    if(pMsgBuf == NULL)
-    {
-        limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));
-           return;
-    }
-
-    pSirSmeAuthReq = (tpSirSmeAuthReq) pMsgBuf;
-
-    if((psessionEntry = peFindSessionByBssid(pMac,pSirSmeAuthReq->bssId,&sessionId))== NULL)
-    {
-        limLog(pMac, LOGE,FL("Session Does not exist for given BssId\n"));
-        return;
-    }
-
-    if (!limIsSmeAuthReqValid(pSirSmeAuthReq))
-    {
-        limLog(pMac, LOGW,
-               FL("received invalid SME_AUTH_REQ message\n"));
-
-        /// Send AUTH failure response to host
-        retCode = eSIR_SME_INVALID_PARAMETERS;
-        goto end;
-    }
-
-    PELOG1(limLog(pMac, LOG1,
-           FL("RECEIVED AUTH_REQ\n"));)
-
-    /**
-     * Expect Auth request for STA in link established state
-     * or STA in IBSS mode in normal state.
-     */
-
-    if ((psessionEntry->limSmeState == eLIM_SME_LINK_EST_STATE) ||
-        (psessionEntry->limSmeState == eLIM_SME_JOIN_FAILURE_STATE) ||
-        ((psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) &&
-         (psessionEntry->limSmeState == eLIM_SME_NORMAL_STATE)))
-    {
-        if (pSirSmeAuthReq->authType == eSIR_AUTO_SWITCH)
-            authMode = eSIR_SHARED_KEY; // Try Shared Key first
-        else
-            authMode = pSirSmeAuthReq->authType;
-
-        // Trigger MAC based Authentication
-        if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pMlmAuthReq, sizeof(tLimMlmAuthReq)))
-        {
-            // Log error
-            limLog(pMac, LOGP,
-                   FL("call to palAllocateMemory failed for mlmAuthReq\n"));
-            return;
-        }
-
-        pMac->lim.gLimPreAuthType = pSirSmeAuthReq->authType;
-
-        psessionEntry->limPrevSmeState = psessionEntry->limSmeState;
-        psessionEntry->limSmeState     = eLIM_SME_WT_PRE_AUTH_STATE;
-     MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
-
-        // Store channel specified in auth request.
-        // This will be programmed later by MLM.
-        pMac->lim.gLimPreAuthChannelNumber =
-                                    (tSirMacChanNum)
-                                    pSirSmeAuthReq->channelNumber;
-
-        palCopyMemory( pMac->hHdd, (tANI_U8 *) &pMac->lim.gLimPreAuthPeerAddr,
-                      (tANI_U8 *) &pSirSmeAuthReq->peerMacAddr,
-                      sizeof(tSirMacAddr));
-
-        palCopyMemory( pMac->hHdd, (tANI_U8 *) &pMlmAuthReq->peerMacAddr,
-                      (tANI_U8 *) &pSirSmeAuthReq->peerMacAddr,
-                      sizeof(tSirMacAddr));
-
-        pMlmAuthReq->authType = authMode;
-        
-        /* Update PE session  Id */
-        pMlmAuthReq->sessionId = sessionId;
-
-        if (wlan_cfgGetInt(pMac, WNI_CFG_AUTHENTICATE_FAILURE_TIMEOUT,
-                      (tANI_U32 *) &pMlmAuthReq->authFailureTimeout)
-                            != eSIR_SUCCESS)
-        {
-            /**
-             * Could not get AuthFailureTimeout value from CFG.
-             * Log error.
-             */
-            limLog(pMac, LOGP,
-                   FL("could not retrieve AuthFailureTimeout value\n"));
-        }
-
-        limPostMlmMessage(pMac, LIM_MLM_AUTH_REQ, (tANI_U32 *) pMlmAuthReq);
-        return;
-    }
-    else
-    {
-        /// Should not have received eWNI_SME_AUTH_REQ
-        // Log the event
-        limLog(pMac, LOGE,
-               FL("received unexpected SME_AUTH_REQ in state %X\n"),psessionEntry->limSmeState);
-        limPrintSmeState(pMac, LOGE, psessionEntry->limSmeState);
-
-        /// Send AUTH failure response to host
-        retCode = eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
-        goto end;
-    }
-
-end:
-    limSendSmeAuthRsp(pMac, retCode,
-                      pSirSmeAuthReq->peerMacAddr,
-                      pSirSmeAuthReq->authType,
-                      eSIR_MAC_UNSPEC_FAILURE_STATUS );
-
-} /*** end __limProcessSmeAuthReq() ***/
-#endif
-
-
 /**
  * __limProcessSmeReassocReq()
  *
@@ -1975,30 +1920,6 @@
         goto end;
     }
 
-#if (WNI_POLARIS_FW_PACKAGE == ADVANCED) && defined(ANI_PRODUCT_TYPE_AP)
-    limCopyNeighborInfoToCfg(pMac,
-        psessionEntry->pLimReAssocReq->neighborBssList.bssList[0],
-        psessionEntry);
-
-    palCopyMemory( pMac->hHdd,
-             pMac->lim.gLimReassocBssId,
-             psessionEntry->pLimReAssocReq->neighborBssList.bssList[0].bssId,
-             sizeof(tSirMacAddr));
-
-    pMac->lim.gLimReassocChannelId =
-         psessionEntry->pLimReAssocReq->neighborBssList.bssList[0].channelId;
-
-    pMac->lim.gLimReassocBssCaps =
-    psessionEntry->pLimReAssocReq->neighborBssList.bssList[0].capabilityInfo;
-
-    pMac->lim.gLimReassocTitanHtCaps = 
-        psessionEntry->pLimReAssocReq->neighborBssList.bssList[0].titanHtCaps;
-
-    palCopyMemory( pMac->hHdd,
-    (tANI_U8 *) &pMac->lim.gLimReassocSSID,
-    (tANI_U8 *) &psessionEntry->pLimReAssocReq->neighborBssList.bssList[0].ssId,
-    psessionEntry->pLimReAssocReq->neighborBssList.bssList[0].ssId.length+1);
-#else
     palCopyMemory( pMac->hHdd,
              psessionEntry->limReAssocbssId,
              psessionEntry->pLimReAssocReq->bssDescription.bssId,
@@ -2007,12 +1928,15 @@
     psessionEntry->limReassocChannelId =
          psessionEntry->pLimReAssocReq->bssDescription.channelId;
 
+    psessionEntry->reAssocHtSupportedChannelWidthSet =
+         (psessionEntry->pLimReAssocReq->cbMode)?1:0;
+    psessionEntry->reAssocHtRecommendedTxWidthSet =
+         psessionEntry->reAssocHtSupportedChannelWidthSet;
+    psessionEntry->reAssocHtSecondaryChannelOffset =
+         psessionEntry->pLimReAssocReq->cbMode;
+
     psessionEntry->limReassocBssCaps =
                 psessionEntry->pLimReAssocReq->bssDescription.capabilityInfo;
-
-    psessionEntry->limReassocTitanHtCaps =
-            psessionEntry->pLimReAssocReq->bssDescription.titanHtCaps;
-    
     regMax = cfgGetRegulatoryMaxTransmitPower( pMac, psessionEntry->currentOperChannel ); 
     localPowerConstraint = regMax;
     limExtractApCapability( pMac,
@@ -2057,8 +1981,6 @@
         limLog( pMac, LOG1, FL("UAPSD flag for all AC - 0x%2x\n"), pMac->lim.gUapsdPerAcBitmask);
     }
 
-#endif
-
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pMlmReassocReq, sizeof(tLimMlmReassocReq)))
     {
         // Log error
@@ -2146,7 +2068,7 @@
     psessionEntry->limPrevSmeState = psessionEntry->limSmeState;
     psessionEntry->limSmeState    = eLIM_SME_WT_REASSOC_STATE;
 
-    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
 
     limPostMlmMessage(pMac,
                       LIM_MLM_REASSOC_REQ,
@@ -2243,7 +2165,7 @@
     }
 
 
-    PELOGE(limLog(pMac, LOGE,   FL("received DISASSOC_REQ message. Reason: %d SmeState: %d\n"), 
+    PELOGE(limLog(pMac, LOGE,   FL("received DISASSOC_REQ message. Reason: %d global SmeState: %d\n"), 
                                                         smeDisassocReq.reasonCode, pMac->lim.gLimSmeState);)
 
 
@@ -2275,7 +2197,7 @@
                 case eLIM_SME_LINK_EST_STATE:
                     psessionEntry->limPrevSmeState = psessionEntry->limSmeState;
                     psessionEntry->limSmeState= eLIM_SME_WT_DISASSOC_STATE;
-                      MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+                    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
                     break;
 
                 case eLIM_SME_WT_DEAUTH_STATE:
@@ -2285,7 +2207,7 @@
                      * its been set when PE entered WT_DEAUTH_STATE. 
                      */                  
                     psessionEntry->limSmeState= eLIM_SME_WT_DISASSOC_STATE;
-                    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+                    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
                     limLog(pMac, LOG1, FL("Rcvd SME_DISASSOC_REQ while in SME_WT_DEAUTH_STATE. \n"));
                     break;
 
@@ -2611,7 +2533,7 @@
                 case eLIM_SME_IDLE_STATE:
                     psessionEntry->limPrevSmeState = psessionEntry->limSmeState;
                     psessionEntry->limSmeState = eLIM_SME_WT_DEAUTH_STATE;
-              MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+              MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, pMac->lim.gLimSmeState));
 
                     // Send Deauthentication request to MLM below
 
@@ -3040,178 +2962,6 @@
     palFreeMemory( pMac->hHdd, pRemoveKeyReq);
 } /*** end __limProcessSmeRemoveKeyReq() ***/
 
-
-
-#if (WNI_POLARIS_FW_PACKAGE == ADVANCED) && defined(ANI_PRODUCT_TYPE_AP)
-/**
- * __limHandleSmeSwitchChlRequest()
- *
- *FUNCTION:
- *  This function is called to process the following SME messages
- *  received from HDD or WSM:
- *      - eWNI_SME_SWITCH_CHL_REQ
- *      - eWNI_SME_SWITCH_CHL_CB_PRIMARY_REQ
- *      - eWNI_SME_SWITCH_CHL_CB_SECONDARY_REQ
- *
- *ASSUMPTIONS:
- *
- *  eWNI_SME_SWITCH_CHL_REQ is issued only when 11h is enabled,
- *  and WSM wishes to switch its primary channel. AP shall
- *  populate the 802.11h channel switch IE in its Beacons/Probe Rsp.
- *
- *  eWNI_SME_SWITCH_CHL_CB_PRIMARY_REQ is issued only when 11h is enabled,
- *  and WSM wishes to switch both its primary channel and secondary channel.
- *  (In the case of if 11h is disabled, and WSM wants to change both
- *  primary & secondary channel, then WSM should issue a restart-BSS). AP
- *  shall populate the 802.11h channel switch IE in its Beacons/Probe Rsp.
- *
- *  eWNI_SME_SWITCH_CHL_CB_SECONDARY_REQ is issued when WSM wishes to
- *  switch/disable only its secondary channel. This can occur when 11h
- *  is enabled or disabled. AP shall populate the airgo proprietary
- *  channel switch IE in its Beacons/Probe Rsp.
- *
- *NOTE:
- *
- * @param  pMac      Pointer to Global MAC structure
- * @param  *pMsgBuf  A pointer to the SME message buffer
- * @return None
- */
-
-static void
-__limHandleSmeSwitchChlRequest(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
-{
-    tpSirSmeSwitchChannelReq   pSmeMsg;
-    eHalStatus                 status;
-
-#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
-    limDiagEventReport(pMac, WLAN_PE_DIAG_SWITCH_CHL_REQ_EVENT, NULL, 0, 0);
-#endif //FEATURE_WLAN_DIAG_SUPPORT
-    
-    if(pMsgBuf == NULL)
-    {
-        limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));
-           return;
-    }
-
-    if (pMac->lim.gLimSmeState != eLIM_SME_NORMAL_STATE ||
-            pMac->lim.gLimSystemRole != eLIM_AP_ROLE ||
-            pMac->lim.gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
-    {
-        PELOGE(limLog(pMac, LOGE, "Rcvd Switch Chl Req in wrong state\n");)
-        limSendSmeRsp(pMac, eWNI_SME_SWITCH_CHL_RSP, eSIR_SME_CHANNEL_SWITCH_FAIL);
-        return;
-    }
-                
-    status = palAllocateMemory( pMac->hHdd, (void **)&pSmeMsg, sizeof(tSirSmeSwitchChannelReq));
-    if( eHAL_STATUS_SUCCESS != status)
-    {
-        PELOGE(limLog(pMac, LOGE, FL("palAllocateMemory failed, status = %d\n"), status);)
-        return;
-    }
-
-    if (!limIsSmeSwitchChannelReqValid(pMac, (tANI_U8 *)pMsgBuf, pSmeMsg))
-    {
-        limLog(pMac, LOGE,
-            FL("invalid sme message received\n"));
-        palFreeMemory( pMac->hHdd, pSmeMsg);
-        limSendSmeRsp(pMac, eWNI_SME_SWITCH_CHL_RSP, eSIR_SME_INVALID_PARAMETERS);
-        return;
-    }
-
-
-    /* If we're already doing channel switching and we're in the
-     * middle of counting down, then reject this channel switch msg.
-     */
-    if (pMac->lim.gLimChannelSwitch.state != eLIM_CHANNEL_SWITCH_IDLE)
-    {
-        limLog(pMac, LOGE,
-            FL("channel switching is already in progress.\n"));
-        palFreeMemory( pMac->hHdd, pSmeMsg);
-        limSendSmeRsp(pMac, eWNI_SME_SWITCH_CHL_RSP, eSIR_SME_CHANNEL_SWITCH_DISABLED);
-        return;
-    }
-
-    PELOG1(limLog(pMac, LOG1, FL("rcvd eWNI_SME_SWITCH_CHL_REQ, message type = %d\n"), pSmeMsg->messageType);)
-    switch(pSmeMsg->messageType)
-    {
-        case eWNI_SME_SWITCH_CHL_REQ:
-            pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_ONLY;
-            break;
-
-        case eWNI_SME_SWITCH_CHL_CB_PRIMARY_REQ:
-
-            pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY;
-            break;
-
-        case eWNI_SME_SWITCH_CHL_CB_SECONDARY_REQ:
-            pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_SECONDARY_ONLY;
-            break;
-
-        default:
-            PELOGE(limLog(pMac, LOGE, FL("unknown message\n"));)
-            palFreeMemory( pMac->hHdd, pSmeMsg);
-            limSendSmeRsp(pMac, eWNI_SME_SWITCH_CHL_RSP, eSIR_SME_INVALID_PARAMETERS);
-            return;
-    }
-
-    pMac->lim.gLimChannelSwitch.primaryChannel = pSmeMsg->channelId;
-    pMac->lim.gLimChannelSwitch.secondarySubBand = pSmeMsg->cbMode;
-    pMac->lim.gLimChannelSwitch.switchCount = computeChannelSwitchCount(pMac, pSmeMsg->dtimFactor);
-    if (LIM_IS_RADAR_DETECTED(pMac))
-    {
-        /** Measurement timers not running */
-        pMac->lim.gLimChannelSwitch.switchMode = eSIR_CHANSW_MODE_SILENT;
-    }
-    else
-    {
-        /** Stop measurement timers till channel switch */
-        limStopMeasTimers(pMac);
-        pMac->lim.gLimChannelSwitch.switchMode = eSIR_CHANSW_MODE_NORMAL;
-    }
-
-    PELOG1(limLog(pMac, LOG1, FL("state %d, primary %d, subband %d, count %d \n"),
-           pMac->lim.gLimChannelSwitch.state,
-           pMac->lim.gLimChannelSwitch.primaryChannel,
-           pMac->lim.gLimChannelSwitch.secondarySubBand,
-           pMac->lim.gLimChannelSwitch.switchCount);)
-    palFreeMemory( pMac->hHdd, pSmeMsg);
-    
-    pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_END;
-    pMac->lim.gLimSpecMgmt.dot11hChanSwState = eLIM_11H_CHANSW_RUNNING;
-    
-    return;
-} /*** end __limHandleSmeSwitchChlRequest() ***/
-
-
-/**--------------------------------------------------------------
-\fn     __limProcessSmeSwitchChlReq
-
-\brief  Wrapper for the function __limHandleSmeSwitchChlRequest
-        This message will be defered until softmac come out of
-        scan mode.
-\param  pMac
-\param  pMsg
-
-\return TRUE - If we consumed the buffer
-        FALSE - If have defered the message.
- ---------------------------------------------------------------*/
-static tANI_BOOLEAN
-__limProcessSmeSwitchChlReq(tpAniSirGlobal pMac, tpSirMsgQ pMsg)
-{
-    if (__limIsDeferedMsgForLearn(pMac, pMsg))
-    {
-        /**
-                * If message defered, buffer is not consumed yet.
-                * So return false
-                */
-        return eANI_BOOLEAN_FALSE;
-    }
-    __limHandleSmeSwitchChlRequest(pMac, (tANI_U32 *) pMsg->bodyptr);
-    return eANI_BOOLEAN_TRUE;
-}
-#endif
-
-
 void limProcessSmeGetScanChannelInfo(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
 {
     tSirMsgQ         mmhMsg;
@@ -3262,7 +3012,7 @@
     mmhMsg.bodyval = 0;
   
     pMac->lim.gLimRspReqd = false;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg,  ePROT);
 }
 
@@ -3581,7 +3331,7 @@
     prevState = psessionEntry->limSmeState;
 
     psessionEntry->limSmeState = eLIM_SME_IDLE_STATE;
-    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
 
     /* Update SME session Id and Transaction Id */
     psessionEntry->smeSessionId = smesessionId;
@@ -3609,7 +3359,7 @@
         PELOGE(limLog(pMac, LOGE, FL("delBss failed for bss %d\n"), psessionEntry->bssIdx);)
         psessionEntry->limSmeState= prevState;
 
-        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
+        MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, psessionEntry->limSmeState));
    
         limSendSmeRsp(pMac, eWNI_SME_STOP_BSS_RSP, eSIR_SME_STOP_BSS_FAILURE,smesessionId,smetransactionId);
     }
@@ -4258,7 +4008,7 @@
         limLog(pMac, LOGP, FL("AddtsRsp timer change failed!\n"));
         return;
     }
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_ADDTS_RSP_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_ADDTS_RSP_TIMER));
     
     //add the sessionId to the timer object
     pMac->lim.limTimers.gLimAddtsRspTimer.sessionId = sessionId;
@@ -4441,6 +4191,7 @@
     if((psessionEntry = peFindSessionByBssid(pMac,pStatsReq->bssId,&sessionId))== NULL)
     {
         limLog(pMac, LOGE, FL("session does not exist for given bssId\n"));
+        palFreeMemory( pMac, pMsgBuf );
         return;
     }
 
@@ -4482,10 +4233,11 @@
     msgQ.reserved = 0;
     msgQ.bodyptr = pMsgBuf;
     msgQ.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
     if( eSIR_SUCCESS != (wdaPostCtrlMsg( pMac, &msgQ ))){
         limLog(pMac, LOGP, "Unable to forward request\n");
+        palFreeMemory( pMac, pMsgBuf );
         return;
     }
 
@@ -4530,7 +4282,7 @@
     msgQ.reserved = 0;
     msgQ.bodyptr = pMsgBuf;
     msgQ.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
 
     if( eSIR_SUCCESS != (wdaPostCtrlMsg( pMac, &msgQ ))){
         palFreeMemory( pMac, pMsgBuf );
@@ -4866,7 +4618,7 @@
    msg.bodyval = 0;
 
    PELOGW(limLog(pMac, LOG1, FL("sending SIR_HAL_ADD_STA_SELF_REQ msg to HAL\n"));)
-      MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+      MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
 
    if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
    {
@@ -4916,7 +4668,7 @@
    msg.bodyval = 0;
 
    PELOGW(limLog(pMac, LOG1, FL("sending SIR_HAL_ADD_STA_SELF_REQ msg to HAL\n"));)
-      MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+      MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
 
    if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
    {
@@ -4952,9 +4704,8 @@
     tpLimMgmtFrameRegistration pLimMgmtRegistration = NULL, pNext = NULL;
     tANI_BOOLEAN match = VOS_FALSE;
     PELOG1(limLog(pMac, LOG1, 
-           FL("%s: registerFrame %d, frameType %d, matchLen %d\n", 
-           __func__, pSmeReq->registerFrame, pSmeReq->frameType, 
-       pSmeReq->matchLen)));
+           FL("registerFrame %d, frameType %d, matchLen %d\n"), 
+            pSmeReq->registerFrame, pSmeReq->frameType, pSmeReq->matchLen);)
 
     /* First check whether entry exists already*/
 
@@ -5056,7 +4807,7 @@
     tANI_BOOLEAN bufConsumed = TRUE; //Set this flag to false within case block of any following message, that doesnt want pMsgBuf to be freed.
     tANI_U32 *pMsgBuf = pMsg->bodyptr;
 
-    PELOG1(limLog(pMac, LOG1, FL("LIM Received SME Message %s(%d) LimSmeState:%s(%d) LimMlmState: %s(%d)\n"),
+    PELOG1(limLog(pMac, LOG1, FL("LIM Received SME Message %s(%d) Global LimSmeState:%s(%d) Global LimMlmState: %s(%d)\n"),
          limMsgStr(pMsg->type), pMsg->type,
          limSmeStateStr(pMac->lim.gLimSmeState), pMac->lim.gLimSmeState,
          limMlmStateStr(pMac->lim.gLimMlmState), pMac->lim.gLimMlmState );)
@@ -5081,6 +4832,12 @@
 
             break;
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+        case eWNI_SME_OEM_DATA_REQ:
+            __limProcessSmeOemDataReq(pMac, pMsgBuf);
+
+            break;
+#endif
 #ifdef WLAN_FEATURE_P2P
         case eWNI_SME_REMAIN_ON_CHANNEL_REQ:
             bufConsumed = limProcessRemainOnChnlReq(pMac, pMsgBuf);
diff --git a/CORE/MAC/src/pe/lim/limPropExtsUtils.c b/CORE/MAC/src/pe/lim/limPropExtsUtils.c
index cfd824f..2419782 100644
--- a/CORE/MAC/src/pe/lim/limPropExtsUtils.c
+++ b/CORE/MAC/src/pe/lim/limPropExtsUtils.c
@@ -33,7 +33,6 @@
  * --------------------------------------------------------------------
  *
  */
-
 #include "aniGlobal.h"
 #ifdef ANI_PRODUCT_TYPE_AP
 #include "wniCfgAp.h"
@@ -55,7 +54,6 @@
 #include "limSerDesUtils.h"
 #include "limTrace.h"
 #include "limSession.h"
-
 #define LIM_GET_NOISE_MAX_TRY 5
 #if (defined(ANI_PRODUCT_TYPE_AP) || defined(ANI_PRODUCT_TYPE_AP_SDK))
 /**
@@ -82,11 +80,9 @@
 limGetCurrentLearnChannel(tpAniSirGlobal pMac)
 {
     tANI_U8 *pChanNum = pMac->lim.gpLimMeasReq->channelList.channelNumber;
-
     return (*(pChanNum + pMac->lim.gLimMeasParams.nextLearnChannelId));
 } /*** end limGetCurrentLearnChannel() ***/
 #endif //#if (defined(ANI_PRODUCT_TYPE_AP) || defined(ANI_PRODUCT_TYPE_AP_SDK))
-
 /**
  * limExtractApCapability()
  *
@@ -107,7 +103,6 @@
  * @param   qosCap    Bits are set according to capabilities
  * @return  0 - If AP does not assert HCF capability & 1 - otherwise
  */
-
 void
 limExtractApCapability(tpAniSirGlobal pMac, tANI_U8 *pIE, tANI_U16 ieLen,
                        tANI_U8 *qosCap, tANI_U16 *propCap, tANI_U8 *uapsd, 
@@ -118,13 +113,10 @@
 #if !defined WLAN_FEATURE_VOWIFI
     tANI_U32            localPowerConstraints = 0;
 #endif
-
     palZeroMemory( pMac->hHdd, (tANI_U8 *) &beaconStruct, sizeof(beaconStruct));
-
     *qosCap = 0;
     *propCap = 0;
     *uapsd = 0;
-
     PELOG3(limLog( pMac, LOG3,
         FL("In limExtractApCapability: The IE's being received are:\n"));
     sirDumpBuf( pMac, SIR_LIM_MODULE_ID, LOG3, pIE, ieLen );)
@@ -146,10 +138,24 @@
         else
             pMac->lim.htCapabilityPresentInBeacon = 0;
 
+#ifdef WLAN_FEATURE_11AC
+        VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_FATAL,
+            "***beacon.VHTCaps.present*****=%d\n",beaconStruct.VHTCaps.present);
+
+        if ( beaconStruct.VHTCaps.present && beaconStruct.VHTOperation.present)
+        {
+            pMac->lim.vhtCapabilityPresentInBeacon = 1;
+            pMac->lim.apCenterChan = beaconStruct.VHTOperation.chanCenterFreqSeg1;
+            pMac->lim.apChanWidth = beaconStruct.VHTOperation.chanWidth;
+        }
+        else
+        {
+            pMac->lim.vhtCapabilityPresentInBeacon = 0;
+        }
+#endif
         // Extract the UAPSD flag from WMM Parameter element
         if (beaconStruct.wmeEdcaPresent)
             *uapsd = beaconStruct.edcaParams.qosInfo.uapsd;
-
 #if defined FEATURE_WLAN_CCX
         /* If there is Power Constraint Element specifically,
          * adapt to it. Hence there is else condition check
@@ -160,12 +166,15 @@
             *localConstraint = beaconStruct.ccxTxPwr.power_limit;
         }
 #endif
-
-        if (beaconStruct.powerConstraintPresent && ( pMac->lim.gLim11hEnable
+        if (beaconStruct.powerConstraintPresent)
+#if 0
+        //Remove this check. This function is expected to return localPowerConsraints
+        //and it should just do that. Check for 11h enabled or not can be done at the caller
 #if defined WLAN_FEATURE_VOWIFI
-                 || pMac->rrm.rrmPEContext.rrmEnable
+          && ( pMac->lim.gLim11hEnable
+           || pMac->rrm.rrmPEContext.rrmEnable
 #endif
-                 ))
+#endif
         {
 #if defined WLAN_FEATURE_VOWIFI 
            *localConstraint -= beaconStruct.localPowerConstraint.localPowerConstraints;
@@ -173,7 +182,6 @@
            localPowerConstraints = (tANI_U32)beaconStruct.localPowerConstraint.localPowerConstraints;
 #endif
         }
-
 #if !defined WLAN_FEATURE_VOWIFI
         if (cfgSetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, localPowerConstraints) != eSIR_SUCCESS)
         {
@@ -181,12 +189,9 @@
         }
 #endif
     }
-
     return;
 } /****** end limExtractApCapability() ******/
 
-
-
 #if (defined(ANI_PRODUCT_TYPE_AP) || defined(ANI_PRODUCT_TYPE_AP_SDK))
 /**
  * limQuietBss()
@@ -210,18 +215,14 @@
  * @param   duration  Specifies quiet duration in millisec
  * @return  None
  */
-
 void
 limQuietBss(tpAniSirGlobal pMac, tANI_U32 duration)
 {
-
     // Temporarily not quieting BSS
     (void) pMac; (void) duration;
     return;
 } /****** end limQuietBss() ******/
 
-
-
 /**
  * limIsMatrixNodePresent()
  *
@@ -240,16 +241,13 @@
  * @param   pMac  - Pointer to Global MAC structure
  * @return  pNode - Pointer to Matrix node if found. Else NULL
  */
-
 static tpLimMeasMatrixNode
 limIsMatrixNodePresent(tpAniSirGlobal pMac)
 {
     tANI_U8   i, chanNum = limGetCurrentLearnChannel(pMac);
     tpLimMeasMatrixNode pNode = pMac->lim.gpLimMeasData->pMeasMatrixInfo;
-
     if (!pNode)
         return NULL;
-
     for (i = 0; i < pMac->lim.gpLimMeasReq->channelList.numChannels; i++)
     {
         if (pNode->matrix.channelNumber == chanNum)
@@ -264,12 +262,9 @@
                 break;
         }
     }
-
     return NULL;
 } /****** end limIsMatrixNodePresent() ******/
 
-
-
 /**
  * limGetMatrixNode()
  *
@@ -289,13 +284,11 @@
  * @param   pMac      Pointer to Global MAC structure
  * @return  None
  */
-
 static tpLimMeasMatrixNode
 limGetMatrixNode(tpAniSirGlobal pMac)
 {
     tpLimMeasMatrixNode       pNewMatrix;
     eHalStatus          status;
-
     pNewMatrix = limIsMatrixNodePresent(pMac);
     if (!pNewMatrix)
     {
@@ -310,7 +303,6 @@
                FL("palAllocateMemory failed for new measMatrix Node\n"));
             return NULL;
         }
-
         status = palZeroMemory( pMac->hHdd, (void *)pNewMatrix, sizeof(*pNewMatrix));
         if (status != eHAL_STATUS_SUCCESS)
         {
@@ -324,20 +316,15 @@
         pNewMatrix->matrix.channelNumber =
                                    limGetCurrentLearnChannel(pMac);
         pNewMatrix->avgRssi              = 0;
-
        PELOG3(limLog(pMac, LOG3, FL("Adding new Matrix info:channel#=%d\n"),
                pNewMatrix->matrix.channelNumber);)
-
         pNewMatrix->next = pMac->lim.gpLimMeasData->pMeasMatrixInfo;
         pMac->lim.gpLimMeasData->pMeasMatrixInfo = pNewMatrix;
         pMac->lim.gpLimMeasData->numMatrixNodes++;
     }
-
     return pNewMatrix;
 } /****** end limGetMatrixNode() ******/
 
-
-
 /**
  * limComputeAvg()
  *
@@ -358,7 +345,6 @@
  * @param   newVal    New averaged value
  * @return  None
  */
-
 tANI_U32
 limComputeAvg(tpAniSirGlobal pMac, tANI_U32 oldVal, tANI_U32 newVal)
 {
@@ -367,8 +353,6 @@
                       pMac->lim.gLimMeasParams.rssiAlpha));
 } /****** end limComputeAvg() ******/
 
-
-
 /**
  * limCollectRSSI()
  *
@@ -387,13 +371,11 @@
  * @param   pMac      Pointer to Global MAC structure
  * @return  None
  */
-
 void
 limCollectRSSI(tpAniSirGlobal pMac)
 {
     tpLimMeasMatrixNode  pNewMatrix = limGetMatrixNode(pMac);
     tANI_U32 i, noise;
-
     for (i = 0; i < LIM_GET_NOISE_MAX_TRY; i++)
         if ((noise = halGetNoise(pMac)) != HAL_NOISE_INVALID)
         {
@@ -404,17 +386,14 @@
         }
 } /****** end limCollectRSSI() ******/
 
-
 /**----------------------------------------------------------------------------
 \fn        limGetNeighbourBssNode
-
 \brief    returns neighbour bss node if it is already present in the list.
 \param pMac
 \param bssid - Bssid of new beacon or data packet.
 \param pSsId - Pointer to SSID of new packet.
 \param nwType - 11b/g/a
 \param chanId - Channel in which we received the packet.
-
 \return tpLimNeighborBssWdsNode or NULL
 -------------------------------------------------------------------------------*/
 static tpLimNeighborBssWdsNode
@@ -422,7 +401,6 @@
                                             tSirNwType nwType, tpAniSSID pSsId, tANI_U8 type)
 {
     tpLimNeighborBssWdsNode pNode = pMac->lim.gpLimMeasData->pNeighborWdsInfo;
-
     while (pNode)
     {
         //Do we need to check for ssId also ?
@@ -448,17 +426,14 @@
 #endif
                 return pNode;
         }
-
         if (!pNode->next)
             break;
         else
             pNode = pNode->next;
     }
-
     return NULL;
 }
 
-
 /**
  * limCollectMeasurementData()
  *
@@ -479,7 +454,6 @@
  * @param  pBeacon  - Pointer to parsed BSS info
  * @return None
  */
-
 void
 limCollectMeasurementData(tpAniSirGlobal pMac,
                           tANI_U32 *pRxPacketInfo, tpSchBeaconStruct pBeacon)
@@ -496,10 +470,8 @@
     tpLimMeasMatrixNode     pNewMatrix;
     eHalStatus status;
     tpSirMacMgmtHdr       pHdr;
-
    PELOG3(limLog(pMac, LOG3, FL("Collecting measurement data for RadioId %d\n"),
            pMac->sys.gSirRadioId);)
-
     tANI_U32 ignore = 0;
     limGetBssidFromBD(pMac, (tpHalBufDesc) pRxPacketInfo, bssIdRcv, &ignore);
     if (palEqualMemory( pMac->hHdd, bssIdRcv, pMac->lim.gLimBssid, sizeof(tSirMacAddr)))
@@ -509,7 +481,6 @@
     }
     pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
     fc = pHdr->fc;
-
     if (fc.type == SIR_MAC_DATA_FRAME)
     {
         PELOG2(limLog(pMac, LOG2, FL("Received DATA packet\n"));)
@@ -524,7 +495,6 @@
         chanId = limGetChannelFromBeacon(pMac, pBeacon);
         ieLen = pBeacon->wpa.length + pBeacon->propIEinfo.wdsLength;
     }
-
     if (chanId == 0)
     {
       /* If the channel Id is not retrieved from Beacon, extract the channel from BD */
@@ -536,30 +506,24 @@
            chanId = pMac->lim.gLimCurrentScanChannelId;
       }
     }
-
     /*
      * Now always returns nwType as 11G for data packets - FIXIT
      */
     nwType = limGetNwType(pMac, chanId, fc.type, pBeacon);
-
     pNewMatrix = limGetMatrixNode(pMac);
     /** LOGP would result in freeing all dynamicall allocated memories. So
       *  return from here if limGetMatrixNode returns NULL
       */
     if (!pNewMatrix)
         return;
-
     pNewMatrix->matrix.aggrRssi += WDA_GET_RX_RSSI_DB(pRxPacketInfo);
     pNewMatrix->matrix.totalPackets++;
-
     // Find if this neighbor is already 'learned'
     // If found, update its information.
     pNode = limGetNeighbourBssNode(pMac, bssIdRcv, chanId, nwType, &ssId, fc.type);
-
     if (!pNode)
     {
         realLen = sizeof(tSirNeighborBssWdsInfo);
-
         /** Newly discovered neighbor. Inform WSM of this
           * and add this BSS info at the beginning
           * Need to limit the number newly discovered BSS added
@@ -570,14 +534,12 @@
                  sizeof(tSirMeasMatrixInfo)));
        PELOG2(limLog(pMac, LOG2, FL("Current BSS length %d, Real length %d\n"),
                 pMac->lim.gpLimMeasData->totalBssSize, realLen);)
-
         /** Check if we have enough room for adding a new node.
           */
         if (pMac->lim.gpLimMeasData->totalBssSize + realLen < len)
         {
             pMac->lim.gpLimMeasData->numBssWds++;
             pMac->lim.gpLimMeasData->totalBssSize += realLen;
-
             PELOG2(limPrintMacAddr(pMac, bssIdRcv, LOG2);)
         }
         else
@@ -585,20 +547,17 @@
             PELOG2(limLog(pMac, LOG2, FL("Dropping the measurement packets: No memory!\n"));)
             return;
     }
-
         /** Allocate max memory required even if the packet is of type DATA,
           * So that next time we receive a beacon, won't run out of memory to
           * update the information.
           */
         allocLen = sizeof(tLimNeighborBssWdsNode) + 4 + ieLen;
         status = palAllocateMemory( pMac->hHdd, (void **)&pNode, allocLen);
-
     if (status != eHAL_STATUS_SUCCESS)
     {
             limLog(pMac, LOGP, FL("palAllocateMemory failed for new NeighborBssWds Node\n"));
         return;
     }
-
         status = palZeroMemory(pMac->hHdd, pNode, allocLen);
         if (status != eHAL_STATUS_SUCCESS)
         {
@@ -609,13 +568,11 @@
         pMac->lim.gpLimMeasData->pNeighborWdsInfo = pNode;
         found = eANI_BOOLEAN_FALSE;
     }
-
     pNode->info.neighborBssInfo.rssi = WDA_GET_RX_RSSI_DB(pRxPacketInfo);
     pNode->info.neighborBssInfo.aggrRssi += pNode->info.neighborBssInfo.rssi;
     if (fc.type == SIR_MAC_DATA_FRAME)
         pNode->info.neighborBssInfo.dataCount++;
     pNode->info.neighborBssInfo.totalPackets++;
-
     /** If node not found or previous learn was not from a beacon/probe rsp
       * then learn again.
       */
@@ -630,12 +587,10 @@
         // Data frame received from other BSS.
         // Collect as much information as possible
             pNode->info.neighborBssInfo.wniIndicator = (tAniBool) 0;
-
         if (fc.toDS || fc.fromDS)
                 pNode->info.neighborBssInfo.bssType = eSIR_INFRASTRUCTURE_MODE;
         else
                 pNode->info.neighborBssInfo.bssType = eSIR_IBSS_MODE;
-
             pNode->info.neighborBssInfo.load.numStas = 0;
             pNode->info.neighborBssInfo.load.channelUtilization = 0;
             pNode->info.neighborBssInfo.ssId.length = 0;
@@ -645,19 +600,6 @@
     }
     else
     {
-        //FIXME_CBMODE: need to seperate out TITAN and HT cb modes.
-        if(pBeacon->HTCaps.present)
-        {
-            limGetHtCbAdminState(pMac, pBeacon->HTCaps, 
-                        &pNode->info.neighborBssInfo.titanHtCaps);
-        
-            if( pBeacon->HTInfo.present)
-            {
-                    limGetHtCbOpState(pMac, pBeacon->HTInfo, 
-                            &pNode->info.neighborBssInfo.titanHtCaps);
-            }
-        }
-
         // This must be either Beacon frame or
         // Probe Response. Copy all relevant information.
             pNode->info.neighborBssInfo.wniIndicator = (tAniBool) pBeacon->propIEinfo.aniIndicator;
@@ -670,7 +612,6 @@
             pNode->info.neighborBssInfo.apName.length = pBeacon->propIEinfo.apName.length;
             palCopyMemory( pMac->hHdd, (tANI_U8 *) pNode->info.neighborBssInfo.apName.name,
                     pBeacon->propIEinfo.apName.name, pBeacon->propIEinfo.apName.length);
-
             pNode->info.neighborBssInfo.rsnIE.length = 0;
             // Add WPA2 information. Before that make sure that memory is available
             if (pBeacon->rsnPresent && (pBeacon->rsn.length < SIR_MAC_MAX_IE_LENGTH))
@@ -680,12 +621,10 @@
                 pNode->info.neighborBssInfo.rsnIE.rsnIEdata[1] = pBeacon->rsn.length;
                 palCopyMemory( pMac->hHdd, (tANI_U8 *) &pNode->info.neighborBssInfo.rsnIE.rsnIEdata[2],
                         pBeacon->rsn.info, pBeacon->rsn.length);
-
                PELOG2(limLog(pMac, LOG2, FL("NeighborBss RSN IE, type=%x, length=%x\n"), 
                         pNode->info.neighborBssInfo.rsnIE.rsnIEdata[0],
                         pNode->info.neighborBssInfo.rsnIE.rsnIEdata[1]);)
             }
-
             // Add WPA information. Before that make sure that memory is available
             if (pBeacon->wpaPresent && ((pBeacon->rsn.length + pBeacon->wpa.length) < (SIR_MAC_MAX_IE_LENGTH-2)))
             {
@@ -693,11 +632,9 @@
                     SIR_MAC_WPA_EID;
                 pNode->info.neighborBssInfo.rsnIE.rsnIEdata[pNode->info.neighborBssInfo.rsnIE.length + 1] =
                     pBeacon->wpa.length;
-
                 palCopyMemory( pMac->hHdd,
                         (tANI_U8 *) &pNode->info.neighborBssInfo.rsnIE.rsnIEdata[pNode->info.neighborBssInfo.rsnIE.length + 2],
                         pBeacon->wpa.info, pBeacon->wpa.length);
-
                PELOG2(limLog(pMac, LOG2, FL("NeighborBss WPA IE, type=%x, length=%x\n"),
                         pNode->info.neighborBssInfo.rsnIE.rsnIEdata[pNode->info.neighborBssInfo.rsnIE.length],
                         pNode->info.neighborBssInfo.rsnIE.rsnIEdata[pNode->info.neighborBssInfo.rsnIE.length + 1]);)
@@ -707,28 +644,23 @@
             palCopyMemory( pMac->hHdd, (tANI_U8 *) pNode->info.wdsInfo.wdsBytes,
                       pBeacon->propIEinfo.wdsData,
                       pBeacon->propIEinfo.wdsLength);
-
             pNode->info.neighborBssInfo.capabilityInfo = *((tANI_U16*)&pBeacon->capabilityInfo);
-
 #if 0
             if (pBeacon->HTCaps.present)
                 palCopyMemory( pMac->hHdd, (tANI_U8 *)&pNode->info.neighborBssInfo.HTCaps,
                         (tANI_U8 *)&pBeacon->HTCaps, HT_CAPABILITY_IE_SIZE);
         else
                 pNode->info.neighborBssInfo.HTCaps.present = 0;
-
             if (pBeacon->HTInfo.present)
                 palCopyMemory( pMac->hHdd, (tANI_U8 *)&pNode->info.neighborBssInfo.HTInfo,
                         (tANI_U8 *)&pBeacon->HTInfo, HT_INFO_IE_SIZE);
         else
                 pNode->info.neighborBssInfo.HTInfo.present = 0;
 #endif
-
             if (pBeacon->suppRatesPresent && (pBeacon->supportedRates.numRates <= 
                                               SIR_MAC_RATESET_EID_MAX))
             {
                 pNode->info.neighborBssInfo.operationalRateSet.numRates = pBeacon->supportedRates.numRates;
-
                PELOG4(limLog(pMac, LOG4, FL("Supported Rates (%d) : "),
                         pNode->info.neighborBssInfo.operationalRateSet.numRates);)
                 for (i=0; i<pBeacon->supportedRates.numRates; i++)
@@ -738,12 +670,10 @@
                 }
                 PELOG4(limLog(pMac, LOG4, FL("\n"));)
             }
-
             if (pBeacon->extendedRatesPresent && (pBeacon->extendedRates.numRates <= 
                                                   SIR_MAC_RATESET_EID_MAX))
             {
                 pNode->info.neighborBssInfo.extendedRateSet.numRates = pBeacon->extendedRates.numRates;
-
                PELOG4(limLog(pMac, LOG4, FL("Extended Rates (%d) : "),
                         pNode->info.neighborBssInfo.extendedRateSet.numRates);)
                 for (i=0; i<pBeacon->extendedRates.numRates; i++)
@@ -770,7 +700,6 @@
         }
     }
 } /****** end limCollectMeasurementData() ******/
-
 /**
  * limCleanupMatrixNodes()
  *
@@ -789,7 +718,6 @@
  * @param  pMac      Pointer to Global MAC structure
  * @return None
  */
-
 static void
 limCleanupMatrixNodes(tpAniSirGlobal pMac)
 {
@@ -797,26 +725,21 @@
     {
         tpLimMeasMatrixNode pNode = pMac->lim.gpLimMeasData->pMeasMatrixInfo;
         tpLimMeasMatrixNode pNext;
-
       while (pNode)
       {
             pNext = pNode->next;
             palFreeMemory( pMac->hHdd, pNode);
-
             if (pNext)
                 pNode = pNext;
             else
               break;
           }
       }
-
     pMac->lim.gpLimMeasData->numMatrixNodes = 0;
          PELOG2(limLog(pMac, LOG2,
            FL("Cleaned up channel matrix nodes\n"));)
-
     pMac->lim.gpLimMeasData->pMeasMatrixInfo = NULL;
 } /****** end limCleanupMatrixNodes() ******/
-
 /**
  * limCleanupNeighborBssNodes()
  *
@@ -835,7 +758,6 @@
  * @param  pMac      Pointer to Global MAC structure
  * @return None
  */
-
 static void
 limCleanupNeighborBssNodes(tpAniSirGlobal pMac)
 {
@@ -849,23 +771,19 @@
             pNext = pNode->next;
             pMac->lim.gpLimMeasData->numBssWds--;
             palFreeMemory( pMac->hHdd, pNode);
-
             if (pNext)
                 pNode = pNext;
             else
                 break;
         }
     }
-
    PELOG2(limLog(pMac, LOG2,
            FL("Cleaned up neighbor nodes\n"));)
-
     pMac->lim.gpLimMeasData->numBssWds        = 0;
     pMac->lim.gpLimMeasData->totalBssSize     = 0;
     pMac->lim.gpLimMeasData->pNeighborWdsInfo = NULL;
 } /****** end limCleanupNeighborBssNodes() ******/
 
-
 /**
  * limSendSmeMeasurementInd()
  *
@@ -882,32 +800,27 @@
  * @param  pMac - Pointer to Global MAC structure
  * @return None
  */
-
 void
 limSendSmeMeasurementInd(tpAniSirGlobal pMac)
 {
     tANI_U8          *pMeasInd;
     tANI_U16         len = 0;
     tSirMsgQ    mmhMsg;
-
 #ifdef GEN6_TODO
     //fetch the sessionEntry based on the sessionId
     //priority - MEDIUM
     tpPESession sessionEntry;
-
     if((sessionEntry = peFindSessionBySessionId(pMac, pMac->lim.gLimMeasParams.measurementIndTimer.sessionId))== NULL) 
     {
         limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
         return;
     }
 #endif
-
     if (!pMac->sys.gSysEnableLearnMode ||
         (pMac->lim.gpLimMeasReq == NULL))
     {
         return;
     }
-
     len = sizeof(tSirSmeMeasurementInd) +
           (pMac->lim.gpLimMeasReq->channelList.numChannels *
            sizeof(tSirMeasMatrixInfo)) +
@@ -921,37 +834,28 @@
                pMac->lim.gpLimMeasData->numBssWds,
                pMac->lim.gpLimMeasData->totalBssSize);
     }
-
     PELOG2(limLog(pMac, LOG2, FL("*****  Measurement IND size %d\n"), len);)
-
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pMeasInd, len))
     {
         /// Buffer not available. Log error
         limLog(pMac, LOGP,
                FL("call to palAllocateMemory failed for eWNI_SME_MEAS_IND\n"));
-
         return;
     }
-
    PELOG3(limLog(pMac, LOG3,
        FL("Sending eWNI_SME_MEAS_IND on Radio %d, requested len=%d\n"),
        pMac->sys.gSirRadioId, len);)
-
     limMeasurementIndSerDes(pMac, pMeasInd);
-
     mmhMsg.type = eWNI_SME_MEASUREMENT_IND;
     mmhMsg.bodyptr = pMeasInd;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg,  ePROT);
-
     // Cleanup neighbor information
     limCleanupNeighborBssNodes(pMac);
     limCleanupMatrixNodes(pMac);
 } /*** end limSendSmeMeasurementInd() ***/
 
-
-
 /**
  * limCleanupMeasData()
  *
@@ -972,51 +876,40 @@
  * @param  pMac      Pointer to Global MAC structure
  * @return None
  */
-
 void
 limCleanupMeasData(tpAniSirGlobal pMac)
 {
     if (pMac->lim.gpLimMeasReq)
         palFreeMemory( pMac->hHdd, pMac->lim.gpLimMeasReq);
-
     pMac->lim.gpLimMeasReq = NULL;
-
     if (!pMac->lim.gpLimMeasData)
         return;
-
     if (pMac->lim.gpLimMeasData->pMeasMatrixInfo)
     {
         // Retain current channel's data and flush remaining
         tpLimMeasMatrixNode pMatrix =
                         (pMac->lim.gpLimMeasData->pMeasMatrixInfo)->next;
         tpLimMeasMatrixNode pNext;
-
         while (pMatrix)
         {
             pNext = pMatrix->next;
             palFreeMemory( pMac->hHdd, pMatrix);
-
             if (pNext)
                 pMatrix = pNext;
             else
                 break;
         }
-
         pMac->lim.gpLimMeasData->pMeasMatrixInfo->next = NULL;
     }
-
     pMac->lim.gpLimMeasData->numMatrixNodes = 0;
    PELOG2(limLog(pMac, LOG2,
            FL("Cleaned up measurement metrics nodes\n"));)
-
     // Cleanup neighbor information
     limCleanupNeighborBssNodes(pMac);
 } /****** end limCleanupMeasData() ******/
-
 /**---------------------------------------------------------
 \fn     limStopMeasTimers
 \brief  Stops all measurement related timers.
-
 \param  pMac
 \return None
  ----------------------------------------------------------*/
@@ -1025,7 +918,6 @@
 {
     if (pMac->lim.gpLimMeasReq == NULL)
         return;
-
     if (pMac->lim.gpLimMeasReq->measControl.periodicMeasEnabled)
     {
         if (tx_timer_deactivate(&pMac->lim.gLimMeasParams.measurementIndTimer) != TX_SUCCESS)
@@ -1034,28 +926,25 @@
         }
     }
     pMac->lim.gLimMeasParams.isMeasIndTimerActive = 0;
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_LEARN_INTERVAL_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, NO_SESSION, eLIM_LEARN_INTERVAL_TIMER));
     if (tx_timer_deactivate(&pMac->lim.gLimMeasParams.learnIntervalTimer) != TX_SUCCESS)
     {
         PELOGE(limLog(pMac, LOGE, FL("Cannot stop learn interval timer\n"));)
     }
-
     if (pMac->lim.gLimSpecMgmt.fQuietEnabled)
     {
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_LEARN_DURATION_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, NO_SESSION, eLIM_LEARN_DURATION_TIMER));
         if (tx_timer_deactivate(&pMac->lim.gLimMeasParams.learnDurationTimer) != TX_SUCCESS)
         {
             PELOGE(limLog(pMac, LOGE, FL("Cannot stop learn duration timer\n"));)
         }
     }
-
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_LEARN_DURATION_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, NO_SESSION, eLIM_LEARN_DURATION_TIMER));
     if (tx_timer_deactivate(&pMac->lim.gLimMeasParams.learnDurationTimer) != TX_SUCCESS)
     {
         PELOGE(limLog(pMac, LOGE, FL("Cannot stop learn duration timer\n"));)
     }
 }
-
 /**
  * limDeleteMeasTimers()
  *
@@ -1073,7 +962,6 @@
  * @param  pMac      Pointer to Global MAC structure
  * @return None
  */
-
 void
 limDeleteMeasTimers(tpAniSirGlobal pMac)
 {
@@ -1083,8 +971,6 @@
     tx_timer_delete(&pMac->lim.gLimMeasParams.learnDurationTimer);
 } /*** end limDeleteMeasTimers() ***/
 
-
-
 /**
  * limCleanupMeasResources()
  *
@@ -1105,30 +991,24 @@
  * @param  pMac      Pointer to Global MAC structure
  * @return None
  */
-
 void
 limCleanupMeasResources(tpAniSirGlobal pMac)
 {
    PELOG1( limLog(pMac, LOG1,
            FL("Cleaning up Learn mode Measurement resources\n"));)
-
     if (pMac->lim.gpLimMeasReq == NULL)
         return;
-
     limDeleteMeasTimers(pMac);
-
     if (pMac->lim.gpLimMeasData)
     {
         limCleanupMeasData(pMac);
         if (pMac->lim.gpLimMeasData->pMeasMatrixInfo)
             palFreeMemory( pMac->hHdd, pMac->lim.gpLimMeasData->pMeasMatrixInfo);
-
         palFreeMemory( pMac->hHdd, pMac->lim.gpLimMeasData);
         pMac->lim.gpLimMeasData = NULL;
     }
 } /****** end limCleanupMeasResources() ******/
 
-
 /**
  * limDeleteCurrentBssWdsNode()
  *
@@ -1152,7 +1032,6 @@
 {
     tANI_U32                 cfg = sizeof(tSirMacAddr);
     tSirMacAddr         currentBssId;
-
 #if 0
     if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
                                 eSIR_SUCCESS)
@@ -1162,10 +1041,8 @@
     }
 #endif //TO SUPPORT BT-AMP
     sirCopyMacAddr(currentBssId,sessionEntry->bssId);
-
     if (!pMac->lim.gpLimMeasData)
         return;
-
     if (pMac->lim.gpLimMeasData->pNeighborWdsInfo)
     {
         tpLimNeighborBssWdsNode pNode =
@@ -1183,20 +1060,16 @@
                 break;
             }
             pPrev = pNode;
-
             if (pNode->next)
                 pNode = pNode->next;
             else
                 break;
         }
-
         if (!pMac->lim.gpLimMeasData->numBssWds)
             pMac->lim.gpLimMeasData->pNeighborWdsInfo = NULL;
     }
 } /****** end limDeleteCurrentBssWdsNode() ******/
 
-
-
 /**
  * limRestorePreLearnState()
  *
@@ -1215,61 +1088,23 @@
  * @param  pMac      Pointer to Global MAC structure
  * @return None
  */
-
 void
 limRestorePreLearnState(tpAniSirGlobal pMac)
 {
    PELOG4(limLog(pMac, LOG4,
            FL("Restoring from Learn mode on RadioId %d\n"),
            pMac->sys.gSirRadioId);)
-
     pMac->lim.gLimSystemInScanLearnMode = 0;
-
     // Go back to previous state.
     pMac->lim.gLimSmeState = pMac->lim.gLimPrevSmeState;
     pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
-    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, 0, pMac->lim.gLimSmeState));
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
-
+    MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
    PELOG4(limLog(pMac, LOG4,
            FL("Restored from Learn mode on RadioId %d\n"),
            pMac->sys.gSirRadioId);)
 } /****** end limRestorePreLearnState() ******/
-
 #endif //#if (defined(ANI_PRODUCT_TYPE_AP) || (ANI_PRODUCT_TYPE_AP_SDK))
-
-/**
- * limGetPhyCBState
- *
- *FUNCTION:
- * Based on the current state of LIM, this routine determines
- * the correct PHY enumeration "ePhyChanBondState" to use
- *
- *LOGIC:
- * Is it possible to have a common enumeration?
- *
- *ASSUMPTIONS:
- *
- *NOTE:
- *
- * @param  pMac - Pointer to Global MAC structure
- * @return The corresponding PHY enumeration ePhyChanBondState
- */
-ePhyChanBondState limGetPhyCBState( tpAniSirGlobal pMac )
-{
-    ePhyChanBondState cbState = PHY_SINGLE_CHANNEL_CENTERED;
-
-    if( GET_CB_OPER_STATE( pMac->lim.gCbState ))
-    {
-      if( GET_CB_SEC_CHANNEL( pMac->lim.gCbState ))
-        cbState = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
-      else
-        cbState = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
-    }
-  return cbState;
-}
-
-
 /**
  * limGetHTCBState
  *
@@ -1284,45 +1119,34 @@
  * @param  pMac - Pointer to Global MAC structure
  * @return The corresponding HT enumeration
  */
-
-tSirMacHTSecondaryChannelOffset    limGetHTCBState(tAniCBSecondaryMode aniCBMode) 
+ePhyChanBondState  limGetHTCBState(ePhyChanBondState aniCBMode) 
 {
-    if(aniCBMode == eANI_CB_SECONDARY_DOWN)
-        return eHT_SECONDARY_CHANNEL_OFFSET_DOWN;
-    else if(aniCBMode == eANI_CB_SECONDARY_UP)
-        return eHT_SECONDARY_CHANNEL_OFFSET_UP;
-    else
-        return eHT_SECONDARY_CHANNEL_OFFSET_NONE;
+    switch ( aniCBMode )
+    {
+#ifdef WLAN_FEATURE_11AC
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
+#endif
+        case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
+        return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+#ifdef WLAN_FEATURE_11AC
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
+#endif
+        case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
+        return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
+#ifdef WLAN_FEATURE_11AC
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
+           return PHY_SINGLE_CHANNEL_CENTERED;
+#endif
+        default :
+           return PHY_SINGLE_CHANNEL_CENTERED;
+     }
 }
 
-
-/**
- * limGetAniCBState
- *
- *FUNCTION:
- * This routing provides the translation of HT Enum to Airgo enum for determining 
- * secondary channel offset.
- * Airgo Enum is required for backward compatibility purposes.
- *
- *
- *NOTE:
- *
- * @param  pMac - Pointer to Global MAC structure
- * @return The corresponding ANI enumeration
- */
-
-tAniCBSecondaryMode     limGetAniCBState( tSirMacHTSecondaryChannelOffset htCBMode) 
-{
-    if(eHT_SECONDARY_CHANNEL_OFFSET_DOWN == htCBMode)
-        return eANI_CB_SECONDARY_DOWN;
-    else if(eHT_SECONDARY_CHANNEL_OFFSET_UP == htCBMode)
-        return eANI_CB_SECONDARY_UP;
-    else
-        return eANI_CB_SECONDARY_NONE;
-}
-
-
-/**
+ /*
  * limGetStaPeerType
  *
  *FUNCTION:
@@ -1347,7 +1171,6 @@
     tpPESession   psessionEntry)
 {
 tStaRateMode staPeerType = eSTA_11b;
-
   // Determine the peer-STA type
   if( pStaDs->aniPeer )
   {
@@ -1358,118 +1181,16 @@
     else
         staPeerType = eSTA_POLARIS;
   }
+#ifdef WLAN_FEATURE_11AC
+  else if(pStaDs->mlmStaContext.vhtCapability)
+      staPeerType = eSTA_11ac;
+#endif
   else if(pStaDs->mlmStaContext.htCapability)
         staPeerType = eSTA_11n;
   else if(pStaDs->erpEnabled)
         staPeerType = eSTA_11bg;
   else if(psessionEntry->limRFBand == SIR_BAND_5_GHZ)
         staPeerType = eSTA_11a;
-
   return staPeerType;
 }
 
-/**
- * setupCBState()
- *
- *FUNCTION:
- * This function is called during eWNI_SME_START_BSS_REQ.
- * Based on the configured Channel Bonding mode, the
- * appropriate Channel Bonding state is setup in the global
- * LIM object - gCbState. This will then be subsequently used
- * in the proprietary IE field
- *
- *LOGIC:
- *
- *ASSUMPTIONS:
- *
- *NOTE:
- *
- * @param  pMac   Pointer to Global MAC structure
- * @param  cbMode The CB mode as set by SME (WSM)
- * @return None
- */
-void setupCBState( tpAniSirGlobal pMac,
-    tAniCBSecondaryMode cbMode )
-{
-
-  switch( cbMode )
-  {
-    case eANI_CB_SECONDARY_DOWN:
-      SET_CB_OPER_STATE( pMac->lim.gCbState, eHAL_SET );
-      SET_CB_SEC_CHANNEL( pMac->lim.gCbState, eHAL_CLEAR );
-      if (cfgSetInt(pMac, WNI_CFG_CB_SECONDARY_CHANNEL_STATE, WNI_CFG_CB_SECONDARY_CHANNEL_STATE_LOWER) != eSIR_SUCCESS)
-          limLog(pMac, LOGP, FL("cfgSetInt WNI_CFG_CB_SECONDARY_CHANNEL_STATE failed \n"));
-      // AU state is set via CFG
-      break;
-
-    case eANI_CB_SECONDARY_UP:
-      SET_CB_OPER_STATE( pMac->lim.gCbState, eHAL_SET );
-      SET_CB_SEC_CHANNEL( pMac->lim.gCbState, eHAL_SET );
-      if (cfgSetInt(pMac, WNI_CFG_CB_SECONDARY_CHANNEL_STATE, WNI_CFG_CB_SECONDARY_CHANNEL_STATE_HIGHER) != eSIR_SUCCESS)
-          limLog(pMac, LOGP, FL("cfgSetInt WNI_CFG_CB_SECONDARY_CHANNEL_STATE failed \n"));
-      // AU state is set via CFG
-      break;
-
-    case eANI_CB_SECONDARY_NONE:
-      if (cfgSetInt(pMac, WNI_CFG_CB_SECONDARY_CHANNEL_STATE, WNI_CFG_CB_SECONDARY_CHANNEL_STATE_NONE) != eSIR_SUCCESS)
-          limLog(pMac, LOGP, FL("cfgSetInt WNI_CFG_CB_SECONDARY_CHANNEL_STATE failed \n"));
-
-    default:
-      SET_CB_OPER_STATE( pMac->lim.gCbState, eHAL_CLEAR );
-      break;
-  }
-
-
-
-  limLog( pMac, LOG2,
-      FL("New CB State: 0x%1x for Mode %d\n"),
-      pMac->lim.gCbState,
-      cbMode );
-}
-
-/**
- * limGetCurrentCBSecChannel()
- *
- *FUNCTION:
- * This function is called to determine the current
- * "secondary" channel when Channel Bonding is enabled
- *
- *PARAMS:
- *
- *LOGIC:
- *
- *ASSUMPTIONS:
- * NA
- *
- *NOTE:
- * NA
- *
- * @param  pMac      Pointer to Global MAC structure
- * @return Channel number
- */
-tANI_U8 limGetCurrentCBSecChannel( tpAniSirGlobal pMac,tpPESession psessionEntry)
-{
-tANI_U8 chanNum;
-
-  //
-  // FIXME - This is a HACK!!
-  // Need to have a clean way of determining the current
-  // CB secondary channel!!
-  //
-  chanNum = psessionEntry->currentOperChannel;
-  if( GET_CB_OPER_STATE( pMac->lim.gCbState ))
-  {
-    if( GET_CB_SEC_CHANNEL( pMac->lim.gCbState ))
-      chanNum += 4;
-    else
-      chanNum -= 4;
-  }
-
-  limLog( pMac, LOG4,
-      FL("Returning CB Sec Channel %1d\n"),
-      chanNum );
-
-  return chanNum;
-}
-
-
diff --git a/CORE/MAC/src/pe/lim/limPropExtsUtils.h b/CORE/MAC/src/pe/lim/limPropExtsUtils.h
index 17f2da2..4294424 100644
--- a/CORE/MAC/src/pe/lim/limPropExtsUtils.h
+++ b/CORE/MAC/src/pe/lim/limPropExtsUtils.h
@@ -63,11 +63,11 @@
 // Determine if a newly discovered BSS is TITAN-compatible
 void handleNonTitanBss( tpAniSirGlobal, tSirNeighborBssWdsInfo );
 #endif
-ePhyChanBondState limGetPhyCBState( tpAniSirGlobal );
 tStaRateMode limGetStaPeerType( tpAniSirGlobal, tpDphHashNode ,tpPESession);
-void setupCBState( tpAniSirGlobal, tAniCBSecondaryMode );
+#ifdef WLAN_FEATURE_11AC
+ePhyChanBondState  limGetHTCBState(ePhyChanBondState aniCBMode) ;
+#endif
 
-tANI_U8 limGetCurrentCBSecChannel( tpAniSirGlobal,tpPESession );
 
 #endif /* __LIM_PROP_EXTS_UTILS_H */
 
diff --git a/CORE/MAC/src/pe/lim/limScanResultUtils.c b/CORE/MAC/src/pe/lim/limScanResultUtils.c
index a866152..ee76b57 100644
--- a/CORE/MAC/src/pe/lim/limScanResultUtils.c
+++ b/CORE/MAC/src/pe/lim/limScanResultUtils.c
@@ -75,7 +75,7 @@
             */
         
         limDeactivateAndChangeTimer(pMac,eLIM_MIN_CHANNEL_TIMER);
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_MAX_CHANNEL_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_MAX_CHANNEL_TIMER));
         if (tx_timer_activate(&pMac->lim.limTimers.gLimMaxChannelTimer)
                                           == TX_TIMER_ERROR)
         {
@@ -196,33 +196,6 @@
    }
 
     pBssDescr->channelIdSelf = rxChannel;
-    pBssDescr->titanHtCaps = 0;
-
-    //FIXME_CBMODE : need to seperate out TITAN and HT CB mode.
-    //HT neighbor with channel bonding
-    if( pBPR->HTCaps.present  )
-    {
-        tAniTitanHtCapabilityInfo titanHtCaps = 0;
-        limGetHtCbAdminState(pMac, pBPR->HTCaps, &titanHtCaps);
-        if( pBPR->HTInfo.present &&
-          pBPR->HTInfo.secondaryChannelOffset )
-        {
-
-            limGetHtCbOpState( pMac,
-                pBPR->HTInfo,
-                &titanHtCaps );
-        }
-        pBssDescr->titanHtCaps = (tANI_U32) titanHtCaps;
-    }
-
-    // Is this is a TITAN neighbor?
-    else if( pBPR->propIEinfo.aniIndicator &&
-        pBPR->propIEinfo.titanPresent )
-    {
-    tAniTitanHtCapabilityInfo titanHtCaps = 0;
-      pBssDescr->titanHtCaps = (tANI_U32) titanHtCaps;
-    }
-
     //set the network type in bss description
     channelNum = pBssDescr->channelId;
     pBssDescr->nwType = limGetNwType(pMac, channelNum, SIR_MAC_MGMT_FRAME, pBPR);
@@ -665,18 +638,20 @@
 
     for (pprev = ptemp; ptemp; pprev = ptemp, ptemp = ptemp->next)
     {
-        //For infrastructure, only check BSSID. For IBSS, check more
+        //For infrastructure, check BSSID and SSID. For IBSS, check more
         pSirCapTemp = (tSirMacCapabilityInfo *)&ptemp->bssDescription.capabilityInfo;
         if((pSirCapTemp->ess == pSirCap->ess) && //matching ESS type first
             (palEqualMemory( pMac->hHdd,(tANI_U8 *) pBssDescr->bssDescription.bssId,
                       (tANI_U8 *) ptemp->bssDescription.bssId,
                       sizeof(tSirMacAddr))) &&   //matching BSSID
-            ((pSirCapTemp->ess) ||    //we are done for infrastructure
-            //For IBSS, matching SSID, nwType and channelId
-            ((palEqualMemory( pMac->hHdd,((tANI_U8 *) &pBssDescr->bssDescription.ieFields + 1),
+            (pBssDescr->bssDescription.channelId ==
+                                      ptemp->bssDescription.channelId) &&
+            palEqualMemory( pMac->hHdd,((tANI_U8 *) &pBssDescr->bssDescription.ieFields + 1),
                            ((tANI_U8 *) &ptemp->bssDescription.ieFields + 1),
                            (tANI_U8) (ssidLen + 1)) &&
-            (pBssDescr->bssDescription.nwType ==
+            ((pSirCapTemp->ess) || //we are done for infrastructure
+            //For IBSS, nwType and channelId
+            (((pBssDescr->bssDescription.nwType ==
                                          ptemp->bssDescription.nwType) &&
             (pBssDescr->bssDescription.channelId ==
                                       ptemp->bssDescription.channelId))))
diff --git a/CORE/MAC/src/pe/lim/limSecurityUtils.c b/CORE/MAC/src/pe/lim/limSecurityUtils.c
index d1c774f..d7385ed 100644
--- a/CORE/MAC/src/pe/lim/limSecurityUtils.c
+++ b/CORE/MAC/src/pe/lim/limSecurityUtils.c
@@ -375,7 +375,7 @@
 limReleasePreAuthNode(tpAniSirGlobal pMac, tpLimPreAuthNode pAuthNode)
 {
     pAuthNode->fFree = 1;
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_PRE_AUTH_CLEANUP_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, NO_SESSION, eLIM_PRE_AUTH_CLEANUP_TIMER));
     tx_timer_deactivate(&pAuthNode->timer);                
     pMac->lim.gLimNumPreAuthContexts--;
 } /*** end limReleasePreAuthNode() ***/
@@ -642,7 +642,7 @@
 
     sessionEntry->limMlmState = sessionEntry->limPrevMlmState;
     
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, sessionEntry->peSessionId, sessionEntry->limMlmState));
 
 
     // 'Change' timer for future activations
@@ -1000,6 +1000,7 @@
  * A utility API to send MLM_REMOVEKEY_CNF to SME
  */
 void limPostSmeRemoveKeyCnf( tpAniSirGlobal pMac,
+    tpPESession psessionEntry,
     tLimMlmRemoveKeyReq *pMlmRemoveKeyReq,
     tLimMlmRemoveKeyCnf *mlmRemoveKeyCnf)
 {
@@ -1012,8 +1013,8 @@
   palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmRemoveKeyReq );
   pMac->lim.gpLimMlmRemoveKeyReq = NULL;
 
-  pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState; //Restore the state.
-  MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+  psessionEntry->limMlmState = psessionEntry->limPrevMlmState; //Restore the state.
+  MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
   limPostSmeMessage( pMac,
       LIM_MLM_REMOVEKEY_CNF,
@@ -1081,7 +1082,7 @@
   // Update the WDA_SET_BSSKEY_REQ parameters
   pSetBssKeyParams->bssIdx = psessionEntry->bssIdx;
   pSetBssKeyParams->encType = pMlmSetKeysReq->edType;
-  pSetBssKeyParams->numKeys = pMlmSetKeysReq->numKeys;
+
 
   if(eSIR_SUCCESS != wlan_cfgGetInt(pMac, WNI_CFG_SINGLE_TID_RC, &val))
   {
@@ -1093,10 +1094,27 @@
   /* Update PE session Id*/
   pSetBssKeyParams->sessionId = psessionEntry ->peSessionId;
 
-  palCopyMemory( pMac->hHdd,
+  if(pMlmSetKeysReq->key[0].keyId && 
+     ((pMlmSetKeysReq->edType == eSIR_ED_WEP40) || 
+      (pMlmSetKeysReq->edType == eSIR_ED_WEP104))
+    )
+  {
+    /* IF the key id is non-zero and encryption type is WEP, Send all the 4 
+     * keys to HAL with filling the key at right index in pSetBssKeyParams->key. */
+    pSetBssKeyParams->numKeys = SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
+    palCopyMemory( pMac->hHdd,
+      (tANI_U8 *) &pSetBssKeyParams->key[pMlmSetKeysReq->key[0].keyId],
+      (tANI_U8 *) &pMlmSetKeysReq->key[0], sizeof(pMlmSetKeysReq->key[0]));
+
+  }
+  else
+  {
+    pSetBssKeyParams->numKeys = pMlmSetKeysReq->numKeys;
+    palCopyMemory( pMac->hHdd,
       (tANI_U8 *) &pSetBssKeyParams->key,
       (tANI_U8 *) &pMlmSetKeysReq->key,
       sizeof( tSirKeys ) * pMlmSetKeysReq->numKeys );
+  }
 
   SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
   msgQ.type = WDA_SET_BSSKEY_REQ;
@@ -1111,7 +1129,7 @@
 
   limLog( pMac, LOGW,
       FL( "Sending WDA_SET_BSSKEY_REQ...\n" ));
-  MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+  MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
   if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
   {
     limLog( pMac, LOGE,
@@ -1208,7 +1226,7 @@
       sessionEntry->limMlmState = eLIM_MLM_WT_SET_STA_KEY_STATE;
       msgQ.type = WDA_SET_STAKEY_REQ;
   }
-  MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+  MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, sessionEntry->peSessionId, sessionEntry->limMlmState));
 
   /**
    * In the Case of WEP_DYNAMIC, ED_TKIP and ED_CCMP
@@ -1232,12 +1250,14 @@
 #endif
           pSetStaKeyParams->wepType = eSIR_WEP_STATIC;
           sessionEntry->limMlmState = eLIM_MLM_WT_SET_STA_KEY_STATE;
-          MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+          MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, sessionEntry->peSessionId, sessionEntry->limMlmState));
       }else {
-          pSetStaKeyParams->wepType = eSIR_WEP_DYNAMIC;
+          /*This case the keys are coming from upper layer so need to fill the 
+          * key at the default wep key index and send to the HAL */
           palCopyMemory( pMac->hHdd,
-                         (tANI_U8 *) &pSetStaKeyParams->key,
-                         (tANI_U8 *) &pMlmSetKeysReq->key[0], sizeof( tSirKeys ));
+                             (tANI_U8 *) &pSetStaKeyParams->key[defWEPIdx],
+                             (tANI_U8 *) &pMlmSetKeysReq->key[0], sizeof( pMlmSetKeysReq->key[0] ));
+          pMlmSetKeysReq->numKeys = SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
       }
       break;
   case eSIR_ED_TKIP:
@@ -1265,7 +1285,7 @@
   msgQ.bodyval = 0;
 
   limLog( pMac, LOG1, FL( "Sending WDA_SET_STAKEY_REQ...\n" ));
-  MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+  MTRACE(macTraceMsgTx(pMac, sessionEntry->peSessionId, msgQ.type));
   if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ ))) {
       limLog( pMac, LOGE, FL("Posting SET_STAKEY to HAL failed, reason=%X\n"), retCode );
       // Respond to SME with LIM_MLM_SETKEYS_CNF
@@ -1345,7 +1365,7 @@
 
   limLog( pMac, LOGW,
       FL( "Sending WDA_REMOVE_BSSKEY_REQ...\n" ));
-  MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+  MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
   if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
   {
@@ -1361,6 +1381,7 @@
 
 end:
   limPostSmeRemoveKeyCnf( pMac,
+      psessionEntry,
       pMlmRemoveKeyReq,
       &mlmRemoveKeysCnf );
 
@@ -1390,7 +1411,7 @@
 void limSendRemoveStaKeyReq( tpAniSirGlobal pMac,
     tLimMlmRemoveKeyReq *pMlmRemoveKeyReq,
     tANI_U16 staIdx ,
-    tpPESession sessionEntry)
+    tpPESession psessionEntry)
 {
 tSirMsgQ           msgQ;
 tpRemoveStaKeyParams  pRemoveStaKeyParams = NULL;
@@ -1430,7 +1451,7 @@
   pRemoveStaKeyParams->unicast = pMlmRemoveKeyReq->unicast;
 
   /* Update PE session ID*/
-  pRemoveStaKeyParams->sessionId = sessionEntry->peSessionId;
+  pRemoveStaKeyParams->sessionId = psessionEntry->peSessionId;
 
   SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
   
@@ -1446,7 +1467,7 @@
 
   limLog( pMac, LOGW,
       FL( "Sending WDA_REMOVE_STAKEY_REQ...\n" ));
-  MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+  MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
   if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
   {
     limLog( pMac, LOGE,
@@ -1461,6 +1482,7 @@
 
 end:
   limPostSmeRemoveKeyCnf( pMac,
+      psessionEntry,
       pMlmRemoveKeyReq,
       &mlmRemoveKeyCnf );
 
diff --git a/CORE/MAC/src/pe/lim/limSecurityUtils.h b/CORE/MAC/src/pe/lim/limSecurityUtils.h
index 2479f14..da1e908 100644
--- a/CORE/MAC/src/pe/lim/limSecurityUtils.h
+++ b/CORE/MAC/src/pe/lim/limSecurityUtils.h
@@ -68,7 +68,7 @@
 
 void limSendRemoveBssKeyReq(tpAniSirGlobal pMac, tLimMlmRemoveKeyReq * pMlmRemoveKeyReq,tpPESession);
 void limSendRemoveStaKeyReq(tpAniSirGlobal pMac, tLimMlmRemoveKeyReq * pMlmRemoveKeyReq, tANI_U16 staIdx,tpPESession);
-void limPostSmeRemoveKeyCnf(tpAniSirGlobal pMac, tLimMlmRemoveKeyReq * pMlmRemoveKeyReq, tLimMlmRemoveKeyCnf * mlmRemoveKeyCnf);
+void limPostSmeRemoveKeyCnf(tpAniSirGlobal pMac, tpPESession psessionEntry, tLimMlmRemoveKeyReq * pMlmRemoveKeyReq, tLimMlmRemoveKeyCnf * mlmRemoveKeyCnf);
 
 #define  PTAPS  0xedb88320
 
diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
index 131ff49..4c50af6 100644
--- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c
+++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
@@ -240,7 +240,16 @@
     {
         p2pIe = limGetP2pIEPtr(pMac, pAdditionalIE, nAdditionalIELen);
     }
-    if( p2pIe != NULL)
+    /* Don't include 11b rate only when device is doing P2P Search */
+    if( ( WNI_CFG_DOT11_MODE_11B != dot11mode ) && 
+        ( p2pIe != NULL ) && 
+    /* Don't include 11b rate if it is a P2P serach or probe request is sent by P2P Client */
+        ( ( ( pMac->lim.gpLimMlmScanReq != NULL ) &&
+              pMac->lim.gpLimMlmScanReq->p2pSearch ) || 
+          ( ( psessionEntry != NULL ) && 
+            ( VOS_P2P_CLIENT_MODE == psessionEntry->pePersona ) )
+         )
+      )
     {
         /* In the below API pass channel number > 14, do that it fills only
          * 11a rates in supported rates */
@@ -272,21 +281,38 @@
        PopulateDot11fWFATPC( pMac, &pr.WFATPC, txPower, 0 );
     }
 #endif
-    pMac->lim.htCapability = IS_DOT11_MODE_HT(dot11mode);
 
     if (psessionEntry != NULL ) {
-       psessionEntry->htCapabality = IS_DOT11_MODE_HT(dot11mode);
+       psessionEntry->htCapability = IS_DOT11_MODE_HT(dot11mode);
        //Include HT Capability IE
-       if (psessionEntry->htCapabality)
+       if (psessionEntry->htCapability)
        {
-           PopulateDot11fHTCaps( pMac, &pr.HTCaps );
+           PopulateDot11fHTCaps( pMac, psessionEntry, &pr.HTCaps );
        }
-    } else {
-           if (pMac->lim.htCapability)
+    } else { //psessionEntry == NULL
+           if (IS_DOT11_MODE_HT(dot11mode))
            {
-               PopulateDot11fHTCaps( pMac, &pr.HTCaps );
+               PopulateDot11fHTCaps( pMac, psessionEntry, &pr.HTCaps );
            }
     }
+#ifdef WLAN_FEATURE_11AC
+    if (psessionEntry != NULL ) {
+       psessionEntry->vhtCapability = IS_DOT11_MODE_VHT(dot11mode);
+       //Include HT Capability IE
+       if (psessionEntry->vhtCapability)
+       {
+          limLog( pMac, LOGW, FL("Populate VHT IEs in Probe Request\n"));
+          PopulateDot11fVHTCaps( pMac, &pr.VHTCaps );
+       }
+    }  else {
+       if (IS_DOT11_MODE_VHT(dot11mode))
+       {
+          limLog( pMac, LOGW, FL("Populate VHT IEs in Probe Request\n"));
+          PopulateDot11fVHTCaps( pMac, &pr.VHTCaps );
+       }
+    }
+#endif
+
 
     // That's it-- now we pack it.  First, how much space are we going to
     // need?
@@ -566,7 +592,7 @@
     PopulateDot11fEDCAParamSet( pMac, &frm.EDCAParamSet, psessionEntry);
 
 #ifdef ANI_PRODUCT_TYPE_AP
-    if( pMac->lim.gLim11hEnable )
+    if( pSessionEntry->lim11hEnable )
     {
         PopulateDot11fPowerConstraints( pMac, &frm.PowerConstraints );
         PopulateDot11fTPCReport( pMac, &frm.TPCReport, psessionEntry);
@@ -580,8 +606,8 @@
                pMac->lim.gLimChannelSwitch.state ==
                eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY ) )
         {
-            PopulateDot11fChanSwitchAnn( pMac, &frm.ChanSwitchAnn );
-            PopulateDot11fExtChanSwitchAnn(pMac, &frm.ExtChanSwitchAnn);
+            PopulateDot11fChanSwitchAnn( pMac, &frm.ChanSwitchAnn, psessionEntry );
+            PopulateDot11fExtChanSwitchAnn(pMac, &frm.ExtChanSwitchAnn, psessionEntry );
         }
     }
 #endif
@@ -596,15 +622,25 @@
                                 &frm.ExtSuppRates, psessionEntry );
 
     //Populate HT IEs, when operating in 11n or Taurus modes.
-    if ( psessionEntry->htCapabality )
+    if ( psessionEntry->htCapability )
     {
-        PopulateDot11fHTCaps( pMac, &frm.HTCaps );
+        PopulateDot11fHTCaps( pMac, psessionEntry, &frm.HTCaps );
 #ifdef WLAN_SOFTAP_FEATURE
         PopulateDot11fHTInfo( pMac, &frm.HTInfo, psessionEntry );
 #else
         PopulateDot11fHTInfo( pMac, &frm.HTInfo );
 #endif
     }
+#ifdef WLAN_FEATURE_11AC
+    if(psessionEntry->vhtCapability)
+    {
+        limLog( pMac, LOGW, FL("Populate VHT IE in Probe Response\n"));
+        PopulateDot11fVHTCaps( pMac, &frm.VHTCaps );
+        PopulateDot11fVHTOperation( pMac, &frm.VHTOperation );
+        // we do not support multi users yet
+        //PopulateDot11fVHTExtBssLoad( pMac, &frm.VHTExtBssLoad );
+    }
+#endif
 
     if ( psessionEntry->pLimStartBssReq ) 
     {
@@ -1252,10 +1288,10 @@
         } // End if on Airgo peer.
 
         if ( pSta->mlmStaContext.htCapability  && 
-             pMac->lim.htCapability )
+             psessionEntry->htCapability )
         {
-            PopulateDot11fHTCaps( pMac, &frm.HTCaps );
-            PopulateDot11fHTInfo( pMac, &frm.HTInfo );
+            PopulateDot11fHTCaps( pMac, psessionEntry, &frm.HTCaps );
+            PopulateDot11fHTInfo( pMac, &frm.HTInfo, psessionEntry);
         }
     } // End if on non-NULL 'pSta'.
 
@@ -1524,15 +1560,26 @@
         } // End if on Airgo peer.
 
         if ( pSta->mlmStaContext.htCapability  && 
-             psessionEntry->htCapabality )
+             psessionEntry->htCapability )
         {
-            PopulateDot11fHTCaps( pMac, &frm.HTCaps );
+            PopulateDot11fHTCaps( pMac, psessionEntry, &frm.HTCaps );
 #ifdef WLAN_SOFTAP_FEATURE
             PopulateDot11fHTInfo( pMac, &frm.HTInfo, psessionEntry );
 #else
             PopulateDot11fHTInfo( pMac, &frm.HTInfo );
 #endif
         }
+
+#ifdef WLAN_FEATURE_11AC
+        if( pSta->mlmStaContext.vhtCapability && 
+            psessionEntry->vhtCapability )
+        {
+            limLog( pMac, LOGW, FL("Populate VHT IEs in Assoc Response\n"));
+            PopulateDot11fVHTCaps( pMac, &frm.VHTCaps );
+            PopulateDot11fVHTOperation( pMac, &frm.VHTOperation);
+        }
+#endif
+
     } // End if on non-NULL 'pSta'.
 
 
@@ -2341,10 +2388,10 @@
 
     //Populate HT IEs, when operating in 11n or Taurus modes AND
     //when AP is also operating in 11n mode.
-    if ( psessionEntry->htCapabality &&
+    if ( psessionEntry->htCapability &&
             pMac->lim.htCapabilityPresentInBeacon)
     {
-        PopulateDot11fHTCaps( pMac, &frm.HTCaps );
+        PopulateDot11fHTCaps( pMac, psessionEntry, &frm.HTCaps );
 #ifdef DISABLE_GF_FOR_INTEROP
 
         /*
@@ -2362,6 +2409,15 @@
 #endif
 
     }
+#ifdef WLAN_FEATURE_11AC
+    if ( psessionEntry->vhtCapability &&
+        pMac->lim.vhtCapabilityPresentInBeacon)
+    {
+        limLog( pMac, LOGW, FL("Populate VHT IEs in Assoc Request\n"));
+        PopulateDot11fVHTCaps( pMac, &frm.VHTCaps );
+    }
+#endif
+
 
 #if defined WLAN_FEATURE_VOWIFI_11R
     if (psessionEntry->pLimJoinReq->is11Rconnection)
@@ -2417,7 +2473,7 @@
                     "sociation Request.\n"), nBytes );
 
         psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
 
         /* Update PE session id*/
@@ -2761,10 +2817,10 @@
 #endif    
     }
 
-    if ( psessionEntry->htCapabality &&
+    if ( psessionEntry->htCapability &&
             pMac->lim.htCapabilityPresentInBeacon)
     {
-        PopulateDot11fHTCaps( pMac, &frm.HTCaps );
+        PopulateDot11fHTCaps( pMac, psessionEntry, &frm.HTCaps );
     }
 
     nStatus = dot11fGetPackedReAssocRequestSize( pMac, &frm, &nPayload );
@@ -2803,7 +2859,7 @@
     if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
     {
         psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
         limLog( pMac, LOGP, FL("Failed to allocate %d bytes for a Re-As"
                     "sociation Request.\n"), nBytes );
         goto end;
@@ -3089,11 +3145,19 @@
         }
     }
 
-    if ( psessionEntry->htCapabality &&
+    if ( psessionEntry->htCapability &&
           pMac->lim.htCapabilityPresentInBeacon)
     {
-        PopulateDot11fHTCaps( pMac, &frm.HTCaps );
+        PopulateDot11fHTCaps( pMac, psessionEntry, &frm.HTCaps );
     }
+#ifdef WLAN_FEATURE_11AC
+    if ( psessionEntry->vhtCapability &&
+             pMac->lim.vhtCapabilityPresentInBeacon)
+    {
+        limLog( pMac, LOGW, FL("Populate VHT IEs in Re-Assoc Request\n"));
+        PopulateDot11fVHTCaps( pMac, &frm.VHTCaps );
+    }
+#endif
 
     nStatus = dot11fGetPackedReAssocRequestSize( pMac, &frm, &nPayload );
     if ( DOT11F_FAILED( nStatus ) )
@@ -3119,7 +3183,7 @@
     if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
     {
         psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
-        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+        MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
         limLog( pMac, LOGP, FL("Failed to allocate %d bytes for a Re-As"
                                "sociation Request.\n"), nBytes );
         goto end;
@@ -3479,6 +3543,10 @@
        || ( psessionEntry->pePersona == VOS_P2P_CLIENT_MODE ) ||
          ( psessionEntry->pePersona == VOS_P2P_GO_MODE)
 #endif
+#if  defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+       || ((NULL != pMac->ft.ftPEContext.pFTPreAuthReq) 
+           && ( SIR_BAND_5_GHZ == limGetRFBand(pMac->ft.ftPEContext.pFTPreAuthReq->preAuthchannelNum)))
+#endif
          )
     {
         txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
@@ -4168,7 +4236,7 @@
 #endif  //ANI_SUPPORT_11H
 
 
-#ifdef ANI_PRODUCT_TYPE_AP
+#if 1//def ANI_PRODUCT_TYPE_AP
 /**
  * \brief Send a Channel Switch Announcement
  *
@@ -4191,17 +4259,19 @@
 tSirRetStatus
 limSendChannelSwitchMgmtFrame(tpAniSirGlobal pMac,
                               tSirMacAddr    peer,
-                              tANI_U8             nMode,
-                              tANI_U8             nNewChannel,
-                              tANI_U8             nCount)
+                              tANI_U8        nMode,
+                              tANI_U8        nNewChannel,
+                              tANI_U8        nCount,
+                              tpPESession    psessionEntry )
 {
     tDot11fChannelSwitch frm;
     tANI_U8                  *pFrame;
     tSirRetStatus        nSirStatus;
     tpSirMacMgmtHdr      pMacHdr;
-    tANI_U32                  nBytes, nPayload, nStatus, nCfg;
+    tANI_U32                  nBytes, nPayload, nStatus;//, nCfg;
     void               *pPacket;
     eHalStatus          halstatus;
+    tANI_U8 txFlag = 0;
     
     palZeroMemory( pMac->hHdd, ( tANI_U8* )&frm, sizeof( frm ) );
 
@@ -4243,7 +4313,12 @@
 
     // Next, we fill out the buffer descriptor:
     nSirStatus = limPopulateMacHeader( pMac, pFrame, SIR_MAC_MGMT_FRAME,
-                                SIR_MAC_MGMT_ACTION, peer);
+                                SIR_MAC_MGMT_ACTION, peer, psessionEntry->selfMacAddr);
+    pMacHdr = ( tpSirMacMgmtHdr ) pFrame;
+    palCopyMemory( pMac->hHdd,
+                   (tANI_U8 *) pMacHdr->bssId,
+                   (tANI_U8 *) psessionEntry->bssId,
+                   sizeof( tSirMacAddr ));
     if ( eSIR_SUCCESS != nSirStatus )
     {
         limLog( pMac, LOGE, FL("Failed to populate the buffer descrip"
@@ -4253,6 +4328,7 @@
         return eSIR_FAILURE;    // just allocated...
     }
 
+#if 0
     pMacHdr = ( tpSirMacMgmtHdr ) pFrame;
 
     nCfg = 6;
@@ -4265,7 +4341,7 @@
         palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, ( void* ) pFrame, ( void* ) pPacket );
         return eSIR_FAILURE;    // just allocated...
     }
-
+#endif
     nStatus = dot11fPackChannelSwitch( pMac, &frm, pFrame +
                                        sizeof(tSirMacMgmtHdr),
                                        nPayload, &nPayload );
@@ -4282,11 +4358,20 @@
                                "hannel Switch (0x%08x).\n") );
     }
 
+    if( ( SIR_BAND_5_GHZ == limGetRFBand(psessionEntry->currentOperChannel))
+#ifdef WLAN_FEATURE_P2P
+       || ( psessionEntry->pePersona == VOS_P2P_CLIENT_MODE ) ||
+         ( psessionEntry->pePersona == VOS_P2P_GO_MODE)
+#endif
+         )
+    {
+        txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
+    }
     halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) nBytes,
                             HAL_TXRX_FRM_802_11_MGMT,
                             ANI_TXDIR_TODS,
                             7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
-                            limTxComplete, pFrame, 0 );
+                            limTxComplete, pFrame, txFlag );
     if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
     {
         limLog( pMac, LOGE, FL("Failed to send a Channel Switch "
diff --git a/CORE/MAC/src/pe/lim/limSendMessages.c b/CORE/MAC/src/pe/lim/limSendMessages.c
index 3b95f1d..7dff6e0 100644
--- a/CORE/MAC/src/pe/lim/limSendMessages.c
+++ b/CORE/MAC/src/pe/lim/limSendMessages.c
@@ -31,14 +31,12 @@
  * --------------------------------------------------------------------------
  *
  */
-
 #include "limSendMessages.h"
 #include "cfgApi.h"
 #include "limTrace.h"
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
 #include "vos_diag_core_log.h"
 #endif //FEATURE_WLAN_DIAG_SUPPORT 
-
 /* When beacon filtering is enabled, firmware will
  * analyze the selected beacons received during BMPS,
  * and monitor any changes in the IEs as listed below.
@@ -65,7 +63,6 @@
 #endif
 };
 
-
 /**
  * limSendCFParams()
  *
@@ -87,41 +84,33 @@
  *
  * @return success if message send is ok, else false.
  */
-
 tSirRetStatus limSendCFParams(tpAniSirGlobal pMac, tANI_U8 bssIdx, tANI_U8 cfpCount, tANI_U8 cfpPeriod)
 {
     tpUpdateCFParams pCFParams = NULL;
     tSirRetStatus   retCode = eSIR_SUCCESS;
     tSirMsgQ msgQ;
 
-
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
           (void **) &pCFParams,
           sizeof( tUpdateCFParams )))
       {
         limLog( pMac, LOGP,
             FL( "Unable to PAL allocate memory during Update CF Params\n" ));
-
         retCode = eSIR_MEM_ALLOC_FAILED;
         goto returnFailure;
       }
-
     palZeroMemory( pMac->hHdd, (tANI_U8 *) pCFParams, sizeof(tUpdateCFParams));
-
     pCFParams->cfpCount = cfpCount;
     pCFParams->cfpPeriod = cfpPeriod;
     pCFParams->bssIdx     = bssIdx;
 
-
     msgQ.type = WDA_UPDATE_CF_IND;
     msgQ.reserved = 0;
     msgQ.bodyptr = pCFParams;
     msgQ.bodyval = 0;
-
     limLog( pMac, LOG3,
                 FL( "Sending WDA_UPDATE_CF_IND..." ));
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
-
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
         palFreeMemory(pMac->hHdd, pCFParams);
@@ -129,13 +118,10 @@
                     FL("Posting  WDA_UPDATE_CF_IND to WDA failed, reason=%X\n"),
                     retCode );
     }
-
 returnFailure:
     return retCode;
 }
 
-
-
 /**
  * limSendBeaconParams()
  *
@@ -157,7 +143,6 @@
  *
  * @return success if message send is ok, else false.
  */
-
 tSirRetStatus limSendBeaconParams(tpAniSirGlobal pMac, 
                                   tpUpdateBeaconParams pUpdatedBcnParams,
                                   tpPESession  psessionEntry )
@@ -166,27 +151,22 @@
     tSirRetStatus   retCode = eSIR_SUCCESS;
     tSirMsgQ msgQ;
 
-
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
           (void **) &pBcnParams, sizeof(*pBcnParams)))
     {
         limLog( pMac, LOGP,
             FL( "Unable to PAL allocate memory during Update Beacon Params\n" ));
-
         return eSIR_MEM_ALLOC_FAILED;
     }
-
     palCopyMemory( pMac->hHdd, (tANI_U8 *) pBcnParams,  pUpdatedBcnParams, sizeof(*pBcnParams));
-
     msgQ.type = WDA_UPDATE_BEACON_IND;
     msgQ.reserved = 0;
     msgQ.bodyptr = pBcnParams;
     msgQ.bodyval = 0;
-
     PELOG3(limLog( pMac, LOG3,
                 FL( "Sending WDA_UPDATE_BEACON_IND, paramChangeBitmap in hex = %x" ),
                     pUpdatedBcnParams->paramChangeBitmap);)
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
         palFreeMemory(pMac->hHdd, pBcnParams);
@@ -197,11 +177,9 @@
 #ifdef WLAN_SOFTAP_FEATURE
     limSendBeaconInd(pMac, psessionEntry);
 #endif
-
     return retCode;
 }
 
-
 /**
  * limSendSwitchChnlParams()
  *
@@ -223,46 +201,38 @@
  *
  * @return success if message send is ok, else false.
  */
-
 #if !defined WLAN_FEATURE_VOWIFI  
 tSirRetStatus limSendSwitchChnlParams(tpAniSirGlobal pMac,
                                       tANI_U8 chnlNumber,
-                                      tSirMacHTSecondaryChannelOffset secondaryChnlOffset,
+                                      ePhyChanBondState secondaryChnlOffset,
                                       tANI_U8 localPwrConstraint, tANI_U8 peSessionId)
 #else
 tSirRetStatus limSendSwitchChnlParams(tpAniSirGlobal pMac,
                                       tANI_U8 chnlNumber,
-                                      tSirMacHTSecondaryChannelOffset secondaryChnlOffset,
+                                      ePhyChanBondState secondaryChnlOffset,
                                       tPowerdBm maxTxPower, tANI_U8 peSessionId)
-
 #endif
 {
     tpSwitchChannelParams pChnlParams = NULL;
     tSirRetStatus   retCode = eSIR_SUCCESS;
     tSirMsgQ msgQ;
     tpPESession pSessionEntry;
-
     if((pSessionEntry = peFindSessionBySessionId(pMac , peSessionId)) == NULL)
     {
        limLog( pMac, LOGP,
              FL( "Unable to get Session for session Id %d\n" ), peSessionId);
        return eSIR_FAILURE;
-
     }
-
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
           (void **) &pChnlParams,
           sizeof( tSwitchChannelParams )))
       {
           limLog( pMac, LOGP,
             FL( "Unable to PAL allocate memory during Switch Channel Params\n" ));
-
         retCode = eSIR_MEM_ALLOC_FAILED;
         goto returnFailure;
       }
-
     palZeroMemory( pMac->hHdd, (tANI_U8 *) pChnlParams, sizeof(tSwitchChannelParams));
-
     pChnlParams->secondaryChannelOffset = secondaryChnlOffset;
     pChnlParams->channelNumber= chnlNumber;
 #if defined WLAN_FEATURE_VOWIFI  
@@ -271,19 +241,16 @@
 #else
     pChnlParams->localPowerConstraint = localPwrConstraint;
 #endif
-
     palCopyMemory( pMac->hHdd, pChnlParams->bssId, pSessionEntry->bssId, sizeof(tSirMacAddr) );
     pChnlParams->peSessionId = peSessionId;
     
     //we need to defer the message until we get the response back from WDA.
     SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
-
     msgQ.type = WDA_CHNL_SWITCH_REQ;
     msgQ.reserved = 0;
     msgQ.bodyptr = pChnlParams;
     msgQ.bodyval = 0;
-
-#if !defined WLAN_FEATURE_VOWIFI  
+#if defined WLAN_FEATURE_VOWIFI  
     PELOG3(limLog( pMac, LOG3,
         FL( "Sending WDA_CHNL_SWITCH_REQ with SecondaryChnOffset - %d, ChannelNumber - %d, maxTxPower - %d"),
         pChnlParams->secondaryChannelOffset, pChnlParams->channelNumber, pChnlParams->maxTxPower);)
@@ -292,7 +259,7 @@
         FL( "Sending WDA_CHNL_SWITCH_REQ with SecondaryChnOffset - %d, ChannelNumber - %d, LocalPowerConstraint - %d"),
         pChnlParams->secondaryChannelOffset, pChnlParams->channelNumber, pChnlParams->localPowerConstraint);)
 #endif
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, peSessionId, msgQ.type));
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
         palFreeMemory(pMac->hHdd, pChnlParams);
@@ -300,12 +267,10 @@
                     FL("Posting  WDA_CHNL_SWITCH_REQ to WDA failed, reason=%X\n"),
                     retCode );
     }
-
 returnFailure:
     return retCode;
 }
 
-
 /**
  * limSendEdcaParams()
  *
@@ -327,36 +292,30 @@
  *
  * @return success if message send is ok, else false.
  */
-
 tSirRetStatus limSendEdcaParams(tpAniSirGlobal pMac, tSirMacEdcaParamRecord *pUpdatedEdcaParams, tANI_U16 bssIdx, tANI_BOOLEAN highPerformance)
 {
     tEdcaParams *pEdcaParams = NULL;
     tSirRetStatus   retCode = eSIR_SUCCESS;
     tSirMsgQ msgQ;
-
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
           (void **) &pEdcaParams,
           sizeof(tEdcaParams)))
     {
         limLog( pMac, LOGP,
             FL( "Unable to PAL allocate memory during Update EDCA Params\n" ));
-
         retCode = eSIR_MEM_ALLOC_FAILED;
         return retCode;
     }
-
     pEdcaParams->bssIdx = bssIdx;
     pEdcaParams->acbe = pUpdatedEdcaParams[EDCA_AC_BE];
     pEdcaParams->acbk = pUpdatedEdcaParams[EDCA_AC_BK];
     pEdcaParams->acvi = pUpdatedEdcaParams[EDCA_AC_VI];
     pEdcaParams->acvo = pUpdatedEdcaParams[EDCA_AC_VO];
     pEdcaParams->highPerformance = highPerformance;
-
     msgQ.type = WDA_UPDATE_EDCA_PROFILE_IND;
     msgQ.reserved = 0;
     msgQ.bodyptr = pEdcaParams;
     msgQ.bodyval = 0;
-
     {
         tANI_U8 i;
         PELOG1(limLog( pMac, LOG1,FL("Sending WDA_UPDATE_EDCA_PROFILE_IND with EDCA Parameters:" ));)
@@ -367,7 +326,7 @@
                    pUpdatedEdcaParams[i].cw.min, pUpdatedEdcaParams[i].cw.max, pUpdatedEdcaParams[i].txoplimit);)
         }
     }
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
         palFreeMemory(pMac->hHdd, pEdcaParams);
@@ -375,11 +334,9 @@
                     FL("Posting  WDA_UPDATE_EDCA_PROFILE_IND to WDA failed, reason=%X\n"),
                     retCode );
     }
-
     return retCode;
 }
 
-
 /**
  * limSetActiveEdcaParams()
  *
@@ -404,13 +361,11 @@
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
     vos_log_qos_edca_pkt_type *log_ptr = NULL;
 #endif //FEATURE_WLAN_DIAG_SUPPORT 
-
     // Initialize gLimEdcaParamsActive[] to be same as localEdcaParams
     psessionEntry->gLimEdcaParamsActive[EDCA_AC_BE] = plocalEdcaParams[EDCA_AC_BE];
     psessionEntry->gLimEdcaParamsActive[EDCA_AC_BK] = plocalEdcaParams[EDCA_AC_BK];
     psessionEntry->gLimEdcaParamsActive[EDCA_AC_VI] = plocalEdcaParams[EDCA_AC_VI];
     psessionEntry->gLimEdcaParamsActive[EDCA_AC_VO] = plocalEdcaParams[EDCA_AC_VO];
-
     /* An AC requires downgrade if the ACM bit is set, and the AC has not
      * yet been admitted in uplink or bi-directions.
      * If an AC requires downgrade, it will downgrade to the next beset AC
@@ -430,7 +385,6 @@
     {
         acAdmitted = ( (pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] & (1 << ac)) >> ac );
         limLog(pMac, LOG1, FL("For AC[%d]: acm=%d,  acAdmit=%d \n"), ac, plocalEdcaParams[ac].aci.acm, acAdmitted);
-
         if ( (plocalEdcaParams[ac].aci.acm == 1) && (acAdmitted == 0) )
         {
             limLog(pMac, LOG1, FL("We need to downgrade AC %d!! "), ac);
@@ -475,7 +429,6 @@
     return;
  }
 
-
 /** ---------------------------------------------------------
 \fn      limSetLinkState
 \brief   LIM sends a message to WDA to set the link state
@@ -489,20 +442,16 @@
 {
     tSirMsgQ msg;
     tSirRetStatus retCode;
-
     msg.type = WDA_SET_LINK_STATE;
     msg.bodyval = (tANI_U32) state;
     msg.bodyptr = NULL;
-
     MTRACE(macTraceMsgTx(pMac, 0, msg.type));
     retCode = wdaPostCtrlMsg(pMac, &msg);
     if (retCode != eSIR_SUCCESS)
         limLog(pMac, LOGP, FL("Posting link state %d failed, reason = %x \n"), retCode);
-
     return retCode;
 }
 #endif //0
-
 tSirRetStatus limSetLinkState(tpAniSirGlobal pMac, tSirLinkState state,tSirMacAddr bssId, 
                               tSirMacAddr selfMacAddr, tpSetLinkStateCallback callback, 
                               void *callbackArg) 
@@ -510,7 +459,6 @@
     tSirMsgQ msgQ;
     tSirRetStatus retCode;
     tpLinkStateParams pLinkStateParams = NULL;
-
     // Allocate memory.
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
           (void **) &pLinkStateParams,
@@ -518,29 +466,24 @@
     {
         limLog( pMac, LOGP,
         FL( "Unable to PAL allocate memory while sending Set Link State\n" ));
-
         retCode = eSIR_SME_RESOURCES_UNAVAILABLE;
         return retCode;
     }
-
     palZeroMemory( pMac->hHdd, (tANI_U8 *) pLinkStateParams, sizeof(tLinkStateParams));
-
     pLinkStateParams->state        = state;
     pLinkStateParams->callback     = callback;
     pLinkStateParams->callbackArg  = callbackArg;
      
-
     /* Copy Mac address */
     sirCopyMacAddr(pLinkStateParams->bssid,bssId);
     sirCopyMacAddr(pLinkStateParams->selfMacAddr, selfMacAddr);
 
-
     msgQ.type = WDA_SET_LINK_STATE;
     msgQ.reserved = 0;
     msgQ.bodyptr = pLinkStateParams;
     msgQ.bodyval = 0;
     
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
 
     retCode = (tANI_U32)wdaPostCtrlMsg(pMac, &msgQ);
     if (retCode != eSIR_SUCCESS)
@@ -548,10 +491,8 @@
         palFreeMemory(pMac, (void*)pLinkStateParams);
         limLog(pMac, LOGP, FL("Posting link state %d failed, reason = %x \n"), retCode);
     }
-
     return retCode;
 }
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
 extern tSirRetStatus limSetLinkStateFT(tpAniSirGlobal pMac, tSirLinkState 
 state,tSirMacAddr bssId, tSirMacAddr selfMacAddr, int ft, tpPESession psessionEntry)
@@ -559,7 +500,6 @@
     tSirMsgQ msgQ;
     tSirRetStatus retCode;
     tpLinkStateParams pLinkStateParams = NULL;
-
     // Allocate memory.
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
           (void **) &pLinkStateParams,
@@ -567,28 +507,23 @@
     {
         limLog( pMac, LOGP,
         FL( "Unable to PAL allocate memory while sending Set Link State\n" ));
-
         retCode = eSIR_SME_RESOURCES_UNAVAILABLE;
         return retCode;
     }
-
     palZeroMemory( pMac->hHdd, (tANI_U8 *) pLinkStateParams, sizeof(tLinkStateParams));
-
     pLinkStateParams->state = state;
-
     /* Copy Mac address */
     sirCopyMacAddr(pLinkStateParams->bssid,bssId);
     sirCopyMacAddr(pLinkStateParams->selfMacAddr, selfMacAddr);
     pLinkStateParams->ft = 1;
     pLinkStateParams->session = psessionEntry;
 
-
     msgQ.type = WDA_SET_LINK_STATE;
     msgQ.reserved = 0;
     msgQ.bodyptr = pLinkStateParams;
     msgQ.bodyval = 0;
     
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
     retCode = (tANI_U32)wdaPostCtrlMsg(pMac, &msgQ);
     if (retCode != eSIR_SUCCESS)
@@ -596,13 +531,10 @@
         palFreeMemory(pMac, (void*)pLinkStateParams);
         limLog(pMac, LOGP, FL("Posting link state %d failed, reason = %x \n"), retCode);
     }
-
     return retCode;
 }
 #endif
 
-
-
 /** ---------------------------------------------------------
 \fn      limSendSetTxPowerReq
 \brief   LIM sends a WDA_SET_TX_POWER_REQ message to WDA 
@@ -614,18 +546,14 @@
 {
     tSirRetStatus  retCode = eSIR_SUCCESS;
     tSirMsgQ       msgQ;
-
     if (NULL == pTxPowerReq)
         return retCode;
-
     msgQ.type = WDA_SET_TX_POWER_REQ;
     msgQ.reserved = 0;
     msgQ.bodyptr = pTxPowerReq;
     msgQ.bodyval = 0;
-
     PELOGW(limLog(pMac, LOGW, FL( "Sending WDA_SET_TX_POWER_REQ to WDA"));)
-
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
         limLog( pMac, LOGP, FL("Posting WDA_SET_TX_POWER_REQ to WDA failed, reason=%X"), retCode );
@@ -637,7 +565,6 @@
     }
     return retCode;
 }
-
 /** ---------------------------------------------------------
 \fn      limSendGetTxPowerReq
 \brief   LIM sends a WDA_GET_TX_POWER_REQ message to WDA
@@ -649,18 +576,14 @@
 {
     tSirRetStatus  retCode = eSIR_SUCCESS;
     tSirMsgQ       msgQ;
-
     if (NULL == pTxPowerReq)
         return retCode;
-
     msgQ.type = WDA_GET_TX_POWER_REQ;
     msgQ.reserved = 0;
     msgQ.bodyptr = pTxPowerReq;
     msgQ.bodyval = 0;
-
     PELOGW(limLog(pMac, LOGW, FL( "Sending WDA_GET_TX_POWER_REQ to WDA"));)
-
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
         limLog( pMac, LOGP, FL("Posting WDA_GET_TX_POWER_REQ to WDA failed, reason=%X"), retCode );
@@ -672,7 +595,6 @@
     }
     return retCode;
 }
-
 /** ---------------------------------------------------------
 \fn      limSendBeaconFilterInfo
 \brief   LIM sends beacon filtering info to WDA
@@ -690,7 +612,6 @@
     tpBeaconFilterIe   pIe;
     tpPESession psessionEntry = &pMac->lim.gpSession[0];  //TBD-RAJESH get the sessionEntry from the caller
 
-
     msgSize = sizeof(tBeaconFilterMsg) + sizeof(beaconFilterTable);
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
           (void **) &pBeaconFilterMsg, msgSize) )
@@ -700,18 +621,14 @@
         return retCode;
     }
     palZeroMemory( pMac->hHdd, (tANI_U8 *) pBeaconFilterMsg, msgSize);
-
     // Fill in capability Info and mask
     //TBD-RAJESH get the BSS capability from session.
     //Don't send this message if no active Infra session is found.
     pBeaconFilterMsg->capabilityInfo = psessionEntry->limCurrentBssCaps;
     pBeaconFilterMsg->capabilityMask = CAPABILITY_FILTER_MASK;
-
     pBeaconFilterMsg->beaconInterval = (tANI_U16) psessionEntry->beaconParams.beaconInterval;
-
     // Fill in number of IEs in beaconFilterTable
     pBeaconFilterMsg->ieNum = (tANI_U16) (sizeof(beaconFilterTable) / sizeof(tBeaconFilterIe));
-
     //Fill message with info contained in the beaconFilterTable
     ptr = (tANI_U8 *)pBeaconFilterMsg + sizeof(tBeaconFilterMsg);
     for(i=0; i < (pBeaconFilterMsg->ieNum); i++)
@@ -725,14 +642,12 @@
         pIe->byte.ref =  beaconFilterTable[i].byte.ref; 
         ptr += sizeof(tBeaconFilterIe);
     }
-
     msgQ.type = WDA_BEACON_FILTER_IND;
     msgQ.reserved = 0;
     msgQ.bodyptr = pBeaconFilterMsg;
     msgQ.bodyval = 0;
-
     limLog( pMac, LOG3, FL( "Sending WDA_BEACON_FILTER_IND..." ));
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
         palFreeMemory(pMac->hHdd, pBeaconFilterMsg);
@@ -741,7 +656,5 @@
             retCode );
         return retCode;
     }
-
     return retCode;
 }
-
diff --git a/CORE/MAC/src/pe/lim/limSendMessages.h b/CORE/MAC/src/pe/lim/limSendMessages.h
index 3871659..71b07ed 100644
--- a/CORE/MAC/src/pe/lim/limSendMessages.h
+++ b/CORE/MAC/src/pe/lim/limSendMessages.h
@@ -34,26 +34,22 @@
 #ifndef __LIM_SEND_MESSAGES_H
 #define __LIM_SEND_MESSAGES_H
 
-
-
 #include "aniGlobal.h"
 #include "limTypes.h"
 #include "halMsgApi.h"
 #include "sirParams.h"    
-
 tSirRetStatus limSendCFParams(tpAniSirGlobal pMac, tANI_U8 bssIdx, tANI_U8 cfpCount, tANI_U8 cfpPeriod);
 tSirRetStatus limSendBeaconParams(tpAniSirGlobal pMac, 
                                   tpUpdateBeaconParams pUpdatedBcnParams,
                                   tpPESession  psessionEntry );
-
 //tSirRetStatus limSendBeaconParams(tpAniSirGlobal pMac, tpUpdateBeaconParams pUpdatedBcnParams);
 #if defined WLAN_FEATURE_VOWIFI  
 tSirRetStatus limSendSwitchChnlParams(tpAniSirGlobal pMac, tANI_U8 chnlNumber, 
-                                      tSirMacHTSecondaryChannelOffset secondaryChnlOffset, 
+                                      ePhyChanBondState secondaryChnlOffset, 
                                       tPowerdBm maxTxPower,tANI_U8 peSessionId);
 #else
 tSirRetStatus limSendSwitchChnlParams(tpAniSirGlobal pMac, tANI_U8 chnlNumber, 
-                                      tSirMacHTSecondaryChannelOffset secondaryChnlOffset, 
+                                      ePhyChanBondState secondaryChnlOffset, 
                                       tANI_U8 localPwrConstraint,tANI_U8 peSessionId);
 #endif
 tSirRetStatus limSendEdcaParams(tpAniSirGlobal pMac, tSirMacEdcaParamRecord *pUpdatedEdcaParams, tANI_U16 bssIdx, tANI_BOOLEAN highPerformance);
@@ -66,9 +62,7 @@
 #endif
 tSirRetStatus limSendSetTxPowerReq(tpAniSirGlobal pMac, tpSirSetTxPowerReq pTxPowerReq);
 tSirRetStatus limSendGetTxPowerReq(tpAniSirGlobal pMac, tpSirGetTxPowerReq pTxPowerReq);
-
 void limSetActiveEdcaParams(tpAniSirGlobal pMac, tSirMacEdcaParamRecord *plocalEdcaParams, tpPESession psessionEntry);
-
 #define CAPABILITY_FILTER_MASK  0x73CF
 #define ERP_FILTER_MASK         0xF8
 #define EDCA_FILTER_MASK        0xF0
@@ -78,8 +72,6 @@
 #define HT_BYTE5_FILTER_MASK    0xFD
 #define DS_PARAM_CHANNEL_MASK   0x0
 
-
 tSirRetStatus limSendBeaconFilterInfo(tpAniSirGlobal pMac);
 
-
 #endif
diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
index 1d1ccd0..1ceed6b 100644
--- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
@@ -123,7 +123,7 @@
     mmhMsg.type = msgType;
     mmhMsg.bodyptr = pSirSmeRsp;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
 
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
    {
@@ -201,7 +201,7 @@
     mmhMsg.type = pSirSmeJoinRsp->messageType;
     mmhMsg.bodyptr = pSirSmeJoinRsp;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg,  ePROT);
 }
 
@@ -377,7 +377,7 @@
                 palCopyMemory(pMac->hHdd, pSirSmeJoinRsp->frames + psessionEntry->bcnLen + psessionEntry->assocReqLen + psessionEntry->assocRspLen, psessionEntry->ricData, pSirSmeJoinRsp->parsedRicRspLen);
                 palFreeMemory(pMac->hHdd, psessionEntry->ricData);
                 psessionEntry->ricData = NULL;
-                PELOG1(limLog(pMac, LOG1, FL("RicLength=%d\n"), psessionEntry->parsedRicRspLen);)
+                PELOG1(limLog(pMac, LOG1, FL("RicLength=%d\n"), pSirSmeJoinRsp->parsedRicRspLen);)
             }
 #endif
 #ifdef FEATURE_WLAN_CCX            
@@ -409,9 +409,23 @@
     
     if(IS_MCC_SUPPORTED && limIsLinkSuspended( pMac ) )
     {
+        ePhyChanBondState htSecondaryChannelOffset;
         if( psessionEntry && psessionEntry->limSmeState == eLIM_SME_LINK_EST_STATE )
         {
-            peSetResumeChannel( pMac, psessionEntry->currentOperChannel, 0);
+            
+#ifdef WLAN_FEATURE_11AC
+            if (psessionEntry->vhtCapability)
+            {
+               /*Get 11ac cbState from 11n cbState*/
+                 htSecondaryChannelOffset = limGet11ACPhyCBState(pMac, 
+                                    psessionEntry->currentOperChannel,
+                                    psessionEntry->htSecondaryChannelOffset);
+                peSetResumeChannel( pMac, psessionEntry->currentOperChannel, htSecondaryChannelOffset);
+            }
+            else {
+#endif
+            peSetResumeChannel( pMac, psessionEntry->currentOperChannel, psessionEntry->htSecondaryChannelOffset);
+        }
         }
         else
         {
@@ -571,7 +585,7 @@
     mmhMsg.type = msgType;
     mmhMsg.bodyptr = pSirSmeRsp;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, mmhMsg.type));
 
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
     limDiagEventReport(pMac, WLAN_PE_DIAG_START_BSS_RSP_EVENT, psessionEntry, (tANI_U16)resultCode, 0);
@@ -685,7 +699,7 @@
 #endif
                 mmhMsg.bodyptr = pSirSmeScanRsp;
                 mmhMsg.bodyval = 0;
-                MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+                MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
                 limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
                 if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pSirSmeScanRsp, allocLength))
                 {
@@ -755,7 +769,7 @@
         mmhMsg.type = eWNI_SME_SCAN_RSP;
         mmhMsg.bodyptr = pSirSmeScanRsp;
         mmhMsg.bodyval = 0;
-        MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+        MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
         limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
         PELOG2(limLog(pMac, LOG2, FL("statusCode : eSIR_SME_SUCCESS\n"));)
     }
@@ -824,7 +838,7 @@
     mmhMsg.bodyptr = pSirSmeScanRsp;
     mmhMsg.bodyval = 0;
 
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
     limDiagEventReport(pMac, WLAN_PE_DIAG_SCAN_RSP_EVENT, NULL, (tANI_U16)resultCode, 0);
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -834,6 +848,77 @@
 
 }  /*** limPostSmeScanRspMessage ***/
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+/**
+ * limSendSmeOemDataRsp()
+ *
+ *FUNCTION:
+ * This function is called by limProcessSmeReqMessages() to send
+ * eWNI_SME_OEM_DATA_RSP message to applications above MAC
+ * Software.
+ *
+ *PARAMS:
+ *
+ *LOGIC:
+ *
+ *ASSUMPTIONS:
+ * NA
+ *
+ *NOTE:
+ * NA
+ *
+ * @param pMac         Pointer to Global MAC structure
+ * @param pMsgBuf      Indicates the mlm message
+ * @param resultCode   Indicates the result of previously issued
+ *                     eWNI_SME_OEM_DATA_RSP message
+ *
+ * @return None
+ */
+
+void limSendSmeOemDataRsp(tpAniSirGlobal pMac, tANI_U32* pMsgBuf, tSirResultCodes resultCode)
+{
+    tSirMsgQ                      mmhMsg;
+    tSirOemDataRsp*               pSirSmeOemDataRsp=NULL;
+    tLimMlmOemDataRsp*            pMlmOemDataRsp=NULL;
+    tANI_U16                      msgLength;
+
+    
+    //get the pointer to the mlm message
+    pMlmOemDataRsp = (tLimMlmOemDataRsp*)(pMsgBuf);
+
+    msgLength = sizeof(tSirOemDataRsp);
+
+    //now allocate memory for the char buffer
+    if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, (void**)&pSirSmeOemDataRsp, msgLength))
+    {
+        limLog(pMac, LOGP, FL("call to palAllocateMemory failed for pSirSmeOemDataRsp\n"));
+        return;
+    }
+
+#if defined (ANI_LITTLE_BYTE_ENDIAN)
+    sirStoreU16N((tANI_U8*)&pSirSmeOemDataRsp->length, msgLength);
+    sirStoreU16N((tANI_U8*)&pSirSmeOemDataRsp->messageType, eWNI_SME_OEM_DATA_RSP);
+#else
+    pSirSmeOemDataRsp->length = msgLength;
+    pSirSmeOemDataRsp->messageType = eWNI_SME_OEM_DATA_RSP;
+#endif
+
+    palCopyMemory(pMac->hHdd, pSirSmeOemDataRsp->oemDataRsp, pMlmOemDataRsp->oemDataRsp, OEM_DATA_RSP_SIZE);
+
+    //Now free the memory from MLM Rsp Message
+    palFreeMemory(pMac->hHdd, pMlmOemDataRsp);
+
+    mmhMsg.type = eWNI_SME_OEM_DATA_RSP;
+    mmhMsg.bodyptr = pSirSmeOemDataRsp;
+    mmhMsg.bodyval = 0;
+
+    limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
+
+    return;
+}  /*** limSendSmeOemDataRsp ***/
+
+#endif
 
 
 /**
@@ -925,7 +1010,7 @@
     mmhMsg.bodyptr = pMsg;
     mmhMsg.bodyval = 0;
 
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
 
     limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
 }
@@ -1110,7 +1195,10 @@
     if( IS_MCC_SUPPORTED && limIsLinkSuspended( pMac ) )
     {
         //Resume on the first active session channel.
-        peSetResumeChannel( pMac, peGetActiveSessionChannel( pMac ), 0);
+        tANI_U8 resumeChannel;
+        ePhyChanBondState resumePhyCbState;
+        peGetActiveSessionChannel( pMac, &resumeChannel, &resumePhyCbState );
+        peSetResumeChannel( pMac, resumeChannel, resumePhyCbState );
 
         limResumeLink( pMac, limSendSmeDisassocDeauthNtfPostResume, 
                                               (tANI_U32*) pMsg );
@@ -1195,7 +1283,7 @@
     mmhMsg.bodyptr = pSirSmeDisassocInd;
     mmhMsg.bodyval = 0;
 
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, mmhMsg.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
     limDiagEventReport(pMac, WLAN_PE_DIAG_DISASSOC_IND_EVENT, psessionEntry, 0, (tANI_U16)pStaDs->mlmStaContext.disassocReason); 
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -1291,7 +1379,7 @@
     mmhMsg.bodyptr = pSirSmeDeauthInd;
     mmhMsg.bodyval = 0;
 
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, mmhMsg.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
     limDiagEventReport(pMac, WLAN_PE_DIAG_DEAUTH_IND_EVENT, psessionEntry, 0, pStaDs->mlmStaContext.cleanupTrigger);
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -1453,7 +1541,10 @@
     if( IS_MCC_SUPPORTED && limIsLinkSuspended( pMac ) )
     {
         //Resume on the first active session channel.
-        peSetResumeChannel( pMac, peGetActiveSessionChannel( pMac ), 0);
+        tANI_U8 resumeChannel;
+        ePhyChanBondState resumePhyCbState;
+        peGetActiveSessionChannel( pMac, &resumeChannel, &resumePhyCbState );
+        peSetResumeChannel( pMac, resumeChannel, resumePhyCbState );
 
         limResumeLink( pMac, limSendSmeDisassocDeauthNtfPostResume, 
                                               (tANI_U32*) pMsg );
@@ -1608,7 +1699,7 @@
     }
 
 
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     if (eSIR_SUCCESS != limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT))
     {
         palFreeMemory(pMac->hHdd, (void *) pSirSmeWmStatusChangeNtf);
@@ -1692,7 +1783,7 @@
     mmhMsg.type = eWNI_SME_SETCONTEXT_RSP;
     mmhMsg.bodyptr = pSirSmeSetContextRsp;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, mmhMsg.type));
 
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
     limDiagEventReport(pMac, WLAN_PE_DIAG_SETCONTEXT_RSP_EVENT, psessionEntry, (tANI_U16)resultCode, 0);
@@ -1775,7 +1866,7 @@
     mmhMsg.type = eWNI_SME_REMOVEKEY_RSP;
     mmhMsg.bodyptr = pSirSmeRemoveKeyRsp;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
 } /*** end limSendSmeSetContextRsp() ***/
 
@@ -1916,7 +2007,7 @@
     msgQ.type = eWNI_SME_NEIGHBOR_BSS_IND;
     msgQ.bodyptr = pNewBssInd;
     msgQ.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
     limSysProcessMmhMsgApi(pMac, &msgQ, ePROT);
 } /*** end limSendSmeNeighborBssInd() ***/
 
@@ -1960,7 +2051,7 @@
     mmhMsg.type = eWNI_SME_ADDTS_RSP;
     mmhMsg.bodyptr = rsp;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, mmhMsg.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
     limDiagEventReport(pMac, WLAN_PE_DIAG_ADDTS_RSP_EVENT, psessionEntry, 0, 0);
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -1995,7 +2086,7 @@
     mmhMsg.type = eWNI_SME_ADDTS_IND;
     mmhMsg.bodyptr = rsp;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
 }
 
@@ -2040,7 +2131,7 @@
     mmhMsg.type = eWNI_SME_DELTS_RSP;
     mmhMsg.bodyptr = rsp;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, mmhMsg.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
     limDiagEventReport(pMac, WLAN_PE_DIAG_DELTS_RSP_EVENT, psessionEntry, (tANI_U16)status, 0);
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -2080,7 +2171,7 @@
     mmhMsg.type = eWNI_SME_DELTS_IND;
     mmhMsg.bodyptr = rsp;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, mmhMsg.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
     limDiagEventReport(pMac, WLAN_PE_DIAG_DELTS_IND_EVENT, psessionEntry, 0, 0);
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -2143,7 +2234,7 @@
 
     mmhMsg.bodyptr = stats;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);                                                  
 
     return;
@@ -2202,7 +2293,7 @@
 
     mmhMsg.bodyptr = stats;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);                                                  
 
     return;
@@ -2251,7 +2342,7 @@
     mmhMsg.type    = msgType;
 //    mmhMsg.bodyval = (tANI_U32) pNewPeerInd;
     mmhMsg.bodyptr = pNewPeerInd;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
     
 }
@@ -2297,7 +2388,7 @@
     mmhMsg.bodyval = 0;
   
     PELOG1(limLog(pMac, LOG1, FL("Sending eWNI_PMC_EXIT_BMPS_IND to SME. \n"));)        
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
     limDiagEventReport(pMac, WLAN_PE_DIAG_EXIT_BMPS_IND_EVENT, peGetValidPowerSaveSession(pMac), 0, (tANI_U16)reasonCode);
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -2363,7 +2454,7 @@
     mmhMsg.type = eWNI_SME_FT_AGGR_QOS_RSP;
     mmhMsg.bodyptr = aggrQosRsp;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
 
     return;
@@ -2388,7 +2479,7 @@
     mmhMsg.type = eWNI_SME_PRE_SWITCH_CHL_IND;
     mmhMsg.bodyptr = NULL;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
 
     return;
@@ -2412,7 +2503,7 @@
     mmhMsg.type = eWNI_SME_POST_SWITCH_CHL_IND;
     mmhMsg.bodyptr = NULL;
     mmhMsg.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
 
     return;
@@ -2441,7 +2532,7 @@
     PELOG1(limLog(pMac, LOG1, FL("msgType %s peerMacAddr %02x-%02x-%02x-%02x-%02x-%02x"
                 "sme session id %d\n"),"eWNI_SME_MAX_ASSOC_EXCEEDED", peerMacAddr[0], peerMacAddr[1],
                 peerMacAddr[2], peerMacAddr[3], peerMacAddr[4], peerMacAddr[5], smesessionId);)
-    MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
 
     return;
diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
index d5e8050..8554d9b 100644
--- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
+++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
@@ -89,6 +89,9 @@
                tANI_U8 *beacon,tANI_U16 beaconLen, tANI_U16 msgType, tANI_U8 sessionId);
 void limSendExitBmpsInd(tpAniSirGlobal pMac, tExitBmpsReason reasonCode);
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+void limSendSmeOemDataRsp(tpAniSirGlobal pMac, tANI_U32* pMsgBuf, tSirResultCodes resultCode);
+#endif
 
 void limSendSmePreChannelSwitchInd(tpAniSirGlobal pMac);
 void limSendSmePostChannelSwitchInd(tpAniSirGlobal pMac);
diff --git a/CORE/MAC/src/pe/lim/limSerDesUtils.c b/CORE/MAC/src/pe/lim/limSerDesUtils.c
index 456f9d6..f9df7ec 100644
--- a/CORE/MAC/src/pe/lim/limSerDesUtils.c
+++ b/CORE/MAC/src/pe/lim/limSerDesUtils.c
@@ -187,14 +187,6 @@
     if (limCheckRemainingLength(pMac, len) == eSIR_FAILURE)
         return eSIR_FAILURE;
 
-    // Extract the TITAN capability info
-    // NOTE - titanHtCaps is now DWORD aligned
-    pBssDescription->titanHtCaps = limGetU32( pBuf );
-    pBuf += sizeof(tANI_U32);
-    len  -= sizeof(tANI_U32);
-    if (limCheckRemainingLength(pMac, len) == eSIR_FAILURE)
-        return eSIR_FAILURE;
-
     //pass the timestamp
     pBssDescription->nReceivedTime = limGetU32( pBuf );
     pBuf += sizeof(tANI_TIMESTAMP);
@@ -593,17 +585,13 @@
     pBuf       += sizeof(tSirMacAddr);
     bssInfoLen += sizeof(tSirMacAddr);
    PELOG3(limLog(pMac, LOG3,
-       FL("Copying new NeighborWds node:channel is %d, TITAN HT Caps are %1d, wniIndicator is %d, bssType is %d, bssId is "),
-       pBssInfo->channelId, pBssInfo->titanHtCaps, pBssInfo->wniIndicator,
-       pBssInfo->bssType);
+       FL("Copying new NeighborWds node:channel is %d, wniIndicator is %d, bssType is %d, bssId is "),
+       pBssInfo->channelId, pBssInfo->wniIndicator, pBssInfo->bssType);
     limPrintMacAddr(pMac, pBssInfo->bssId, LOG3);)
 
     *pBuf++ = pBssInfo->channelId;
     bssInfoLen++;
 
-    *pBuf++ = pBssInfo->titanHtCaps;
-    bssInfoLen++;
-
     limCopyU32(pBuf, pBssInfo->wniIndicator);
     pBuf       += sizeof(tANI_U32);
     bssInfoLen += sizeof(tANI_U32);
@@ -1366,7 +1354,7 @@
     len--;
 
     // Extract CB secondary channel info
-    pStartBssReq->cbMode = (tAniCBSecondaryMode)limGetU32( pBuf );
+    pStartBssReq->cbMode = (ePhyChanBondState)limGetU32( pBuf );
     pBuf += sizeof( tANI_U32 );
     len -= sizeof( tANI_U32 );
 
@@ -1789,6 +1777,12 @@
     if (limCheckRemainingLength(pMac, len) == eSIR_FAILURE)
         return eSIR_FAILURE;
 
+    // Extract cbMode
+    pJoinReq->cbMode = *pBuf++;
+    len--;
+    if (limCheckRemainingLength(pMac, len) == eSIR_FAILURE)
+        return eSIR_FAILURE;
+
     // Extract uapsdPerAcBitmask
     pJoinReq->uapsdPerAcBitmask = *pBuf++;
     len--;
@@ -2193,11 +2187,6 @@
 
 #endif
 
-    // Copy the new TITAN capabilities
-    *pBuf = pAssocInd->titanHtCaps;
-    pBuf++;
-    mLen++;
-
     limCopyU32(pBuf, pAssocInd->spectrumMgtIndicator);
     pBuf += sizeof(tAniBool);
     mLen += sizeof(tAniBool);
@@ -2766,11 +2755,6 @@
     mLen += sizeof(tANI_U32);
 #endif
 
-    // Copy the new TITAN capabilities
-    *pBuf = pReassocInd->titanHtCaps;
-    pBuf++;
-    mLen++;
-
     limCopyU32(pBuf, pReassocInd->spectrumMgtIndicator);
     pBuf += sizeof(tAniBool);
     mLen += sizeof(tAniBool);
@@ -3425,7 +3409,7 @@
         pMac->lim.htCapabilityPresentInBeacon = 1;
     else
         pMac->lim.htCapabilityPresentInBeacon = 0;
-    if (neighborBssInfo.localPowerConstraints && pMac->lim.gLim11hEnable)
+    if (neighborBssInfo.localPowerConstraints && pSessionEntry->lim11hEnable)
     {
         localPowerConstraints = neighborBssInfo.localPowerConstraints;
     }
diff --git a/CORE/MAC/src/pe/lim/limSession.c b/CORE/MAC/src/pe/lim/limSession.c
index 3d3a553..6348bf8 100644
--- a/CORE/MAC/src/pe/lim/limSession.c
+++ b/CORE/MAC/src/pe/lim/limSession.c
@@ -152,7 +152,11 @@
 #endif
             *sessionId = i;
 
-            pMac->lim.gpSession[i].gLimPhyMode = WNI_CFG_PHY_MODE_11G; //TODO :Check with the team what should be default mode 
+            pMac->lim.gpSession[i].gLimPhyMode = WNI_CFG_PHY_MODE_11G; //TODO :Check with the team what should be default mode
+            /* Initialize CB mode variables when session is created */
+            pMac->lim.gpSession[i].htSupportedChannelWidthSet = 0;
+            pMac->lim.gpSession[i].htRecommendedTxWidthSet = 0;
+            pMac->lim.gpSession[i].htSecondaryChannelOffset = 0;
             return(&pMac->lim.gpSession[i]);
         }
     }
@@ -262,7 +266,7 @@
        }
     }
 
-    limLog(pMac, LOG4, FL("Session lookup fails for StaId: \n "));
+    limLog(pMac, LOG4, FL("Session lookup fails for StaId: %d\n "), staid);
     return(NULL);
 }
 
@@ -280,9 +284,24 @@
 void peDeleteSession(tpAniSirGlobal pMac, tpPESession psessionEntry)
 {
     tANI_U16 i = 0;
+    tANI_U16 n;
+    TX_TIMER *timer_ptr;
 
     limLog(pMac, LOGW, FL("Trying to delete a session %d.\n "), psessionEntry->peSessionId);
 
+    for (n = 0; n < pMac->lim.maxStation; n++)
+    {
+        timer_ptr = &pMac->lim.limTimers.gpLimCnfWaitTimer[n];
+
+        if(psessionEntry->peSessionId == timer_ptr->sessionId)
+        {
+            if(VOS_TRUE == tx_timer_running(timer_ptr))
+            {
+                tx_timer_deactivate(timer_ptr);
+            }
+        }
+    }
+    
     if(psessionEntry->pLimStartBssReq != NULL)
     {
         palFreeMemory( pMac->hHdd, psessionEntry->pLimStartBssReq );
@@ -404,7 +423,9 @@
          }
       }
    }   
-   
+
+   limLog(pMac, LOG1, FL("Session lookup fails for Peer StaId: \n "));
+   limPrintMacAddr(pMac, sa, LOG1);
    return NULL;
 }
 
diff --git a/CORE/MAC/src/pe/lim/limSessionUtils.c b/CORE/MAC/src/pe/lim/limSessionUtils.c
index a07d0c9..bc53e77 100644
--- a/CORE/MAC/src/pe/lim/limSessionUtils.c
+++ b/CORE/MAC/src/pe/lim/limSessionUtils.c
@@ -20,11 +20,9 @@
  */
 
 /**=========================================================================
-  
-  \file  limSessionUtils.c
-  
-  \brief implementation for lim Session Utility  APIs
 
+  \file  limSessionUtils.c
+  \brief implementation for lim Session Utility  APIs
   \author Sunit Bhatia
   
   Copyright 2008 (c) Qualcomm, Incorporated.  All Rights Reserved.
@@ -40,8 +38,63 @@
 #include "limSessionUtils.h"
 #include "limUtils.h"
 
+/*--------------------------------------------------------------------------
+  \brief peGetVhtCapable() - Returns the Vht capable from a valid session.
+
+  This function itrates the session Table and returns the VHT capable from first valid session
+   if no sessions are valid/present  it returns FALSE
+    
+  \param pMac                   - pointer to global adapter context
+  \return                           - channel to scan from valid session else zero.
+  
+  \sa
+  
+  --------------------------------------------------------------------------*/
+tANI_U8 peGetVhtCapable(tpAniSirGlobal pMac)
+
+{
+#ifdef WLAN_FEATURE_11AC
+    tANI_U8 i;
+    //assumption here is that all the sessions will be on the same channel.
+    //This function will not work, once we have multiple channel support.
+    for(i =0; i < pMac->lim.maxBssId; i++)
+    {
+        if(pMac->lim.gpSession[i].valid)
+        {
+            return(pMac->lim.gpSession[i].vhtCapability);  
+        }
+    }
+#endif
+    return FALSE;
+}
+/*--------------------------------------------------------------------------
+  \brief peGetCurrentChannel() - Returns the  channel number for scanning, 
+                                from a valid session.
+   This function itrates the session Table and returns the channel number 
+   from first valid session if no sessions are valid/present  it returns zero
+
+  \param pMac                   - pointer to global adapter context
+  \return                       - channel to scan from valid session else zero.
+  \sa
+  --------------------------------------------------------------------------*/
+tANI_U8 peGetCurrentChannel(tpAniSirGlobal pMac)
+{
+    tANI_U8 i;
+    //assumption here is that all the sessions will be on the same channel.
+    //This function will not work, once we have multiple channel support.
+    for(i =0; i < pMac->lim.maxBssId; i++)
+    {
+        if(pMac->lim.gpSession[i].valid)
+        {
+            return(pMac->lim.gpSession[i].currentOperChannel);
+        }
+    }
+    return(HAL_INVALID_CHANNEL_ID);
+}
+
 
 /*--------------------------------------------------------------------------
+
   \brief peValidateJoinReq() - validates the Join request .
 
   This function is called to validate the Join Request for a BT-AMP station. If start BSS session is present
@@ -179,7 +232,7 @@
           //Skip the sessionId that is to be joined.
           continue;
         }
-        //if snother ession is valid and it is on different channel
+        //if another ession is valid and it is on different channel
         //it is an off channel operation.
         if( (pMac->lim.gpSession[i].valid) && 
             (pMac->lim.gpSession[i].currentOperChannel != 
@@ -193,22 +246,156 @@
 
 }
 
+/*--------------------------------------------------------------------------
+  \brief peGetActiveSessionChannel() - Gets the operating channel of first  
+                                    valid session. Returns 0 if there is no
+									valid session.
+
+  \param pMac                   - pointer to global adapter context
+  
+  \return tANI_U8               - operating channel.
+  
+  \sa
+  --------------------------------------------------------------------------*/
+void
+peGetActiveSessionChannel (tpAniSirGlobal pMac, tANI_U8* resumeChannel, ePhyChanBondState* resumePhyCbState)
+{
+    tANI_U8 i;
+
+    // Initialize the pointers passed to INVALID values in case we don't find a valid session
+    *resumeChannel = 0;
+    *resumePhyCbState = 0;
+    for(i =0; i < pMac->lim.maxBssId; i++)
+    {
+        if(pMac->lim.gpSession[i].valid)
+        {
+            *resumeChannel = pMac->lim.gpSession[i].currentOperChannel;
+            *resumePhyCbState = pMac->lim.gpSession[i].htSecondaryChannelOffset;
+            
+#ifdef WLAN_FEATURE_11AC
+            if ((pMac->lim.gpSession[i].vhtCapability))
+            {
+               /*Get 11ac cbState from 11n cbState*/
+                *resumePhyCbState = limGet11ACPhyCBState(pMac, 
+                                    pMac->lim.gpSession[i].currentOperChannel,
+                                    pMac->lim.gpSession[i].htSecondaryChannelOffset);
+            }
+#endif
+        }
+    }
+    return;
+}
+
+/*--------------------------------------------------------------------------
+  \brief limIsChanSwitchRunning() - Check if channel switch is running on any  
+                                    valid session.
+
+  \param pMac                   - pointer to global adapter context
+  
+  \return tANI_U8               - 1 - if chann switching running.
+                                  0 - if chann switching is not running. 
+  
+  \sa
+  --------------------------------------------------------------------------*/
 tANI_U8
-peGetActiveSessionChannel (tpAniSirGlobal pMac)
+limIsChanSwitchRunning (tpAniSirGlobal pMac)
 {
     tANI_U8 i;
 
     for(i =0; i < pMac->lim.maxBssId; i++)
     {
-        //if snother ession is valid and it is on different channel
-        //it is an off channel operation.
-        if(pMac->lim.gpSession[i].valid)
+        if(pMac->lim.gpSession[i].valid && 
+            pMac->lim.gpSession[i].gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
         {
-            return pMac->lim.gpSession[i].currentOperChannel;
+            return 1;
         }
     }
-
     return 0;
+}
+/*--------------------------------------------------------------------------
+  \brief limIsInQuietDuration() - Check if channel quieting is running on any  
+                                    valid session.
 
+  \param pMac                   - pointer to global adapter context
+  
+  \return tANI_U8               - 1 - if chann quiet running.
+                                  0 - if chann quiet is not running. 
+  
+  \sa
+  --------------------------------------------------------------------------*/
+tANI_U8
+limIsInQuietDuration (tpAniSirGlobal pMac)
+{
+    tANI_U8 i;
+
+    for(i =0; i < pMac->lim.maxBssId; i++)
+    {
+        if(pMac->lim.gpSession[i].valid && 
+            pMac->lim.gpSession[i].gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING)
+        {
+            return 1;
+        }
+    }
+    return 0;
+}
+/*--------------------------------------------------------------------------
+  \brief limIsQuietBegin() - Check if channel quieting is begining on any  
+                                    valid session.
+
+  \param pMac                   - pointer to global adapter context
+  
+  \return tANI_U8               - 1 - if chann quiet running.
+                                  0 - if chann quiet is not running. 
+  
+  \sa
+  --------------------------------------------------------------------------*/
+tANI_U8
+limIsQuietBegin (tpAniSirGlobal pMac)
+{
+    tANI_U8 i;
+
+    for(i =0; i < pMac->lim.maxBssId; i++)
+    {
+        if(pMac->lim.gpSession[i].valid && 
+            pMac->lim.gpSession[i].gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN)
+        {
+            return 1;
+        }
+    }
+    return 0;
 }
 
+/*--------------------------------------------------------------------------
+  \brief limIsInMCC() - Check if Device is in MCC.
+
+  \param pMac                   - pointer to global adapter context
+  
+  \return tANI_U8               - TRUE - if in MCC.
+                                  FALSE - NOT in MCC. 
+  
+  \sa
+  --------------------------------------------------------------------------*/
+tANI_U8
+limIsInMCC (tpAniSirGlobal pMac)
+{
+    tANI_U8 i;
+    tANI_U8 chan = 0;
+
+    for(i = 0; i < pMac->lim.maxBssId; i++)
+    {
+        //if another session is valid and it is on different channel
+        //it is an off channel operation.
+        if( (pMac->lim.gpSession[i].valid) )
+        { 
+            if( chan == 0 )
+            {
+                chan = pMac->lim.gpSession[i].currentOperChannel;
+            } 
+            else if( chan != pMac->lim.gpSession[i].currentOperChannel)
+            {
+                return TRUE; 
+            }        
+        }
+    }
+    return FALSE;
+}
diff --git a/CORE/MAC/src/pe/lim/limSessionUtils.h b/CORE/MAC/src/pe/lim/limSessionUtils.h
index 4127827..47484b0 100644
--- a/CORE/MAC/src/pe/lim/limSessionUtils.h
+++ b/CORE/MAC/src/pe/lim/limSessionUtils.h
@@ -58,6 +58,20 @@
 /*------------------------------------------------------------------------- 
   Function declarations and documenation
   ------------------------------------------------------------------------*/
+/*--------------------------------------------------------------------------
+  
+          \brief peGetVhtCapable() - Returns the Vht capable from a valid session.
+ 
+          This function itrates the session Table and returns the VHT capable from first valid session
+          if no sessions are valid/present  it returns FALSE
+
+         \param pMac	                - pointer to global adapter context
+          \return                        - channel to scan from valid session else zero.
+          
+          \sa
+           
+ --------------------------------------------------------------------------*/
+   tANI_U8 peGetVhtCapable(tpAniSirGlobal pMac);
 
 
 /*--------------------------------------------------------------------------
@@ -130,7 +144,68 @@
 isLimSessionOffChannel(tpAniSirGlobal pMac, tANI_U8 sessionId);
 /* --------------------------------------------------------------------------*/
 
+/*--------------------------------------------------------------------------
+  \brief peGetActiveSessionChannel() - Gets the first valid sessions primary and secondary
+                                        channel. If not found returns invalid channel ID (=0)
+  \param pMac              - pointer to global adapter context
+  \param resumeChannel     - Primary channel of the first valid session. This is an output argument.
+  \return resumePhyCbState - Secondary channel of the first valid session. This is an output argument.
+--------------------------------------------------------------------------*/
+void
+peGetActiveSessionChannel(tpAniSirGlobal pMac, tANI_U8* resumeChannel, ePhyChanBondState* resumePhyCbState);
+
+/*--------------------------------------------------------------------------
+  \brief limIsChanSwitchRunning() - Check if channel switch is running on any  
+                                    valid session.
+
+  \param pMac                   - pointer to global adapter context
+  
+  \return tANI_U8               - 1 - if chann switching running.
+                                  0 - if chann switching is not running. 
+  
+  \sa
+  --------------------------------------------------------------------------*/
 tANI_U8
-peGetActiveSessionChannel( tpAniSirGlobal pMac );
+limIsChanSwitchRunning (tpAniSirGlobal pMac);
+
+/*--------------------------------------------------------------------------
+  \brief limIsInQuietDuration() - Check if channel quieting is running on any  
+                                    valid session.
+
+  \param pMac                   - pointer to global adapter context
+  
+  \return tANI_U8               - 1 - if chann quiet running.
+                                  0 - if chann quiet is not running. 
+  
+  \sa
+  --------------------------------------------------------------------------*/
+tANI_U8
+limIsInQuietDuration (tpAniSirGlobal pMac);
+
+/*--------------------------------------------------------------------------
+  \brief limIsQuietBegin() - Check if channel quieting is begining on any  
+                                    valid session.
+
+  \param pMac                   - pointer to global adapter context
+  
+  \return tANI_U8               - 1 - if chann quiet running.
+                                  0 - if chann quiet is not running. 
+  
+  \sa
+  --------------------------------------------------------------------------*/
+tANI_U8
+limIsQuietBegin (tpAniSirGlobal pMac);
+/*--------------------------------------------------------------------------
+  \brief limIsInMCC() - Check if Device is in MCC.
+
+  \param pMac                   - pointer to global adapter context
+  
+  \return tANI_U8               - TRUE - if in MCC.
+                                  FALSE - NOT in MCC. 
+  
+  \sa
+  --------------------------------------------------------------------------*/
+tANI_U8
+limIsInMCC (tpAniSirGlobal pMac);
 #endif //#if !defined( __LIM_SESSION_UTILS_H )
 
diff --git a/CORE/MAC/src/pe/lim/limSmeReqUtils.c b/CORE/MAC/src/pe/lim/limSmeReqUtils.c
index f0a687e..653a76d 100644
--- a/CORE/MAC/src/pe/lim/limSmeReqUtils.c
+++ b/CORE/MAC/src/pe/lim/limSmeReqUtils.c
@@ -836,6 +836,22 @@
         goto end;
     }
 
+    /*
+       Reject Join Req if the Self Mac Address and 
+       the Ap's Mac Address is same
+    */
+    if( palEqualMemory( pMac->hHdd, (tANI_U8* ) pJoinReq->selfMacAddr, 
+                       (tANI_U8 *) pJoinReq->bssDescription.bssId, 
+                       (tANI_U8) (sizeof(tSirMacAddr))))
+    {
+        // Log the event
+        limLog(pMac, LOGE,
+               FL("received SME_JOIN_REQ with Self Mac and BSSID Same\n"));
+
+        valid = false;
+        goto end;
+    }
+
 end:
     return valid;
 } /*** end limIsSmeJoinReqValid() ***/
diff --git a/CORE/MAC/src/pe/lim/limTimerUtils.c b/CORE/MAC/src/pe/lim/limTimerUtils.c
index fd0b2a5..e2003cf 100644
--- a/CORE/MAC/src/pe/lim/limTimerUtils.c
+++ b/CORE/MAC/src/pe/lim/limTimerUtils.c
@@ -895,7 +895,7 @@
 {
     tANI_U32    val=0, val1=0;
 
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, timerId));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, NO_SESSION, timerId));
 
     switch (timerId)
     {
@@ -920,6 +920,7 @@
                        FL("Unable to deactivate min channel timer\n"));
             }
 
+#if 0
             // If a background was triggered via Quiet BSS,
             // then we need to adjust the MIN and MAX channel
             // timer's accordingly to the Quiet duration that
@@ -933,6 +934,7 @@
             }
             else
             {
+#endif
                 if(pMac->lim.gpLimMlmScanReq)
                 {
                     val = SYS_MS_TO_TICKS(pMac->lim.gpLimMlmScanReq->minChannelTime);
@@ -943,7 +945,9 @@
                     //No need to change min timer. This is not a scan
                     break;
                 }
+#if 0
             }
+#endif
 
             if (tx_timer_change(&pMac->lim.limTimers.gLimMinChannelTimer,
                                 val, 0) != TX_SUCCESS)
@@ -993,6 +997,7 @@
             // was specified
             if (pMac->lim.gLimSystemRole != eLIM_AP_ROLE)
             {
+#if 0
 
                 if( eLIM_QUIET_RUNNING == pMac->lim.gLimSpecMgmt.quietState &&
                     pMac->lim.gLimTriggerBackgroundScanDuringQuietBss )
@@ -1003,6 +1008,7 @@
                 }
                 else
                 {
+#endif
                     if(pMac->lim.gpLimMlmScanReq)
                     {
                         val = SYS_MS_TO_TICKS(pMac->lim.gpLimMlmScanReq->maxChannelTime);
@@ -1013,7 +1019,9 @@
                         //No need to change max timer. This is not a scan
                         break;
                     }
+#if 0
                 }
+#endif
             }
 #endif
 #if defined(ANI_PRODUCT_TYPE_AP)
@@ -1415,6 +1423,7 @@
             break;
 
 #endif
+#if 0
         case eLIM_CHANNEL_SWITCH_TIMER:
             if (tx_timer_deactivate(&pMac->lim.limTimers.gLimChannelSwitchTimer) != eSIR_SUCCESS)
             {
@@ -1430,6 +1439,7 @@
                 return;
             }
             break;
+#endif
 
         case eLIM_LEARN_DURATION_TIMER:
 #ifdef ANI_PRODUCT_TYPE_AP
@@ -1484,6 +1494,7 @@
 #endif
             break;
 
+#if 0
         case eLIM_QUIET_BSS_TIMER:
             if (TX_SUCCESS !=
             tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietBssTimer))
@@ -1519,7 +1530,7 @@
                     FL( "Unable to change gLimQuietTimer! Will still attempt to re-activate anyway...\n" ));
             }
             break;
-
+#endif
 
 #ifdef WLAN_SOFTAP_FEATURE
 #if 0
@@ -1635,7 +1646,7 @@
 {
     tANI_U32    val, val1;
 
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_HEART_BEAT_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, psessionEntry->peSessionId, eLIM_HEART_BEAT_TIMER));
 
     if (tx_timer_deactivate(&pMac->lim.limTimers.gLimHeartBeatTimer) != TX_SUCCESS)
         limLog(pMac, LOGP, FL("Fail to deactivate HeartBeatTimer \n"));
@@ -1679,7 +1690,7 @@
     PELOG3(limLog(pMac, LOG3, FL("Rxed Heartbeat. Count=%d\n"), psessionEntry->LimRxedBeaconCntDuringHB);)
 
     limHeartBeatDeactivateAndChangeTimer(pMac, psessionEntry);
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_HEART_BEAT_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_HEART_BEAT_TIMER));
 
     //only start the hearbeat-timer if the timeout value is non-zero
     if(pMac->lim.limTimers.gLimHeartBeatTimer.initScheduleTimeInMsecs > 0) {
@@ -1850,7 +1861,7 @@
 limDeactivateAndChangePerStaIdTimer(tpAniSirGlobal pMac, tANI_U32 timerId, tANI_U16 staId)
 {
     tANI_U32    val;
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, timerId));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, NO_SESSION, timerId));
 
     switch (timerId)
     {
@@ -1995,7 +2006,7 @@
 
 void limActivateCnfTimer(tpAniSirGlobal pMac, tANI_U16 staId, tpPESession psessionEntry)
 {
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_CNF_WAIT_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_CNF_WAIT_TIMER));
     pMac->lim.limTimers.gpLimCnfWaitTimer[staId].sessionId = psessionEntry->peSessionId;
     if (tx_timer_activate(&pMac->lim.limTimers.gpLimCnfWaitTimer[staId])
                 != TX_SUCCESS)
@@ -2027,7 +2038,7 @@
 
 void limActivateAuthRspTimer(tpAniSirGlobal pMac, tLimPreAuthNode *pAuthNode)
 {
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_AUTH_RESP_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_AUTH_RESP_TIMER));
     if (tx_timer_activate(&pAuthNode->timer) != TX_SUCCESS)
     {
         /// Could not activate auth rsp timer.
diff --git a/CORE/MAC/src/pe/lim/limTypes.h b/CORE/MAC/src/pe/lim/limTypes.h
index cebffee..3f08943 100644
--- a/CORE/MAC/src/pe/lim/limTypes.h
+++ b/CORE/MAC/src/pe/lim/limTypes.h
@@ -100,6 +100,10 @@
 #define LIM_MLM_REMOVEKEY_REQ  LIM_MLM_MSG_START + 39
 #define LIM_MLM_REMOVEKEY_CNF  LIM_MLM_MSG_START + 40
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+#define LIM_MLM_OEM_DATA_REQ            LIM_MLM_MSG_START + 41
+#define LIM_MLM_OEM_DATA_CNF            LIM_MLM_MSG_START + 42
+#endif
 
 #define LIM_HASH_ADD            0
 #define LIM_HASH_UPDATE         1
@@ -174,7 +178,7 @@
     tANI_U8               dtimPeriod;
     tSirMacCfParamSet     cfParamSet;
     tSirMacChanNum        channelNumber;
-    tAniCBSecondaryMode   cbMode;
+    ePhyChanBondState     cbMode;
     tANI_U16              atimWindow;
     tSirMacRateSet        rateSet;
     tANI_U8               sessionId; //Added For BT-AMP Support   
@@ -244,8 +248,6 @@
     tSirRSNie            rsnIE;
     tSirAddie            addIE; // additional IE recevied from the peer, which possibly includes WSC IE and/or P2P IE.
     tSirMacCapabilityInfo capabilityInfo;
-    tAniTitanHtCapabilityInfo titanHtCaps;
-
     tAniBool                spectrumMgtIndicator;
     tSirMacPowerCapInfo     powerCap;
     tSirSupChnl             supportedChannels;
@@ -300,8 +302,6 @@
     tSirRSNie            rsnIE;
     tSirAddie            addIE; // additional IE recevied from the peer, which can be WSC IE and/or P2P IE.
     tSirMacCapabilityInfo capabilityInfo;
-    tAniTitanHtCapabilityInfo titanHtCaps;
-
     tAniBool                spectrumMgtIndicator;
     tSirMacPowerCapInfo     powerCap;
     tSirSupChnl             supportedChannels;
@@ -647,11 +647,8 @@
 
 void limGetRandomBssid(tpAniSirGlobal pMac ,tANI_U8 *data);
 
-// Function to handle CB CFG parameter updates
-void handleCBCFGChange( tpAniSirGlobal pMac, tANI_U32 cfgId );
-
 // Function to handle HT and HT IE CFG parameter intializations
-void handleHTCapabilityandHTInfo(struct sAniSirGlobal *pMac);
+void handleHTCapabilityandHTInfo(struct sAniSirGlobal *pMac, tpPESession psessionEntry);
 
 // Function to handle CFG parameter updates
 void limHandleCFGparamUpdate(tpAniSirGlobal, tANI_U32);
@@ -675,7 +672,6 @@
 // Function to cleanup LMM state machine
 void limCleanupLmm(tpAniSirGlobal);
 
-
 // Management frame handling functions
 void limProcessBeaconFrame(tpAniSirGlobal, tANI_U8 *,tpPESession);
 void limProcessBeaconFrameNoSession(tpAniSirGlobal, tANI_U8 *);
@@ -734,8 +730,8 @@
 void limContinueChannelScan(tpAniSirGlobal);
 tSirResultCodes limMlmAddBss(tpAniSirGlobal, tLimMlmStartReq *,tpPESession psessionEntry);
 
-#if (WNI_POLARIS_FW_PACKAGE == ADVANCED) && defined(ANI_PRODUCT_TYPE_AP)
-tSirRetStatus limSendChannelSwitchMgmtFrame(tpAniSirGlobal, tSirMacAddr, tANI_U8, tANI_U8, tANI_U8);
+#if 1 //(WNI_POLARIS_FW_PACKAGE == ADVANCED) && defined(ANI_PRODUCT_TYPE_AP)
+tSirRetStatus limSendChannelSwitchMgmtFrame(tpAniSirGlobal, tSirMacAddr, tANI_U8, tANI_U8, tANI_U8, tpPESession);
 #endif
 
 #if defined WLAN_FEATURE_VOWIFI
@@ -789,11 +785,15 @@
 void limSetScanMode(tpAniSirGlobal pMac);
 
 /// Function that Switches the Channel and sets the CB Mode 
-void limSetChannel(tpAniSirGlobal pMac, tANI_U32 titanHtcap, tANI_U8 channel, tPowerdBm maxTxPower, tANI_U8 peSessionId);
+void limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId);
 
 /// Function that completes channel scan
 void limCompleteMlmScan(tpAniSirGlobal, tSirResultCodes);
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/// Funtion that sets system into meas mode for oem data req
+void limSetOemDataReqMode(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data);
+#endif
 
 #ifdef ANI_SUPPORT_11H
 /// Function that sends Measurement Report action frame
@@ -811,11 +811,6 @@
 void limProcessMlmAddStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQt,tpPESession psessionEntry);
 void limProcessMlmDelStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ );
 void limProcessMlmDelBssRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,tpPESession);
-#ifdef ANI_PRODUCT_TYPE_AP
-void limProcessApMlmAddStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ );
-void limProcessApMlmDelStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ );
-void limProcessApMlmDelBssRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ );
-#endif
 void limProcessStaMlmAddStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ ,tpPESession psessionEntry);
 void limProcessStaMlmDelStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,tpPESession psessionEntry);
 void limProcessStaMlmDelBssRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ ,tpPESession psessionEntry);
@@ -1077,7 +1072,7 @@
 void limSendSmeMgmtFrameInd(
                     tpAniSirGlobal pMac, tANI_U8 frameType,
                     tANI_U8  *frame, tANI_U32 frameLen, tANI_U16 sessionId,
-                    tANI_U32 rxChan);
+                    tANI_U32 rxChan, tpPESession psessionEntry);
 void limProcessRemainOnChnTimeout(tpAniSirGlobal pMac);
 void limSendP2PActionFrame(tpAniSirGlobal pMac, tpSirMsgQ pMsg);
 void limAbortRemainOnChan(tpAniSirGlobal pMac);
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index ea634e9..d0f8d04 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -442,6 +442,12 @@
             return "eWNI_SME_SYS_READY_IND\n";
         case eWNI_SME_SCAN_REQ:
             return "eWNI_SME_SCAN_REQ\n";
+#ifdef FEATURE_OEM_DATA_SUPPORT
+        case eWNI_SME_OEM_DATA_REQ:
+            return "eWNI_SME_OEM_DATA_REQ\n";
+        case eWNI_SME_OEM_DATA_RSP:
+            return "eWNI_SME_OEM_DATA_RSP\n";
+#endif
         case eWNI_SME_SCAN_RSP:
             return "eWNI_SME_SCAN_RSP\n";
         case eWNI_SME_JOIN_REQ:
@@ -539,10 +545,6 @@
         case eWNI_SME_DELTS_IND:
             return "eWNI_SME_DELTS_IND\n";
 
-        case SIR_LIM_RESUME_ACTIVITY_NTF:
-            return "SIR_LIM_RESUME_ACTIVITY_NTF\n";
-        case SIR_LIM_SUSPEND_ACTIVITY_REQ:
-            return "SIR_LIM_SUSPEND_ACTIVITY_REQ\n";
         case WDA_SUSPEND_ACTIVITY_RSP:
             return "WDA_SUSPEND_ACTIVITY_RSP\n";
         case SIR_LIM_RETRY_INTERRUPT_MSG:
@@ -571,22 +573,10 @@
             return "SIR_LIM_REASSOC_FAIL_TIMEOUT\n";
         case SIR_LIM_HEART_BEAT_TIMEOUT:
             return "SIR_LIM_HEART_BEAT_TIMEOUT\n";
-#ifdef ANI_PRODUCT_TYPE_AP
-        case SIR_LIM_PREAUTH_CLNUP_TIMEOUT:
-            return "SIR_LIM_PREAUTH_CLNUP_TIMEOUT\n";
-#endif
         case SIR_LIM_ADDTS_RSP_TIMEOUT:
             return "SIR_LIM_ADDTS_RSP_TIMEOUT\n";
         case SIR_LIM_CHANNEL_SCAN_TIMEOUT:
             return "SIR_LIM_CHANNEL_SCAN_TIMEOUT\n";
-#if defined(ANI_PRODUCT_TYPE_AP) && (WNI_POLARIS_FW_PACKAGE == ADVANCED)
-        case SIR_LIM_MEASUREMENT_IND_TIMEOUT:
-            return "SIR_LIM_MEASUREMENT_IND_TIMEOUT\n";
-        case SIR_LIM_LEARN_INTERVAL_TIMEOUT:
-            return "SIR_LIM_LEARN_INTERVAL_TIMEOUT\n";
-        case SIR_LIM_LEARN_DURATION_TIMEOUT:
-            return "SIR_LIM_LEARN_DURATION_TIMEOUT\n";
-#endif
         case SIR_LIM_LINK_TEST_DURATION_TIMEOUT:
             return "SIR_LIM_LINK_TEST_DURATION_TIMEOUT\n";
         case SIR_LIM_HASH_MISS_THRES_TIMEOUT:
@@ -895,7 +885,7 @@
 void
 limInitMlm(tpAniSirGlobal pMac)
 {
-    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
+    MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
 
     /// Initialize scan result hash table
     limReInitScanResults(pMac); //sep26th review
@@ -1358,7 +1348,7 @@
     **/
     if (pMac->lim.gLimDeferredMsgQ.size > 0)
     {
-        PELOGW(limLog(pMac, LOGW, FL("%d Deferred messages (type 0x%x, scan %d, sme %d, mlme %d, addts %d)\n"),
+        PELOGW(limLog(pMac, LOGW, FL("%d Deferred messages (type 0x%x, scan %d, global sme %d, global mlme %d, addts %d)\n"),
                pMac->lim.gLimDeferredMsgQ.size, limMsg->type,
                limIsSystemInScanState(pMac),
                pMac->lim.gLimSmeState, pMac->lim.gLimMlmState,
@@ -1467,7 +1457,7 @@
            pMac->lim.gLimDeferredMsgQ.size, pMac->lim.gLimDeferredMsgQ.read,
            msg->type);)
 
-   PELOG1(limLog(pMac, LOG1, FL("DQ msg -- scan %d, sme %d, mlme %d, addts %d\n"),
+   PELOG1(limLog(pMac, LOG1, FL("DQ msg -- scan %d, global sme %d, global mlme %d, addts %d\n"),
            limIsSystemInScanState(pMac),
            pMac->lim.gLimSmeState, pMac->lim.gLimMlmState,
            pMac->lim.gLimAddtsSent);)
@@ -1898,7 +1888,7 @@
     {
         //We are 11N. we need to protect from 11A and Ht20. we don't need any other protection in 5 GHZ.
         //HT20 case is common between both the bands and handled down as common code.
-        if(true == psessionEntry->htCapabality)
+        if(true == psessionEntry->htCapability)
         {
             //we are 11N and 11A station is joining.        
             //protection from 11A required.            
@@ -1915,7 +1905,7 @@
 
         //We are 11G. Check if we need protection from 11b Stations.
         if ((phyMode == WNI_CFG_PHY_MODE_11G) &&
-              (false == psessionEntry->htCapabality))
+              (false == psessionEntry->htCapability))
         {
 
             if (pStaDs->erpEnabled== eHAL_CLEAR)
@@ -1928,7 +1918,7 @@
         }
 
         //HT station.
-        if (true == psessionEntry->htCapabality)
+        if (true == psessionEntry->htCapability)
         {
             //check if we need protection from 11b station
             if ((pStaDs->erpEnabled == eHAL_CLEAR) &&
@@ -1953,7 +1943,7 @@
     }
 
     //we are HT and HT station is joining. This code is common for both the bands.
-    if((true == psessionEntry->htCapabality) &&
+    if((true == psessionEntry->htCapability) &&
         (true == pStaDs->mlmStaContext.htCapability))
     {
         if(!pStaDs->htGreenfield)
@@ -2144,18 +2134,21 @@
     tpDphHashNode    pStaDs;
     tANI_U32 phyMode;
     tANI_U32 val;
-    tANI_U32 cShortSlot;
     tANI_U16 i;
 
     // check whether to enable protection or not
     pStaDs = dphLookupHashEntry(pMac, peerMacAddr, &tmpAid, &psessionEntry->dph.dphHashTable);
     limGetPhyMode(pMac, &phyMode, psessionEntry);
 
+    /* Only in case of softap in 11g mode, slot time might change depending on the STA being added. In 11a case, it should
+     * be always 1 and in 11b case, it should be always 0
+     */
     if (pStaDs != NULL && phyMode == WNI_CFG_PHY_MODE_11G)
     {
-        if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, &cShortSlot) != eSIR_SUCCESS)
-            limLog(pMac, LOGP, FL("unable to get short slot time\n"));
-
+        /* Only when the new STA has short slot time disabled, we need to change softap's overall slot time settings
+         * else the default for softap is always short slot enabled. When the last long slot STA leaves softAP, we take care of
+         * it in limDecideShortSlot
+         */
         if (pStaDs->shortSlotTimeEnabled == eHAL_CLEAR)
         {
             PELOG1(limLog(pMac, LOG1, FL("Short Slot Time is not enabled in Assoc Req from "));
@@ -2234,27 +2227,28 @@
             wlan_cfgGetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, &val);
 
 #ifdef WLAN_SOFTAP_FEATURE
+            /* Here we check if we are AP role and short slot enabled (both admin and oper modes) but we have atleast one STA connected with
+             * only long slot enabled, we need to change our beacon/pb rsp to broadcast short slot disabled
+             */
             if ( (psessionEntry->limSystemRole == eLIM_AP_ROLE) && 
-                 (val && psessionEntry->gLimNoShortSlotParams.numNonShortSlotSta && cShortSlot))
+                 (val && psessionEntry->gLimNoShortSlotParams.numNonShortSlotSta && psessionEntry->shortSlotTimeSupported))
             {
                 // enable long slot time
                 pBeaconParams->fShortSlotTime = false;
                 pBeaconParams->paramChangeBitmap |= PARAM_SHORT_SLOT_TIME_CHANGED;
                 PELOG1(limLog(pMac, LOG1, FL("Disable short slot time. Enable long slot time.\n"));)
-                if (cfgSetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, false) != eSIR_SUCCESS)
-                    PELOGE(limLog(pMac, LOGE,   FL("could not update short slot time at CFG\n"));)
+                psessionEntry->shortSlotTimeSupported = false;
             }
             else if ( psessionEntry->limSystemRole != eLIM_AP_ROLE)
 #endif            
             {
-                if (val && pMac->lim.gLimNoShortSlotParams.numNonShortSlotSta && cShortSlot)
+                if (val && pMac->lim.gLimNoShortSlotParams.numNonShortSlotSta && psessionEntry->shortSlotTimeSupported)
                 {
                     // enable long slot time
                     pBeaconParams->fShortSlotTime = false;
                     pBeaconParams->paramChangeBitmap |= PARAM_SHORT_SLOT_TIME_CHANGED;
                     PELOG1(limLog(pMac, LOG1, FL("Disable short slot time. Enable long slot time.\n"));)
-                    if (cfgSetInt(pMac, WNI_CFG_SHORT_SLOT_TIME, false) != eSIR_SUCCESS)
-                        PELOGE(limLog(pMac, LOGE,   FL("could not update short slot time at CFG\n"));)
+                    psessionEntry->shortSlotTimeSupported = false;
                  }
             }
         }
@@ -2414,7 +2408,7 @@
             }
         }
         //following code block is only for HT station.
-        if((psessionEntry->htCapabality) &&
+        if((psessionEntry->htCapability) &&
               (pBeaconStruct->HTInfo.present))
         {
             tDot11fIEHTInfo htInfo = pBeaconStruct->HTInfo;
@@ -2457,7 +2451,7 @@
     }
 
     //protection related factors other than HT operating mode. Applies to 2.4 GHZ as well as 5 GHZ.
-    if((psessionEntry->htCapabality) &&
+    if((psessionEntry->htCapability) &&
           (pBeaconStruct->HTInfo.present))
     {
         tDot11fIEHTInfo htInfo = pBeaconStruct->HTInfo;
@@ -2492,7 +2486,7 @@
     if(SIR_BAND_5_GHZ == rfBand)
     {
         //we are HT capable.
-        if((true == psessionEntry->htCapabality) &&
+        if((true == psessionEntry->htCapability) &&
             (pBeaconStruct->HTInfo.present))
         {
             //we are HT capable, AP's HT OPMode is mixed / overlap legacy ==> need protection from 11A.        
@@ -2542,7 +2536,7 @@
          }
 
         //following code block is only for HT station.
-        if((psessionEntry->htCapabality) &&
+        if((psessionEntry->htCapability) &&
               (pBeaconStruct->HTInfo.present))
         {
           
@@ -2586,7 +2580,7 @@
     }
 
     //following code block is only for HT station. ( 2.4 GHZ as well as 5 GHZ)
-    if((psessionEntry->htCapabality) &&
+    if((psessionEntry->htCapability) &&
           (pBeaconStruct->HTInfo.present))
     {
         tDot11fIEHTInfo htInfo = pBeaconStruct->HTInfo;    
@@ -2648,7 +2642,7 @@
 {
     tpPESession psessionEntry = NULL;
 #if defined(ANI_PRODUCT_TYPE_CLIENT) || defined(ANI_AP_CLIENT_SDK)
-    tANI_U8    channel = pMac->lim.gLimChannelSwitch.primaryChannel;   // This is received and stored from channelSwitch Action frame
+    tANI_U8    channel; // This is received and stored from channelSwitch Action frame
    
     if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimChannelSwitchTimer.sessionId))== NULL) 
     {
@@ -2661,6 +2655,7 @@
         PELOGW(limLog(pMac, LOGW, "Channel switch can be done only in STA role, Current Role = %d\n", psessionEntry->limSystemRole);)
         return;
     }
+    channel = psessionEntry->gLimChannelSwitch.primaryChannel;
     /*
      *  This potentially can create issues if the function tries to set
      * channel while device is in power-save, hence putting an extra check
@@ -2673,10 +2668,10 @@
     }
          
     // Restore Channel Switch parameters to default
-    pMac->lim.gLimChannelSwitch.switchTimeoutValue = 0;
+    psessionEntry->gLimChannelSwitch.switchTimeoutValue = 0;
 
     /* Channel-switch timeout has occurred. reset the state */
-    pMac->lim.gLimSpecMgmt.dot11hChanSwState = eLIM_11H_CHANSW_END;
+    psessionEntry->gLimSpecMgmt.dot11hChanSwState = eLIM_11H_CHANSW_END;
     
     /* Check if the AP is switching to a channel that we support.
      * Else, just don't bother to switch. Indicate HDD to look for a 
@@ -2700,28 +2695,28 @@
                         eSIR_MAC_UNSPEC_FAILURE_REASON);
         return;
     }
-    switch(pMac->lim.gLimChannelSwitch.state)
+    switch(psessionEntry->gLimChannelSwitch.state)
     {
         case eLIM_CHANNEL_SWITCH_PRIMARY_ONLY:
             PELOGW(limLog(pMac, LOGW, FL("CHANNEL_SWITCH_PRIMARY_ONLY \n"));)
-            limSwitchPrimaryChannel(pMac, pMac->lim.gLimChannelSwitch.primaryChannel,psessionEntry);
-            pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_IDLE;
+            limSwitchPrimaryChannel(pMac, psessionEntry->gLimChannelSwitch.primaryChannel,psessionEntry);
+            psessionEntry->gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_IDLE;
             break;
 
         case eLIM_CHANNEL_SWITCH_SECONDARY_ONLY:
             PELOGW(limLog(pMac, LOGW, FL("CHANNEL_SWITCH_SECONDARY_ONLY \n"));)
-            limSwitchPrimarySecondaryChannel(pMac,
+            limSwitchPrimarySecondaryChannel(pMac, psessionEntry,
                                              psessionEntry->currentOperChannel,
-                                             pMac->lim.gLimChannelSwitch.secondarySubBand);
-            pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_IDLE;
+                                             psessionEntry->gLimChannelSwitch.secondarySubBand);
+            psessionEntry->gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_IDLE;
             break;
 
         case eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY:
             PELOGW(limLog(pMac, LOGW, FL("CHANNEL_SWITCH_PRIMARY_AND_SECONDARY\n"));)
-            limSwitchPrimarySecondaryChannel(pMac,
-                                             pMac->lim.gLimChannelSwitch.primaryChannel,
-                                             pMac->lim.gLimChannelSwitch.secondarySubBand);
-            pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_IDLE;
+            limSwitchPrimarySecondaryChannel(pMac, psessionEntry,
+                                             psessionEntry->gLimChannelSwitch.primaryChannel,
+                                             psessionEntry->gLimChannelSwitch.secondarySubBand);
+            psessionEntry->gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_IDLE;
             break;
 
         case eLIM_CHANNEL_SWITCH_IDLE:
@@ -2734,7 +2729,7 @@
             return;  /* Please note, this is 'return' and not 'break' */
     }
 #endif
-    }
+}
 
 /**
  * limUpdateChannelSwitch()
@@ -2754,18 +2749,11 @@
 {
 
     tANI_U16                         beaconPeriod;
-    tANI_U32                         val;
     tChannelSwitchPropIEStruct       *pPropChnlSwitch;
     tDot11fIEChanSwitchAnn           *pChnlSwitch;
 
  
-
-    if (wlan_cfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &val) != eSIR_SUCCESS)
-    {
-        limLog(pMac, LOGP, FL("Could not retrieve Beacon interval\n"));
-        return;
-    }
-    beaconPeriod = (tANI_U16) val;
+    beaconPeriod = psessionEntry->beaconParams.beaconInterval;
 
     /* STA either received proprietary channel switch IE or 802.11h
      * standard channel switch IE.
@@ -2776,53 +2764,42 @@
 
         /* Add logic to determine which change this is:  */
         /*      primary, secondary, both.  For now assume both. */
-        pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY;
-        pMac->lim.gLimChannelSwitch.primaryChannel = pPropChnlSwitch->primaryChannel;
-        pMac->lim.gLimChannelSwitch.secondarySubBand = (tAniCBSecondaryMode)pPropChnlSwitch->subBand;
-        pMac->lim.gLimChannelSwitch.switchCount = pPropChnlSwitch->channelSwitchCount;
-        pMac->lim.gLimChannelSwitch.switchTimeoutValue =
+        psessionEntry->gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY;
+        psessionEntry->gLimChannelSwitch.primaryChannel = pPropChnlSwitch->primaryChannel;
+        psessionEntry->gLimChannelSwitch.secondarySubBand = (ePhyChanBondState)pPropChnlSwitch->subBand;
+        psessionEntry->gLimChannelSwitch.switchCount = pPropChnlSwitch->channelSwitchCount;
+        psessionEntry->gLimChannelSwitch.switchTimeoutValue =
                  SYS_MS_TO_TICKS(beaconPeriod)* (pPropChnlSwitch->channelSwitchCount);
-        pMac->lim.gLimChannelSwitch.switchMode = pPropChnlSwitch->mode;
+        psessionEntry->gLimChannelSwitch.switchMode = pPropChnlSwitch->mode;
     }
     else
     {
        pChnlSwitch = &(pBeacon->channelSwitchIE);
-       pMac->lim.gLimChannelSwitch.primaryChannel = pChnlSwitch->newChannel;
-       pMac->lim.gLimChannelSwitch.switchCount = pChnlSwitch->switchCount;
-       pMac->lim.gLimChannelSwitch.switchTimeoutValue =
+       psessionEntry->gLimChannelSwitch.primaryChannel = pChnlSwitch->newChannel;
+       psessionEntry->gLimChannelSwitch.switchCount = pChnlSwitch->switchCount;
+       psessionEntry->gLimChannelSwitch.switchTimeoutValue =
                  SYS_MS_TO_TICKS(beaconPeriod)* (pChnlSwitch->switchCount);
-       pMac->lim.gLimChannelSwitch.switchMode = pChnlSwitch->switchMode; 
+       psessionEntry->gLimChannelSwitch.switchMode = pChnlSwitch->switchMode; 
 
         /* Only primary channel switch element is present */
-        pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_ONLY;
-        pMac->lim.gLimChannelSwitch.secondarySubBand = eANI_CB_SECONDARY_NONE;
+        psessionEntry->gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_ONLY;
+        psessionEntry->gLimChannelSwitch.secondarySubBand = PHY_SINGLE_CHANNEL_CENTERED;
 
         /* Do not bother to look and operate on extended channel switch element
          * if our own channel-bonding state is not enabled
          */
-        if(GET_CB_ADMIN_STATE(pMac->lim.gCbState))
+        if (psessionEntry->htSupportedChannelWidthSet)
         {
             if (pBeacon->extChannelSwitchPresent)
             {
-                switch(pBeacon->extChannelSwitchIE.secondaryChannelOffset)
+                if ((pBeacon->extChannelSwitchIE.secondaryChannelOffset == PHY_DOUBLE_CHANNEL_LOW_PRIMARY) || 
+                    (pBeacon->extChannelSwitchIE.secondaryChannelOffset == PHY_DOUBLE_CHANNEL_HIGH_PRIMARY))
                 {
-                    case eHT_SECONDARY_CHANNEL_OFFSET_UP:
-                        pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY;
-                        pMac->lim.gLimChannelSwitch.secondarySubBand = eANI_CB_SECONDARY_UP;
-                        break;
-
-                    case eHT_SECONDARY_CHANNEL_OFFSET_DOWN:
-                        pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY;
-                        pMac->lim.gLimChannelSwitch.secondarySubBand = eANI_CB_SECONDARY_DOWN;
-                        break;
-
-                    case eHT_SECONDARY_CHANNEL_OFFSET_NONE:
-                    default:
-                        /* Nothing to be done here as of now!! */
-                        break;
+                    psessionEntry->gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY;
+                    psessionEntry->gLimChannelSwitch.secondarySubBand = pBeacon->extChannelSwitchIE.secondaryChannelOffset;
                 }
-           }
-       }
+            }
+        }
     }
 
     if (eSIR_SUCCESS != limStartChannelSwitch(pMac, psessionEntry))
@@ -2831,11 +2808,12 @@
     }
 
     limLog(pMac, LOGW,
-        FL("primary chl %d, subband %d, count  %d (%d ticks) \n"),
-        pMac->lim.gLimChannelSwitch.primaryChannel,
-        pMac->lim.gLimChannelSwitch.secondarySubBand,
-        pMac->lim.gLimChannelSwitch.switchCount,
-        pMac->lim.gLimChannelSwitch.switchTimeoutValue);
+        FL("session %d primary chl %d, subband %d, count  %d (%d ticks) \n"),
+        psessionEntry->peSessionId,
+        psessionEntry->gLimChannelSwitch.primaryChannel,
+        psessionEntry->gLimChannelSwitch.secondarySubBand,
+        psessionEntry->gLimChannelSwitch.switchCount,
+        psessionEntry->gLimChannelSwitch.switchTimeoutValue);
     return;
 }
 
@@ -2864,7 +2842,7 @@
         return;
         
     PELOGW(limLog(pMac, LOGW, FL("Received a beacon without channel switch IE\n"));)
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_CHANNEL_SWITCH_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, psessionEntry->peSessionId, eLIM_CHANNEL_SWITCH_TIMER));
 
     if (tx_timer_deactivate(&pMac->lim.limTimers.gLimChannelSwitchTimer) != eSIR_SUCCESS)
     {
@@ -2894,17 +2872,17 @@
     if (psessionEntry->limSystemRole != eLIM_STA_ROLE)
         return;
 
-    if (pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN) 
+    if (psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN) 
     {
-         MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_QUIET_TIMER));
+         MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, psessionEntry->peSessionId, eLIM_QUIET_TIMER));
         if (tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietTimer) != TX_SUCCESS)
         {
             PELOGE(limLog(pMac, LOGE, FL("tx_timer_deactivate failed\n"));)
         }
     }
-    else if (pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING)
+    else if (psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING)
     {
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_QUIET_BSS_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, psessionEntry->peSessionId, eLIM_QUIET_BSS_TIMER));
         if (tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietBssTimer) != TX_SUCCESS)
         {
             PELOGE(limLog(pMac, LOGE, FL("tx_timer_deactivate failed\n"));)
@@ -2913,14 +2891,14 @@
          * If the channel switch is already running in silent mode, dont resume the
          * transmission. Channel switch timer when timeout, transmission will be resumed.
          */
-        if(!((pMac->lim.gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING) &&
-                (pMac->lim.gLimChannelSwitch.switchMode == eSIR_CHANSW_MODE_SILENT)))
+        if(!((psessionEntry->gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING) &&
+                (psessionEntry->gLimChannelSwitch.switchMode == eSIR_CHANSW_MODE_SILENT)))
         {
             limFrameTransmissionControl(pMac, eLIM_TX_ALL, eLIM_RESUME_TX);
-            limRestorePreQuietState(pMac);
+            limRestorePreQuietState(pMac, psessionEntry);
         }
     }
-    pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
+    psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
 #endif
 }
 
@@ -2955,25 +2933,40 @@
  */
 void limProcessQuietTimeout(tpAniSirGlobal pMac)
 {
-#ifdef GEN6_TODO
     //fetch the sessionEntry based on the sessionId
     //priority - MEDIUM
-    tpPESession sessionEntry;
+    tpPESession psessionEntry;
 
-    if((sessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimQuietTimer.sessionId))== NULL) 
+    if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimQuietTimer.sessionId))== NULL) 
     {
-        limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
+        limLog(pMac, LOGE,FL("Session Does not exist for given sessionID\n"));
         return;
     }
-#endif
 
-  PELOG1(limLog(pMac, LOG1, FL("quietState = %d\n"), pMac->lim.gLimSpecMgmt.quietState);)
-  switch( pMac->lim.gLimSpecMgmt.quietState )
+  PELOG1(limLog(pMac, LOG1, FL("quietState = %d\n"), psessionEntry->gLimSpecMgmt.quietState);)
+  switch( psessionEntry->gLimSpecMgmt.quietState )
   {
     case eLIM_QUIET_BEGIN:
       // Time to Stop data traffic for quietDuration
-      limDeactivateAndChangeTimer(pMac, eLIM_QUIET_BSS_TIMER);
-      MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_QUIET_BSS_TIMER));
+      //limDeactivateAndChangeTimer(pMac, eLIM_QUIET_BSS_TIMER);
+      if (TX_SUCCESS !=
+      tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietBssTimer))
+      {
+          limLog( pMac, LOGE,
+            FL("Unable to de-activate gLimQuietBssTimer! Will attempt to activate anyway...\n"));
+      }
+
+      // gLimQuietDuration appears to be in units of ticks
+      // Use it as is
+      if (TX_SUCCESS !=
+          tx_timer_change( &pMac->lim.limTimers.gLimQuietBssTimer,
+            psessionEntry->gLimSpecMgmt.quietDuration,
+            0))
+      {
+          limLog( pMac, LOGE,
+            FL("Unable to change gLimQuietBssTimer! Will still attempt to activate anyway...\n"));
+      }
+      MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_QUIET_BSS_TIMER));
 #ifdef GEN6_TODO
         /* revisit this piece of code to assign the appropriate sessionId below
          * priority - HIGH
@@ -2989,7 +2982,7 @@
       else
       {
         // Transition to eLIM_QUIET_RUNNING
-        pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_RUNNING;
+        psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_RUNNING;
 
         /* If we have sta bk scan triggered and trigger bk scan actually started successfully, */
         /* print message, otherwise, stop data traffic and stay quiet */
@@ -3007,7 +3000,7 @@
 
            limLog( pMac, LOG2,
                 FL("Quiet BSS: STA shutting down for %d ticks\n"),
-                pMac->lim.gLimSpecMgmt.quietDuration );
+                psessionEntry->gLimSpecMgmt.quietDuration );
         }
       }
       break;
@@ -3063,57 +3056,57 @@
  */
 void limProcessQuietBssTimeout( tpAniSirGlobal pMac )
 {
-    tpPESession sessionEntry;
+    tpPESession psessionEntry;
 
-    if((sessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimQuietBssTimer.sessionId))== NULL) 
+    if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimQuietBssTimer.sessionId))== NULL) 
     {
         limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
         return;
     }
 
-  PELOG1(limLog(pMac, LOG1, FL("quietState = %d\n"), pMac->lim.gLimSpecMgmt.quietState);)
-  if (eLIM_AP_ROLE == sessionEntry->limSystemRole)
+  PELOG1(limLog(pMac, LOG1, FL("quietState = %d\n"), psessionEntry->gLimSpecMgmt.quietState);)
+  if (eLIM_AP_ROLE == psessionEntry->limSystemRole)
   {
 #ifdef ANI_PRODUCT_TYPE_AP
     if (!pMac->sys.gSysEnableLearnMode)
     {
-        pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_END;
+        psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_END;
         return;
     }
 
-    if( eLIM_QUIET_INIT == pMac->lim.gLimSpecMgmt.quietState )
+    if( eLIM_QUIET_INIT == psessionEntry->gLimSpecMgmt.quietState )
     {
         //QuietCount = 0 is reserved
-        pMac->lim.gLimSpecMgmt.quietCount  = 2;
+        psessionEntry->gLimSpecMgmt.quietCount  = 2;
         // In ms.
-        pMac->lim.gLimSpecMgmt.quietDuration = 
+        psessionEntry->gLimSpecMgmt.quietDuration = 
         pMac->lim.gpLimMeasReq->measDuration.shortChannelScanDuration;
         // TU is in multiples of 1024 (2^10) us.
-        pMac->lim.gLimSpecMgmt.quietDuration_TU = 
-            SYS_MS_TO_TU(pMac->lim.gLimSpecMgmt.quietDuration); 
+        psessionEntry->gLimSpecMgmt.quietDuration_TU = 
+            SYS_MS_TO_TU(psessionEntry->gLimSpecMgmt.quietDuration); 
         // Transition to eLIM_QUIET_BEGIN
         limLog( pMac, LOG2, FL("Quiet BSS state = eLIM_QUIET_BEGIN\n"));
-        pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_BEGIN;
+        psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_BEGIN;
     }
 #endif
   }
   else
   {
     // eLIM_STA_ROLE
-    switch( pMac->lim.gLimSpecMgmt.quietState )
+    switch( psessionEntry->gLimSpecMgmt.quietState )
     {
       case eLIM_QUIET_RUNNING:
         // Transition to eLIM_QUIET_INIT
-        pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
+        psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
 
         if( !pMac->lim.gLimTriggerBackgroundScanDuringQuietBss || (glimTriggerBackgroundScanDuringQuietBss_Status == eSIR_FALSE) )
         {
           // Resume data traffic only if channel switch is not running in silent mode.
-          if (!((pMac->lim.gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING) &&
-                  (pMac->lim.gLimChannelSwitch.switchMode == eSIR_CHANSW_MODE_SILENT)))
+          if (!((psessionEntry->gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING) &&
+                  (psessionEntry->gLimChannelSwitch.switchMode == eSIR_CHANSW_MODE_SILENT)))
           {
               limFrameTransmissionControl(pMac, eLIM_TX_ALL, eLIM_RESUME_TX);
-              limRestorePreQuietState(pMac);
+              limRestorePreQuietState(pMac, psessionEntry);
           }
       
           /* Reset status flag */
@@ -3141,8 +3134,8 @@
         PELOG2(limLog(pMac, LOG2, FL("Quiet state not in RUNNING\n"));)
         /* If the quiet period has ended, then resume the frame transmission */
         limFrameTransmissionControl(pMac, eLIM_TX_ALL, eLIM_RESUME_TX);
-        limRestorePreQuietState(pMac);
-        pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
+        limRestorePreQuietState(pMac, psessionEntry);
+        psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
         break;
 
       default:
@@ -3244,8 +3237,8 @@
         return;
     
    PELOG1(limLog(pMac, LOG1, FL("Quiet state = %d, Quiet Count = %d\n"),
-        pMac->lim.gLimSpecMgmt.quietState, pQuietIE->count);)
-    if (!pMac->lim.gLim11hEnable)
+        psessionEntry->gLimSpecMgmt.quietState, pQuietIE->count);)
+    if (!psessionEntry->lim11hEnable)
         return;
     // The (Titan) AP is requesting this (Titan) STA to
     // honor this Quiet IE REQ and shut-off Tx/Rx. If we're
@@ -3267,26 +3260,26 @@
         beaconPeriod = (tANI_U16) val;
 
      /* (qd * 2^10)/1000 */
-    pMac->lim.gLimSpecMgmt.quietDuration_TU = pQuietIE->duration;
+    psessionEntry->gLimSpecMgmt.quietDuration_TU = pQuietIE->duration;
     // The STA needs to shut-off Tx/Rx "for" this interval (in milliSeconds)
     /* Need to convert from TU to system TICKS */
-    pMac->lim.gLimSpecMgmt.quietDuration = SYS_MS_TO_TICKS(
-                           SYS_TU_TO_MS(pMac->lim.gLimSpecMgmt.quietDuration_TU));
+    psessionEntry->gLimSpecMgmt.quietDuration = SYS_MS_TO_TICKS(
+                           SYS_TU_TO_MS(psessionEntry->gLimSpecMgmt.quietDuration_TU));
 
-    if (pMac->lim.gLimSpecMgmt.quietDuration_TU == 0)
+    if (psessionEntry->gLimSpecMgmt.quietDuration_TU == 0)
     {
         PELOG1(limLog(pMac, LOG1, FL("Zero duration in quiet IE\n"));)
         return;
     }
     
     // The STA needs to shut-off Tx/Rx "after" this interval
-    pMac->lim.gLimSpecMgmt.quietTimeoutValue =
+    psessionEntry->gLimSpecMgmt.quietTimeoutValue =
               (beaconPeriod * pQuietIE->count) + pQuietIE->offset;
 
     limLog( pMac, LOG2,
         FL( "STA shut-off will begin in %d milliseconds & last for %d ticks\n"),
-        pMac->lim.gLimSpecMgmt.quietTimeoutValue,
-        pMac->lim.gLimSpecMgmt.quietDuration );
+        psessionEntry->gLimSpecMgmt.quietTimeoutValue,
+        psessionEntry->gLimSpecMgmt.quietDuration );
 
     /* Disable, Stop background scan if enabled and running */
     limDeactivateAndChangeTimer(pMac, eLIM_BACKGROUND_SCAN_TIMER);
@@ -3308,7 +3301,7 @@
         }
         else
         {
-            limRestorePreQuietState(pMac);
+            limRestorePreQuietState(pMac, psessionEntry);
         }
     }
     else
@@ -3319,7 +3312,7 @@
     }
     
     // Transition to eLIM_QUIET_BEGIN
-    pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_BEGIN;
+    psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_BEGIN;
 #endif
 }
 
@@ -3348,17 +3341,29 @@
     // First, de-activate Timer, if its already active
     limCancelDot11hQuiet(pMac, psessionEntry);
     
-    limDeactivateAndChangeTimer(pMac, eLIM_QUIET_TIMER);
-    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_QUIET_TIMER));
+    MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, sessionId, eLIM_QUIET_TIMER));
+    if( TX_SUCCESS != tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietTimer))
+    {
+        limLog( pMac, LOGE,
+            FL( "Unable to deactivate gLimQuietTimer! Will still attempt to re-activate anyway...\n" ));
+    }
+
+    // Set the NEW timeout value, in ticks
+    if( TX_SUCCESS != tx_timer_change( &pMac->lim.limTimers.gLimQuietTimer,
+                      SYS_MS_TO_TICKS(psessionEntry->gLimSpecMgmt.quietTimeoutValue), 0))
+    {
+        limLog( pMac, LOGE,
+            FL( "Unable to change gLimQuietTimer! Will still attempt to re-activate anyway...\n" ));
+    }
     
     pMac->lim.limTimers.gLimQuietTimer.sessionId = sessionId;
     if( TX_SUCCESS != tx_timer_activate(&pMac->lim.limTimers.gLimQuietTimer))
     {
         limLog( pMac, LOGE,
             FL("Unable to activate gLimQuietTimer! STA cannot honor Quiet BSS!\n"));
-        limRestorePreQuietState(pMac);
+        limRestorePreQuietState(pMac, psessionEntry);
 
-        pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
+        psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
         return;
     }
 #endif
@@ -3468,59 +3473,6 @@
     schEdcaProfileUpdate(pMac, psessionEntry);
 }
 
-/** -------------------------------------------------------------
-\fn limGetHtCbAdminState
-\brief provides CB Admin state
-\param     tpAniSirGlobal    pMac
-\param     tDot11fIEHTCaps htCaps,
-\param     tANI_U8 *titanHtCaps 
-\return     none
-  -------------------------------------------------------------*/
-void limGetHtCbAdminState( tpAniSirGlobal pMac,
-        tDot11fIEHTCaps htCaps,
-        tANI_U8 *titanHtCaps )
-{
-    // Extract secondary channel info wrt Channel Bonding
-    if(htCaps.supportedChannelWidthSet)
-        SME_SET_CB_ADMIN_STATE( *titanHtCaps, eHAL_SET );    
-    else
-        SME_SET_CB_ADMIN_STATE( *titanHtCaps, eHAL_CLEAR);
-    
-
-  // And the final TITAN HT capabilities bitmap is...
-  limLog( pMac, LOG2,
-      FL("TITAN HT capabilities in BSS Description = %1d\n"),
-        *titanHtCaps);
-}
-/** -------------------------------------------------------------
-\fn limGetHtCbOpState
-\brief provides CB operational state
-\param     tpAniSirGlobal    pMac
-\param     tDot11fIEHTInfo htInfo,
-\param     tANI_U8 *titanHtCaps
-\return     none
-  -------------------------------------------------------------*/
-void limGetHtCbOpState( tpAniSirGlobal pMac,
-        tDot11fIEHTInfo htInfo,
-        tANI_U8 *titanHtCaps )
-{
-    // Extract secondary channel info wrt Channel Bonding
-    if(htInfo.secondaryChannelOffset)
-    {
-      if(PHY_DOUBLE_CHANNEL_LOW_PRIMARY == htInfo.secondaryChannelOffset)
-          SME_SET_CB_OPER_STATE( *titanHtCaps,
-            eANI_CB_SECONDARY_UP );
-      else if(PHY_DOUBLE_CHANNEL_HIGH_PRIMARY == htInfo.secondaryChannelOffset)
-          SME_SET_CB_OPER_STATE( *titanHtCaps,
-            eANI_CB_SECONDARY_DOWN );
-    }
-
-  // And the final TITAN HT capabilities bitmap is...
-  limLog( pMac, LOG2,
-      FL("TITAN HT capabilities in BSS Description = %1d\n"),
-        *titanHtCaps);
-}
-
 /**
  * limSwitchChannelCback()
  *
@@ -3541,9 +3493,6 @@
    tSirMsgQ    mmhMsg = {0};
    tSirSmeSwitchChannelInd *pSirSmeSwitchChInd;
 
-   PELOG1(limLog(pMac, LOG1,FL("Sending message %s with reasonCode %s\n"),
-                    limMsgStr(msgType), limResultCodeStr(resultCode));)
-
    psessionEntry->currentOperChannel = psessionEntry->currentReqChannel; 
    
    /* We need to restore pre-channelSwitch state on the STA */
@@ -3562,14 +3511,14 @@
   
    pSirSmeSwitchChInd->messageType = eWNI_SME_SWITCH_CHL_REQ;
    pSirSmeSwitchChInd->length = sizeof(tSirSmeSwitchChannelInd);
-   pSirSmeSwitchChInd->newChannelId = pMac->lim.gLimChannelSwitch.primaryChannel;
+   pSirSmeSwitchChInd->newChannelId = psessionEntry->gLimChannelSwitch.primaryChannel;
    pSirSmeSwitchChInd->sessionId = psessionEntry->smeSessionId;
    //BSS ID
    palCopyMemory( pMac->hHdd, pSirSmeSwitchChInd->bssId, psessionEntry->bssId, sizeof(tSirMacAddr));
    mmhMsg.bodyptr = pSirSmeSwitchChInd;
    mmhMsg.bodyval = 0;
    
-   MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+   MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, mmhMsg.type));
    
 #if defined( FEATURE_WLAN_INTEGRATED_SOC )
    SysProcessMmhMsg(pMac, &mmhMsg);
@@ -3611,7 +3560,7 @@
     pMac->lim.gpchangeChannelData = NULL;
 
 #if defined WLAN_FEATURE_VOWIFI  
-    limSendSwitchChnlParams(pMac, newChannel, eHT_SECONDARY_CHANNEL_OFFSET_NONE,
+    limSendSwitchChnlParams(pMac, newChannel, PHY_SINGLE_CHANNEL_CENTERED,
                                                    psessionEntry->maxTxPower, psessionEntry->peSessionId);
 #else
     if(wlan_cfgGetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, &localPwrConstraint) != eSIR_SUCCESS)
@@ -3619,7 +3568,7 @@
         limLog( pMac, LOGP, FL( "Unable to read Local Power Constraint from cfg\n" ));
         return;
     }
-    limSendSwitchChnlParams(pMac, newChannel, eHT_SECONDARY_CHANNEL_OFFSET_NONE,
+    limSendSwitchChnlParams(pMac, newChannel, PHY_SINGLE_CHANNEL_CENTERED,
                                                    (tPowerdBm)localPwrConstraint, psessionEntry->peSessionId);
 #endif
     return;
@@ -3644,13 +3593,12 @@
  *                       - eANI_CB_SECONDARY_DOWN
  * @return NONE
  */
-void limSwitchPrimarySecondaryChannel(tpAniSirGlobal pMac, tANI_U8 newChannel, tAniCBSecondaryMode subband)
+void limSwitchPrimarySecondaryChannel(tpAniSirGlobal pMac, tpPESession psessionEntry, tANI_U8 newChannel, ePhyChanBondState subband)
 {
 #if !defined WLAN_FEATURE_VOWIFI  
     tANI_U32 localPwrConstraint;
 #endif
 
-    tpPESession psessionEntry =  &pMac->lim.gpSession[0]; //TBD-RAJESH HOW TO GET sessionEntry?????
 #if !defined WLAN_FEATURE_VOWIFI  
     if(wlan_cfgGetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, &localPwrConstraint) != eSIR_SUCCESS) {
         limLog( pMac, LOGP, FL( "Unable to get Local Power Constraint from cfg\n" ));
@@ -3658,95 +3606,36 @@
     }
 #endif
 
-    switch(subband)
-    {
-        case eANI_CB_SECONDARY_NONE:
-            PELOGW(limLog(pMac, LOGW, FL("Disable CB SECONDARY\n"));)
-            /* If CB was on, turn it off, otherwise, do nothing */
-            if(GET_CB_OPER_STATE(pMac->lim.gCbState))
-            {
-                /* Turn off CB in HW and SW.  SW and HW cbstate must match!  Otherwise, will hit ASSERT case */
-                SET_CB_OPER_STATE(pMac->lim.gCbState, eHAL_CLEAR);
-                /* Clean up station entry if we're not STA */
-            }
-            if (cfgSetInt(pMac, WNI_CFG_CB_SECONDARY_CHANNEL_STATE, WNI_CFG_CB_SECONDARY_CHANNEL_STATE_NONE) != eSIR_SUCCESS)
-                limLog(pMac, LOGP, FL("cfgSetInt WNI_CFG_CB_SECONDARY_CHANNEL_STATE failed \n"));
-
 #if defined WLAN_FEATURE_VOWIFI  
-            limSendSwitchChnlParams(pMac, newChannel, eHT_SECONDARY_CHANNEL_OFFSET_NONE, psessionEntry->maxTxPower, psessionEntry->peSessionId);
+                limSendSwitchChnlParams(pMac, newChannel, subband, psessionEntry->maxTxPower, psessionEntry->peSessionId);
 #else
-            //Send Message to HAL to update the channel
-            limSendSwitchChnlParams(pMac, newChannel, eHT_SECONDARY_CHANNEL_OFFSET_NONE, (tPowerdBm)localPwrConstraint, psessionEntry->peSessionId);
+                limSendSwitchChnlParams(pMac, newChannel, subband, (tPowerdBm)localPwrConstraint, psessionEntry->peSessionId);
 #endif
-            break;
 
-        case eANI_CB_SECONDARY_UP:
-            PELOGW(limLog(pMac, LOGW, FL("Switch CB SECONDARY to UP.\n"));)
-            SET_CB_SEC_CHANNEL(pMac->lim.gCbState, eHAL_SET);
-            if (cfgSetInt(pMac, WNI_CFG_CB_SECONDARY_CHANNEL_STATE, WNI_CFG_CB_SECONDARY_CHANNEL_STATE_HIGHER) != eSIR_SUCCESS)
-                limLog(pMac, LOGP, FL("cfgSetInt WNI_CFG_CB_SECONDARY_CHANNEL_STATE failed \n"));
-
-            /* If CB was off, turn it on, otherwise, do nothing */
-            if(!GET_CB_OPER_STATE(pMac->lim.gCbState))
-            {
-                /* Turn on CB in HW and SW.  SW and HW cbstate must match!  Otherwise, will hit ASSERT case */
-                SET_CB_OPER_STATE(pMac->lim.gCbState, eHAL_SET);
-            }
-            //Send Message to HAL to update the channel
-            //enums for secondary channel offset for Titan and 11n are different
-#if defined WLAN_FEATURE_VOWIFI  
-            limSendSwitchChnlParams(pMac, newChannel, eHT_SECONDARY_CHANNEL_OFFSET_UP, psessionEntry->maxTxPower, psessionEntry->peSessionId);
-#else
-            limSendSwitchChnlParams(pMac, newChannel, eHT_SECONDARY_CHANNEL_OFFSET_UP, (tPowerdBm)localPwrConstraint, psessionEntry->peSessionId);
-#endif
-            break;
-
-        case eANI_CB_SECONDARY_DOWN:
-            PELOGW(limLog(pMac, LOGW, FL("Switch CB SECONDARY to LOWER.\n"));)
-            SET_CB_SEC_CHANNEL(pMac->lim.gCbState, eHAL_CLEAR);
-            if (cfgSetInt(pMac, WNI_CFG_CB_SECONDARY_CHANNEL_STATE, WNI_CFG_CB_SECONDARY_CHANNEL_STATE_LOWER) != eSIR_SUCCESS)
-                limLog(pMac, LOGP, FL("cfgSetInt WNI_CFG_CB_SECONDARY_CHANNEL_STATE failed \n"));
-            /* If CB was off, turn it on, otherwise, do nothing */
-            if(!GET_CB_OPER_STATE(pMac->lim.gCbState))
-            {
-                /* Turn on CB in HW and SW.  SW and HW cbstate must match!  Otherwise, will hit ASSERT case */
-                SET_CB_OPER_STATE(pMac->lim.gCbState, eHAL_SET);
-                /* Update station entry if we're not STA */
-            }
-            //Send Message to HAL to update the channel
-            //enums for secondary channel offset for Titan and 11n are different
-#if defined WLAN_FEATURE_VOWIFI  
-            limSendSwitchChnlParams(pMac, newChannel, eHT_SECONDARY_CHANNEL_OFFSET_NONE, psessionEntry->maxTxPower, psessionEntry->peSessionId);
-#else
-            limSendSwitchChnlParams(pMac, newChannel, eHT_SECONDARY_CHANNEL_OFFSET_DOWN, (tPowerdBm)localPwrConstraint, psessionEntry->peSessionId);
-#endif
-            break;
-
-        case eANI_DONOT_USE_SECONDARY_MODE:
-            break;
-    }
-
-
-    // We should only be changing primary and secondary channels on the fly
-    // if this is 11h enabled.
-    if (
-#if 0
-        pMac->lim.gLim11hEnable &&
-#endif
-        psessionEntry->currentOperChannel != newChannel)
+    // Store the new primary and secondary channel in session entries if different
+    if (psessionEntry->currentOperChannel != newChannel)
     {
         limLog(pMac, LOGW,
             FL("switch old chnl %d --> new chnl %d \n"),
             psessionEntry->currentOperChannel, newChannel);
-
-        #if 0
-
-        if (cfgSetInt(pMac, WNI_CFG_CURRENT_CHANNEL, newChannel) != eSIR_SUCCESS)
-            limLog(pMac, LOGP, FL("set CURRENT_CHANNEL at CFG fail.\n"));
-        #endif // TO SUPPORT BT-AMP
-
         psessionEntry->currentOperChannel = newChannel;
     }
+    if (psessionEntry->htSecondaryChannelOffset != subband)
+    {
+        limLog(pMac, LOGW,
+            FL("switch old sec chnl %d --> new sec chnl %d \n"),
+            psessionEntry->htSecondaryChannelOffset, subband);
+        psessionEntry->htSecondaryChannelOffset = subband;
+        if (psessionEntry->htSecondaryChannelOffset == PHY_SINGLE_CHANNEL_CENTERED)
+        {
+            psessionEntry->htSupportedChannelWidthSet = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
+        }
+        else
+        {
+            psessionEntry->htSupportedChannelWidthSet = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
+        }
+        psessionEntry->htRecommendedTxWidthSet = psessionEntry->htSupportedChannelWidthSet;
+    }
 
     return;
 }
@@ -3847,7 +3736,7 @@
     if (psessionEntry->limSystemRole != eLIM_STA_ROLE)
         return bScanTriggered;
     
-    if( !pMac->lim.gLim11hEnable )
+    if( !psessionEntry->lim11hEnable )
     {
         tSirMacChanNum bgScanChannelList[WNI_CFG_BG_SCAN_CHANNEL_LIST_LEN];
         tANI_U32 len = WNI_CFG_BG_SCAN_CHANNEL_LIST_LEN;
@@ -4035,7 +3924,7 @@
       break;
 
     case eHT_SUPPORTED_CHANNEL_WIDTH_SET:
-      retVal = (tANI_U8) macHTCapabilityInfo.supportedChannelWidthSet;
+      retVal = (tANI_U8) psessionEntry->htSupportedChannelWidthSet;
       break;
 
     case eHT_ADVANCED_CODING:
@@ -4083,11 +3972,11 @@
       break;
 
     case eHT_RECOMMENDED_TX_WIDTH_SET:
-      retVal = pMac->lim.gHTRecommendedTxWidthSet;
+      retVal = psessionEntry->htRecommendedTxWidthSet;
       break;
 
     case eHT_EXTENSION_CHANNEL_OFFSET:
-      retVal = pMac->lim.gHTSecondaryChannelOffset;
+      retVal = psessionEntry->htSecondaryChannelOffset;
       break;
 
     case eHT_OP_MODE:
@@ -4126,20 +4015,6 @@
   return retVal;
 }
 
-#if 0
-void limSetBssid(tpAniSirGlobal pMac, tANI_U8 *bssId)
-{
-    palCopyMemory( pMac->hHdd, pMac->lim.gLimBssid, bssId, sizeof(tSirMacAddr));
-    return;
-}
-
-void limGetBssid(tpAniSirGlobal pMac, tANI_U8 *bssId)
-{
-    palCopyMemory( pMac->hHdd, bssId, pMac->lim.gLimBssid, sizeof(tSirMacAddr));
-    return;
-}
-
-#endif
 void limGetMyMacAddr(tpAniSirGlobal pMac, tANI_U8 *mac)
 {
     palCopyMemory( pMac->hHdd, mac, pMac->lim.gLimMyMacAddr, sizeof(tSirMacAddr));
@@ -4177,7 +4052,8 @@
         else
         {
             //normal protection config check
-            if(!pMac->lim.cfgProtection.fromlla)
+            if (( psessionEntry != NULL ) && (psessionEntry->limSystemRole == eLIM_AP_ROLE) &&
+                (!psessionEntry->cfgProtection.fromlla))
             {
                 // protection disabled.
                 PELOG3(limLog(pMac, LOG3, FL("protection from 11a is disabled\n"));)
@@ -4190,7 +4066,7 @@
         //If we are AP and HT capable, we need to set the HT OP mode
         //appropriately.
         if(((eLIM_AP_ROLE == psessionEntry->limSystemRole)||(eLIM_BT_AMP_AP_ROLE == psessionEntry->limSystemRole))&&
-              (true == psessionEntry->htCapabality))
+              (true == psessionEntry->htCapability))
         {
             if(overlap)
             {
@@ -4210,6 +4086,7 @@
                 if(eSIR_HT_OP_MODE_MIXED != pMac->lim.gHTOperMode)
                 {
                     pMac->lim.gHTOperMode = eSIR_HT_OP_MODE_MIXED;
+                    psessionEntry->htOperMode = eSIR_HT_OP_MODE_MIXED;
                     limEnableHtRifsProtection(pMac, true, overlap, pBeaconParams,psessionEntry);
                     limEnableHtOBSSProtection(pMac,  true, overlap, pBeaconParams,psessionEntry);         
                     
@@ -4238,7 +4115,7 @@
                 pMac->lim.gLimOverlap11aParams.protectionEnabled = false;
 
                 //We need to take care of HT OP mode iff we are HT AP.
-                if(psessionEntry->htCapabality)
+                if(psessionEntry->htCapability)
                 {
                    // no HT op mode change if any of the overlap protection enabled.
                     if(!(pMac->lim.gLimOverlap11aParams.protectionEnabled ||
@@ -4277,16 +4154,19 @@
 
                 {
                         pMac->lim.gHTOperMode = eSIR_HT_OP_MODE_OVERLAP_LEGACY;
+                        psessionEntry->htOperMode = eSIR_HT_OP_MODE_OVERLAP_LEGACY;
                         limEnableHtRifsProtection(pMac, true, overlap, pBeaconParams,psessionEntry);
                 }
                 else if(psessionEntry->gLimHt20Params.protectionEnabled)
                 {
                         pMac->lim.gHTOperMode = eSIR_HT_OP_MODE_NO_LEGACY_20MHZ_HT;
+                        psessionEntry->htOperMode = eSIR_HT_OP_MODE_NO_LEGACY_20MHZ_HT;
                         limEnableHtRifsProtection(pMac, false, overlap, pBeaconParams,psessionEntry);
                 }
                 else
                 {
                         pMac->lim.gHTOperMode = eSIR_HT_OP_MODE_PURE;
+                        psessionEntry->htOperMode = eSIR_HT_OP_MODE_PURE;
                         limEnableHtRifsProtection(pMac, false, overlap, pBeaconParams,psessionEntry);
                 }
             }
@@ -4369,7 +4249,7 @@
             {
                 psessionEntry->gLimOlbcParams.protectionEnabled = true;
                 PELOGE(limLog(pMac, LOGE, FL("protection from olbc is enabled\n"));)
-                if(true == psessionEntry->htCapabality)
+                if(true == psessionEntry->htCapability)
                 {
                     if((eSIR_HT_OP_MODE_OVERLAP_LEGACY != psessionEntry->htOperMode) &&
                             (eSIR_HT_OP_MODE_MIXED != psessionEntry->htOperMode))
@@ -4388,7 +4268,7 @@
             {
                 psessionEntry->gLim11bParams.protectionEnabled = true;
                 PELOGE(limLog(pMac, LOGE, FL("protection from 11b is enabled\n"));)
-                if(true == psessionEntry->htCapabality)
+                if(true == psessionEntry->htCapability)
                 {
                     if(eSIR_HT_OP_MODE_MIXED != psessionEntry->htOperMode)
                     {
@@ -4399,10 +4279,10 @@
                 }
             }
         }else if ((eLIM_BT_AMP_AP_ROLE == psessionEntry->limSystemRole) &&
-                (true == psessionEntry->htCapabality))
+                (true == psessionEntry->htCapability))
 #else
             if(((eLIM_AP_ROLE == psessionEntry->limSystemRole)|| (eLIM_BT_AMP_AP_ROLE == psessionEntry->limSystemRole)) &&
-                    (true == psessionEntry->htCapabality))
+                    (true == psessionEntry->htCapability))
 #endif
             {
                 if(overlap)
@@ -4454,7 +4334,7 @@
                 psessionEntry->gLimOlbcParams.protectionEnabled = false;
 
                 //We need to take care of HT OP mode if we are HT AP.
-                if(psessionEntry->htCapabality)
+                if(psessionEntry->htCapability)
                 {
                     // no HT op mode change if any of the overlap protection enabled.
                     if(!(psessionEntry->gLimOverlap11gParams.protectionEnabled ||
@@ -4532,7 +4412,7 @@
                 psessionEntry->gLimOlbcParams.protectionEnabled = false;
 
                     //We need to take care of HT OP mode iff we are HT AP.
-                    if(psessionEntry->htCapabality)
+                    if(psessionEntry->htCapability)
                     {
                         // no HT op mode change if any of the overlap protection enabled.
                         if(!(pMac->lim.gLimOverlap11gParams.protectionEnabled ||
@@ -4617,7 +4497,7 @@
 limEnableHtProtectionFrom11g(tpAniSirGlobal pMac, tANI_U8 enable,
     tANI_U8 overlap, tpUpdateBeaconParams pBeaconParams,tpPESession psessionEntry)
 {
-    if(!psessionEntry->htCapabality)
+    if(!psessionEntry->htCapability)
         return eSIR_SUCCESS; // protection from 11g is only for HT stations.
 
     //overlapping protection configuration check.
@@ -4917,7 +4797,7 @@
 {
 
 
-    if(!psessionEntry->htCapabality)
+    if(!psessionEntry->htCapability)
         return eSIR_SUCCESS; // this protection  is only for HT stations.
 
     //overlapping protection configuration check.
@@ -5009,7 +4889,7 @@
 limEnableHT20Protection(tpAniSirGlobal pMac, tANI_U8 enable,
     tANI_U8 overlap, tpUpdateBeaconParams pBeaconParams,tpPESession psessionEntry)
 {
-    if(!psessionEntry->htCapabality)
+    if(!psessionEntry->htCapability)
         return eSIR_SUCCESS; // this protection  is only for HT stations.
 
         //overlapping protection configuration check.
@@ -5237,7 +5117,7 @@
 limEnableHTNonGfProtection(tpAniSirGlobal pMac, tANI_U8 enable,
     tANI_U8 overlap, tpUpdateBeaconParams pBeaconParams,tpPESession psessionEntry)
 {
-    if(!psessionEntry->htCapabality)
+    if(!psessionEntry->htCapability)
         return eSIR_SUCCESS; // this protection  is only for HT stations.
 
         //overlapping protection configuration check.
@@ -5320,7 +5200,7 @@
 limEnableHTLsigTxopProtection(tpAniSirGlobal pMac, tANI_U8 enable,
     tANI_U8 overlap, tpUpdateBeaconParams pBeaconParams,tpPESession psessionEntry)
 {
-    if(!psessionEntry->htCapabality)
+    if(!psessionEntry->htCapability)
         return eSIR_SUCCESS; // this protection  is only for HT stations.
 
         //overlapping protection configuration check.
@@ -5405,7 +5285,7 @@
 limEnableHtRifsProtection(tpAniSirGlobal pMac, tANI_U8 enable,
     tANI_U8 overlap, tpUpdateBeaconParams pBeaconParams,tpPESession psessionEntry)
 {
-    if(!psessionEntry->htCapabality)
+    if(!psessionEntry->htCapability)
         return eSIR_SUCCESS; // this protection  is only for HT stations.
 
 
@@ -5597,7 +5477,7 @@
         if(VOS_IS_STATUS_SUCCESS(vosStatus))
         {
             mHdr = WDA_GET_RX_MAC_HEADER(pRxBd);
-            MTRACE(macTrace(pMac, TRACE_CODE_TX_COMPLETE, 0, mHdr->fc.subType);)
+            MTRACE(macTrace(pMac, TRACE_CODE_TX_COMPLETE, NO_SESSION, mHdr->fc.subType);)
 
         }   
     }
@@ -5635,7 +5515,7 @@
                                   tANI_U8          bssIdx,
                                   tpPESession      psessionEntry)
 {
-    tSirMacHTSecondaryChannelOffset secondaryChnlOffset = eHT_SECONDARY_CHANNEL_OFFSET_NONE;
+    ePhyChanBondState secondaryChnlOffset = PHY_SINGLE_CHANNEL_CENTERED;
 #if !defined WLAN_FEATURE_VOWIFI  
     tANI_U32 localPwrConstraint;
 #endif
@@ -5655,20 +5535,13 @@
     }
 #endif
 
-    if ( pMac->lim.gHTSecondaryChannelOffset != ( tANI_U8 ) pHTInfo->secondaryChannelOffset ||
-         pMac->lim.gHTRecommendedTxWidthSet  != ( tANI_U8 ) pHTInfo->recommendedTxWidthSet )
+    if ( psessionEntry->htSecondaryChannelOffset != ( tANI_U8 ) pHTInfo->secondaryChannelOffset ||
+         psessionEntry->htRecommendedTxWidthSet  != ( tANI_U8 ) pHTInfo->recommendedTxWidthSet )
     {
-        pMac->lim.gHTSecondaryChannelOffset = ( tSirMacHTSecondaryChannelOffset ) pHTInfo->secondaryChannelOffset;
-        pMac->lim.gHTRecommendedTxWidthSet  = ( tANI_U8 ) pHTInfo->recommendedTxWidthSet;
-        //Also update the Proprietary(Titan) CB mode settings, as this setting is used during 
-        //background scanning to set the original channel and CB mode as part of finish scan.
-        setupCBState( pMac,  limGetAniCBState(pMac->lim.gHTSecondaryChannelOffset));
-
-        // If the Channel Width is 20Mhz, set the channel offset to
-        // NONE.  If the Channel Width is 40Mhz, set the channel offset
-        // to what ever is present in beacon.
-        if ( eHT_CHANNEL_WIDTH_40MHZ == pMac->lim.gHTRecommendedTxWidthSet )
-            secondaryChnlOffset = (tSirMacHTSecondaryChannelOffset)pHTInfo->secondaryChannelOffset;
+        psessionEntry->htSecondaryChannelOffset = ( ePhyChanBondState ) pHTInfo->secondaryChannelOffset;
+        psessionEntry->htRecommendedTxWidthSet  = ( tANI_U8 ) pHTInfo->recommendedTxWidthSet;
+        if ( eHT_CHANNEL_WIDTH_40MHZ == psessionEntry->htRecommendedTxWidthSet )
+            secondaryChnlOffset = (ePhyChanBondState)pHTInfo->secondaryChannelOffset;
 
         // Notify HAL
         limLog( pMac, LOGW,  FL( "Channel Information in HT IE change"
@@ -5676,7 +5549,7 @@
         limLog( pMac, LOGW,  FL( "Primary Channel: %d, Secondary Chan"
                                  "nel Offset: %d, Channel Width: %d\n" ),
                 pHTInfo->primaryChannel, secondaryChnlOffset,
-                pMac->lim.gHTRecommendedTxWidthSet );
+                psessionEntry->htRecommendedTxWidthSet );
 
 #if defined WLAN_FEATURE_VOWIFI  
         limSendSwitchChnlParams( pMac, ( tANI_U8 ) pHTInfo->primaryChannel,
@@ -5750,15 +5623,15 @@
 void limUpdateStaRunTimeHTInfo( tpAniSirGlobal  pMac,
                                 tDot11fIEHTInfo *pHTInfo , tpPESession psessionEntry)
 {
-    if ( pMac->lim.gHTSecondaryChannelOffset != ( tANI_U8)pHTInfo->secondaryChannelOffset)
+    if ( psessionEntry->htSecondaryChannelOffset != ( tANI_U8)pHTInfo->secondaryChannelOffset)
     {
-        pMac->lim.gHTSecondaryChannelOffset = ( tSirMacHTSecondaryChannelOffset )pHTInfo->secondaryChannelOffset;
+        psessionEntry->htSecondaryChannelOffset = ( ePhyChanBondState )pHTInfo->secondaryChannelOffset;
         // Send change notification to HAL
     }
 
-    if ( pMac->lim.gHTRecommendedTxWidthSet != ( tANI_U8 )pHTInfo->recommendedTxWidthSet )
+    if ( psessionEntry->htRecommendedTxWidthSet != ( tANI_U8 )pHTInfo->recommendedTxWidthSet )
     {
-        pMac->lim.gHTRecommendedTxWidthSet = ( tANI_U8 )pHTInfo->recommendedTxWidthSet;
+        psessionEntry->htRecommendedTxWidthSet = ( tANI_U8 )pHTInfo->recommendedTxWidthSet;
         // Send change notification to HAL
     }
 
@@ -6000,7 +5873,7 @@
            psessionEntry->gLimEdcaParams[upToAc(tsinfo->traffic.userPrio)].aci.acm)
       {
         //send message to HAL to delete TS
-        if(eSIR_SUCCESS != limSendHalMsgDelTs(pMac, pSta->staIndex, tspecIdx, pDeltsReq->req))
+        if(eSIR_SUCCESS != limSendHalMsgDelTs(pMac, pSta->staIndex, tspecIdx, pDeltsReq->req, psessionEntry->peSessionId))
         {
           limLog(pMac, LOGW, FL("DelTs with UP %d failed in limSendHalMsgDelTs - ignoring request\n"),
                            tsinfo->traffic.userPrio);
@@ -6035,7 +5908,7 @@
     msg.bodyptr = pHalCB;
     msg.bodyval = 0;
     
-    MTRACE(macTraceMsgTx(pMac, 0, msg.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
     if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
     {
         palFreeMemory(pMac->hHdd, pHalCB);
@@ -6084,7 +5957,7 @@
     }
        
     //if we are not HT capable we don't need to handle BA timeout indication from HAL.
-    if( (baCandidateCnt  > pMac->lim.maxStation) || !psessionEntry->htCapabality )
+    if( (baCandidateCnt  > pMac->lim.maxStation) || !psessionEntry->htCapability )
     {
         palFreeMemory(pMac->hHdd, limMsg->bodyptr);
         return;
@@ -6194,6 +6067,7 @@
 if((psessionEntry = peFindSessionByBssid(pMac,pDelTsParam->bssId,&sessionId))== NULL)
     {
          limLog(pMac, LOGE,FL("session does not exist for given BssId\n"));
+         palFreeMemory(pMac->hHdd, (void *)(limMsg->bodyptr));
          return;
     }
 
@@ -6664,7 +6538,7 @@
   //defer any other message until we get response back.
   SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
 
-  MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+  MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
     limDiagEventReport(pMac, WLAN_PE_DIAG_HAL_ADDBA_REQ_EVENT, psessionEntry, 0, 0);
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -6757,7 +6631,7 @@
   limLog( pMac, LOGW,
       FL( "Sending SIR_HAL_DELBA_IND..." ));
 
-  MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+  MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT 
     limDiagEventReport(pMac, WLAN_PE_DIAG_HAL_DELBA_IND_EVENT, psessionEntry, 0, 0);
 #endif //FEATURE_WLAN_DIAG_SUPPORT
@@ -6837,7 +6711,7 @@
 
     limLog( pMac, LOG2, FL( "Sending WDA_SET_MIMOPS_REQ..." ));
 
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
     retCode = wdaPostCtrlMsg( pMac, &msgQ );
     if (eSIR_SUCCESS != retCode)
     {
@@ -7089,7 +6963,7 @@
     msgQ.reserved = 0;
     msgQ.type = WDA_TRANSMISSION_CONTROL_IND;
 
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
     if(wdaPostCtrlMsg( pMac, &msgQ) != eSIR_SUCCESS)
     {
         palFreeMemory(pMac->hHdd, (void *) pTxCtrlMsg);
@@ -7139,7 +7013,7 @@
         return retCode;
     
     /* Channel switch should be ready for the next time */
-    pMac->lim.gLimSpecMgmt.dot11hChanSwState = eLIM_11H_CHANSW_INIT;
+    psessionEntry->gLimSpecMgmt.dot11hChanSwState = eLIM_11H_CHANSW_INIT;
 
     /* Restore the frame transmission, all the time. */
     limFrameTransmissionControl(pMac, eLIM_TX_ALL, eLIM_RESUME_TX);
@@ -7161,7 +7035,7 @@
 
         if (val > 0 && TX_TIMER_VALID(pMac->lim.limTimers.gLimBackgroundScanTimer))
         {
-            MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_BACKGROUND_SCAN_TIMER));
+            MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_BACKGROUND_SCAN_TIMER));
             if(tx_timer_activate(&pMac->lim.limTimers.gLimBackgroundScanTimer) != TX_SUCCESS)
             {
                 limLog(pMac, LOGP, FL("Could not restart background scan timer, doing LOGP"));
@@ -7174,7 +7048,7 @@
     /* Enable heartbeat timer */
     if (TX_TIMER_VALID(pMac->lim.limTimers.gLimHeartBeatTimer))
     {
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_HEART_BEAT_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_HEART_BEAT_TIMER));
         if(limActivateHearBeatTimer(pMac) != TX_SUCCESS)
         {
             limLog(pMac, LOGP, FL("Could not restart heartbeat timer, doing LOGP"));
@@ -7193,7 +7067,7 @@
 \param pMac
 \return NONE
 ---------------------------------------------*/
-tSirRetStatus limRestorePreQuietState(tpAniSirGlobal pMac)
+tSirRetStatus limRestorePreQuietState(tpAniSirGlobal pMac, tpPESession psessionEntry)
 {
 
     tSirRetStatus retCode = eSIR_SUCCESS;
@@ -7204,10 +7078,10 @@
              return retCode;
  
     /* Quiet should be ready for the next time */
-    pMac->lim.gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
+    psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
 
     /* Restore the frame transmission, all the time. */
-    if (pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING)
+    if (psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING)
         limFrameTransmissionControl(pMac, eLIM_TX_ALL, eLIM_RESUME_TX);
 
 
@@ -7225,7 +7099,7 @@
 
         if (val > 0 && TX_TIMER_VALID(pMac->lim.limTimers.gLimBackgroundScanTimer))
         {
-            MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_BACKGROUND_SCAN_TIMER));
+            MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_BACKGROUND_SCAN_TIMER));
             if(tx_timer_activate(&pMac->lim.limTimers.gLimBackgroundScanTimer) != TX_SUCCESS)
             {
                 limLog(pMac, LOGP, FL("Could not restart background scan timer, doing LOGP"));
@@ -7238,7 +7112,7 @@
     /* Enable heartbeat timer */
     if (TX_TIMER_VALID(pMac->lim.limTimers.gLimHeartBeatTimer))
     {
-        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, 0, eLIM_HEART_BEAT_TIMER));
+        MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_HEART_BEAT_TIMER));
         if(limActivateHearBeatTimer(pMac) != TX_SUCCESS)
         {
             limLog(pMac, LOGP, FL("Could not restart heartbeat timer, doing LOGP"));
@@ -7277,7 +7151,7 @@
         return;
      
     /* Flag to indicate 11h channel switch in progress */
-    pMac->lim.gLimSpecMgmt.dot11hChanSwState = eLIM_11H_CHANSW_RUNNING;
+    psessionEntry->gLimSpecMgmt.dot11hChanSwState = eLIM_11H_CHANSW_RUNNING;
 
     /* Disable, Stop background scan if enabled and running */
     limDeactivateAndChangeTimer(pMac, eLIM_BACKGROUND_SCAN_TIMER);
@@ -7539,6 +7413,7 @@
     if((psessionEntry = peFindSessionBySessionId(pMac,pAddStaParams->sessionId))==NULL)
     {
         limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
+        palFreeMemory(pMac, pAddStaParams);
         return;
     }
     if (psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
@@ -7734,6 +7609,7 @@
    {
       /// Buffer not available. Log error
       limLog(pMac, LOGP, FL("call to palAllocateMemory failed for Add Sta self RSP\n"));
+      palFreeMemory( pMac->hHdd, (tANI_U8 *)pAddStaSelfParams);
       return;
    }
 
@@ -7750,7 +7626,7 @@
    mmhMsg.type = eWNI_SME_ADD_STA_SELF_RSP;
    mmhMsg.bodyptr = pRsp;
    mmhMsg.bodyval = 0;
-   MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+   MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
    limSysProcessMmhMsgApi(pMac, &mmhMsg,  ePROT);
 
 }
@@ -7769,6 +7645,7 @@
    {
       /// Buffer not available. Log error
       limLog(pMac, LOGP, FL("call to palAllocateMemory failed for Add Sta self RSP\n"));
+      palFreeMemory( pMac->hHdd, (tANI_U8 *)pDelStaSelfParams);
       return;
    }
 
@@ -7785,7 +7662,7 @@
    mmhMsg.type = eWNI_SME_DEL_STA_SELF_RSP;
    mmhMsg.bodyptr = pRsp;
    mmhMsg.bodyval = 0;
-   MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+   MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
    limSysProcessMmhMsgApi(pMac, &mmhMsg,  ePROT);
 
 }
@@ -7982,19 +7859,20 @@
     return 0;
         
 }
-void peSetResumeChannel(tpAniSirGlobal pMac, tANI_U16 channel, tANI_U8 cbState)
+
+void peSetResumeChannel(tpAniSirGlobal pMac, tANI_U16 channel, ePhyChanBondState phyCbState)
 {
 
    pMac->lim.gResumeChannel = channel;
-   //TODO : Save Cb State also.
-
+   pMac->lim.gResumePhyCbState = phyCbState;
 }
+
 /*--------------------------------------------------------------------------
   
   \brief peGetResumeChannel() - Returns the  channel number for scanning, from a valid session.
 
-  This function itrates the session Table and returns the channel number from first valid session
-   if no sessions are valid/present  it returns zero
+  This function returns the channel to resume to during link resume. channel id of 0 means HAL will
+  resume to previous channel before link suspend
     
   \param pMac                   - pointer to global adapter context
   \return                           - channel to scan from valid session else zero.
@@ -8002,28 +7880,28 @@
   \sa
   
   --------------------------------------------------------------------------*/
-
-tANI_U8 peGetResumeChannel(tpAniSirGlobal pMac)
-
+void peGetResumeChannel(tpAniSirGlobal pMac, tANI_U8* resumeChannel, ePhyChanBondState* resumePhyCbState)
 {
 
     //Rationale - this could be the suspend/resume for assoc and it is essential that
     //the new BSS is active for some time. Other BSS was anyway suspended.
     //TODO: Comeup with a better alternative. Sending NULL with PM=0 on other BSS means
     //there will be trouble. But since it is sent on current channel, it will be missed by peer
-    //and hence shpuld be ok. Need to discuss this further
-    if( !IS_MCC_SUPPORTED )    
+    //and hence should be ok. Need to discuss this further
+    if( !limIsInMCC(pMac) )    
     {
         //Get current active session channel
-        return peGetActiveSessionChannel(pMac);
+        peGetActiveSessionChannel(pMac, resumeChannel, resumePhyCbState);
     }
     else
     {
-        return pMac->lim.gResumeChannel;
+        *resumeChannel = pMac->lim.gResumeChannel;
+        *resumePhyCbState = pMac->lim.gResumePhyCbState;
     }
-
+    return;
 }
 
+
 #endif
 
 tANI_BOOLEAN limIsconnectedOnDFSChannel(tANI_U8 currentChannel)
diff --git a/CORE/MAC/src/pe/lim/limUtils.h b/CORE/MAC/src/pe/lim/limUtils.h
index 1aa6355..c8dd8bd 100644
--- a/CORE/MAC/src/pe/lim/limUtils.h
+++ b/CORE/MAC/src/pe/lim/limUtils.h
@@ -193,10 +193,8 @@
 
 void limStartQuietTimer(tpAniSirGlobal pMac, tANI_U8 sessionId);
 void limUpdateQuietIEFromBeacon(tpAniSirGlobal, tDot11fIEQuiet *, tpPESession);
-void limGetHtCbAdminState(tpAniSirGlobal pMac, tDot11fIEHTCaps htCaps, tANI_U8 * titanHtCaps);
-void limGetHtCbOpState(tpAniSirGlobal pMac, tDot11fIEHTInfo htInfo, tANI_U8 * titanHtCaps);
 void limSwitchPrimaryChannel(tpAniSirGlobal, tANI_U8,tpPESession);
-void limSwitchPrimarySecondaryChannel(tpAniSirGlobal, tANI_U8, tAniCBSecondaryMode);
+void limSwitchPrimarySecondaryChannel(tpAniSirGlobal, tpPESession, tANI_U8, ePhyChanBondState);
 tAniBool limTriggerBackgroundScanDuringQuietBss(tpAniSirGlobal);
 void limUpdateStaRunTimeHTSwtichChnlParams(tpAniSirGlobal pMac, tDot11fIEHTInfo *pRcvdHTInfo, tANI_U8 bssIdx);
 void limUpdateStaRunTimeHTCapability(tpAniSirGlobal pMac, tDot11fIEHTCaps *pHTCaps);
@@ -206,7 +204,7 @@
 tAniBool limIsChannelValidForChannelSwitch(tpAniSirGlobal pMac, tANI_U8 channel);
 void limFrameTransmissionControl(tpAniSirGlobal pMac, tLimQuietTxMode type, tLimControlTx mode);
 tSirRetStatus limRestorePreChannelSwitchState(tpAniSirGlobal pMac, tpPESession psessionEntry);
-tSirRetStatus limRestorePreQuietState(tpAniSirGlobal pMac);
+tSirRetStatus limRestorePreQuietState(tpAniSirGlobal pMac, tpPESession psessionEntry);
 
 void limPrepareFor11hChannelSwitch(tpAniSirGlobal pMac, tpPESession psessionEntry);
 void limSwitchChannelCback(tpAniSirGlobal pMac, eHalStatus status, 
@@ -464,13 +462,13 @@
 void limDiagEventReport(tpAniSirGlobal pMac, tANI_U16 eventType, tpPESession pSessionEntry, tANI_U16 status, tANI_U16 reasonCode);
 #endif /* FEATURE_WLAN_DIAG_SUPPORT */
 
-void peSetResumeChannel(tpAniSirGlobal pMac, tANI_U16 channel, tANI_U8 cbState);
+void peSetResumeChannel(tpAniSirGlobal pMac, tANI_U16 channel, ePhyChanBondState cbState);
 /*--------------------------------------------------------------------------
   
   \brief peGetResumeChannel() - Returns the  channel number for scanning, from a valid session.
 
-  This function itrates the session Table and returns the channel number from first valid session
-   if no sessions are valid it returns 0
+  This function returns the channel to resume to during link resume. channel id of 0 means HAL will
+  resume to previous channel before link suspend
     
   \param pMac                   - pointer to global adapter context
   \return                            - channel to scan from valid session else zero.
@@ -478,7 +476,6 @@
   \sa
   
   --------------------------------------------------------------------------*/
-tANI_U8 peGetResumeChannel(tpAniSirGlobal pMac);
-
+void peGetResumeChannel(tpAniSirGlobal pMac, tANI_U8* resumeChannel, ePhyChanBondState* resumePhyCbState);
 
 #endif /* __LIM_UTILS_H */
diff --git a/CORE/MAC/src/pe/pmm/pmmApi.c b/CORE/MAC/src/pe/pmm/pmmApi.c
index 2070549..79a4d12 100644
--- a/CORE/MAC/src/pe/pmm/pmmApi.c
+++ b/CORE/MAC/src/pe/pmm/pmmApi.c
@@ -246,7 +246,7 @@
             /* Disable heartbeat timer as well */
             if(pMac->lim.limTimers.gLimHeartBeatTimer.pMac)
             {
-                MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, 0, eLIM_HEART_BEAT_TIMER));
+                MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, NO_SESSION, eLIM_HEART_BEAT_TIMER));
                 tx_timer_deactivate(&pMac->lim.limTimers.gLimHeartBeatTimer);
             }
         }
@@ -428,8 +428,8 @@
     if ( ((pMac->pmm.gPmmState != ePMM_STATE_READY) &&
          (pMac->pmm.gPmmState != ePMM_STATE_BMPS_WAKEUP)) ||
          limIsSystemInScanState(pMac) ||
-         (pMac->lim.gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING) ||
-         (pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING))
+         limIsChanSwitchRunning(pMac) ||
+         limIsInQuietDuration(pMac) )
     {
         PELOGE(pmmLog(pMac, LOGE, 
             FL("pmmBmps: BMPS Request received in invalid state PMM=%d, SME=%d, rejecting the initpwrsave request\n"), 
@@ -524,6 +524,7 @@
     tSirRetStatus  retStatus = eSIR_SUCCESS;
     tpExitBmpsParams  pExitBmpsParams;
     tSirMsgQ msgQ;
+    tpPESession psessionEntry;
     tANI_U8  currentOperatingChannel = limGetCurrentOperatingChannel(pMac);
 
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pExitBmpsParams, sizeof(*pExitBmpsParams)) )
@@ -533,6 +534,12 @@
         return retStatus;
     }
 
+    if((psessionEntry = peGetValidPowerSaveSession(pMac)) == NULL )
+    {
+        retStatus = eSIR_FAILURE;
+        return retStatus;
+    }
+
     palZeroMemory( pMac->hHdd, (tANI_U8 *)pExitBmpsParams, sizeof(*pExitBmpsParams));
     msgQ.type = WDA_EXIT_BMPS_REQ;
     msgQ.reserved = 0;
@@ -550,11 +557,13 @@
              limIsconnectedOnDFSChannel(currentOperatingChannel))))
         pExitBmpsParams->sendDataNull = 1;
 
+    pExitBmpsParams->bssIdx = psessionEntry->bssIdx;
+   
     /* we need to defer any incoming messages until we
      * get a WDA_EXIT_BMPS_RSP from HAL.
      */
     SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
     retStatus = wdaPostCtrlMsg( pMac, &msgQ);
     if( eSIR_SUCCESS != retStatus )
     {
@@ -679,7 +688,7 @@
      */
     SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
 
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
         palFreeMemory(pMac->hHdd, pBmpsParams);
@@ -724,7 +733,7 @@
     if(pMac->lim.gLimSmeState != eLIM_SME_IDLE_STATE  )
     {
         pmmLog(pMac, LOGE,
-            FL("pmmCfg: Power Save Configuration received in invalid state %d"),
+            FL("pmmCfg: Power Save Configuration received in invalid global sme state %d"),
             pMac->lim.gLimSmeState);
         retCode = eSIR_SME_INVALID_STATE;
         goto returnFailure;
@@ -785,7 +794,7 @@
     msgQ.bodyval = 0;
 
     PELOG1(pmmLog( pMac, LOG1, FL( "pmmBmps: Sending WDA_PWR_SAVE_CFG to HAL"));)
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
         pmmLog( pMac, LOGP,
@@ -902,7 +911,15 @@
     pMac->sys.gSysEnableScanMode = true;
 
     // send response to PMC
-    limSendSmeRsp(pMac, eWNI_PMC_EXIT_BMPS_RSP, retStatus, 0, 0);
+   if(IS_SLM_SESSIONIZED )
+   {
+       limSendSmeRsp(pMac, eWNI_PMC_EXIT_BMPS_RSP, retStatus, 
+                  psessionEntry->smeSessionId, psessionEntry->transactionId);
+   }
+   else
+   {
+       limSendSmeRsp(pMac, eWNI_PMC_EXIT_BMPS_RSP, retStatus, 0, 0);
+   }
 
     if ( pMac->pmm.gPmmExitBmpsReasonCode == eSME_MISSED_BEACON_IND_RCVD)
     {
@@ -1493,11 +1510,11 @@
          ((pMac->lim.gLimSmeState != eLIM_SME_IDLE_STATE) &&
           (pMac->lim.gLimSmeState != eLIM_SME_JOIN_FAILURE_STATE)) ||
          (pMac->lim.gLimMlmState != eLIM_MLM_IDLE_STATE) ||
-         (pMac->lim.gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING) ||
-         (pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING))
+         limIsChanSwitchRunning (pMac) ||
+         limIsInQuietDuration (pMac) )
     {
         PELOGE(pmmLog(pMac, LOGE, 
-              FL("pmmImps: PMM State = %d, MLM State = %d, SME State = %d, rejecting the sleep mode request\n"),
+              FL("pmmImps: PMM State = %d, Global MLM State = %d, Global SME State = %d, rejecting the sleep mode request\n"),
               pMac->pmm.gPmmState, pMac->lim.gLimMlmState, pMac->lim.gLimSmeState);)
 
         resultCode = eSIR_SME_INVALID_PMM_STATE;
@@ -1783,7 +1800,7 @@
          limIsSystemInScanState(pMac) )
     {
         PELOGE(pmmLog(pMac, LOGE,
-            FL("pmmUapsd: PMM State = %d, MLM State = %d, SME State = %d, rejecting the sleep mode request\n"),
+            FL("pmmUapsd: PMM State = %d, Global MLM State = %d, Global SME State = %d, rejecting the sleep mode request\n"),
             pMac->pmm.gPmmState, pMac->lim.gLimMlmState, pMac->lim.gLimSmeState);)
 
         resultCode = eSIR_SME_INVALID_PMM_STATE;
@@ -1829,11 +1846,16 @@
     tpUapsdParams    pUapsdRspMsg;
     tSirResultCodes  retStatus = eSIR_SME_SUCCESS;
 
+    tANI_U8 PowersavesessionId;
+    tpPESession psessionEntry;
+
     /* we need to process all the deferred messages enqueued since
      * the initiating the SIR_HAL_ENTER_UAPSD_REQ.
      */
     SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
 
+    /* Copy the power save sessionId to the local variable */
+    PowersavesessionId = pMac->pmm.sessionId;
 
     if (NULL == limMsg->bodyptr)
     {
@@ -1843,6 +1865,12 @@
 
     pUapsdRspMsg = (tpUapsdParams)(limMsg->bodyptr);
 
+    if((psessionEntry = peFindSessionBySessionId(pMac,PowersavesessionId))==NULL)
+    {
+        limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
+        return;
+    }
+
     if(pMac->pmm.gPmmState != ePMM_STATE_UAPSD_WT_SLEEP_RSP)
     {
         PELOGE(pmmLog(pMac, LOGE,
@@ -1866,7 +1894,16 @@
         retStatus = eSIR_SME_UAPSD_REQ_FAILED;
     }
 
-    limSendSmeRsp(pMac, eWNI_PMC_ENTER_UAPSD_RSP, retStatus, 0, 0);    
+    if(IS_SLM_SESSIONIZED )
+    {
+        limSendSmeRsp(pMac, eWNI_PMC_ENTER_UAPSD_RSP, retStatus, 
+                        psessionEntry->smeSessionId, psessionEntry->transactionId);
+    }
+    else
+    {
+        limSendSmeRsp(pMac, eWNI_PMC_ENTER_UAPSD_RSP, retStatus, 0, 0);
+    }
+
     return;
 }
 
@@ -1948,6 +1985,8 @@
 void pmmExitUapsdResponseHandler(tpAniSirGlobal pMac, eHalStatus rspStatus)
 {
     tSirResultCodes resultCode = eSIR_SME_SUCCESS;
+    tANI_U8 PowersavesessionId;
+    tpPESession psessionEntry;
 
     /* we need to process all the deferred messages enqueued since
      * the initiating the SIR_HAL_EXIT_UAPSD_REQ.
@@ -1963,6 +2002,13 @@
         return;
     }
 
+    PowersavesessionId = pMac->pmm.sessionId;
+    if((psessionEntry = peFindSessionBySessionId(pMac,PowersavesessionId))==NULL)
+    {
+        limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
+        return;
+    }
+
     switch(rspStatus)
     {
         case eHAL_STATUS_SUCCESS:
@@ -1978,7 +2024,16 @@
     }
 
     pMac->pmm.gPmmState = ePMM_STATE_BMPS_SLEEP;
-    limSendSmeRsp(pMac, eWNI_PMC_EXIT_UAPSD_RSP, resultCode, 0, 0);
+
+    if(IS_SLM_SESSIONIZED)
+    {
+        limSendSmeRsp(pMac, eWNI_PMC_EXIT_UAPSD_RSP, resultCode, psessionEntry->smeSessionId,
+                      psessionEntry->transactionId);
+    }
+    else
+    {
+        limSendSmeRsp(pMac, eWNI_PMC_EXIT_UAPSD_RSP, resultCode, 0, 0);
+    }
     return;
 }
 
@@ -2424,7 +2479,7 @@
      * WDA_ENTER_IMPS_REQ or WDA_EXIT_IMPS_RSP from HAL.
      */
     SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
     retStatus = wdaPostCtrlMsg(pMac, &msgQ);
     if ( eSIR_SUCCESS != retStatus )
     {
@@ -2456,6 +2511,7 @@
     tANI_U8  uapsdDeliveryMask = 0;
     tANI_U8  uapsdTriggerMask = 0;
     tSirMsgQ msgQ;
+    tpPESession pSessionEntry;
 
     if (SIR_PM_SLEEP_MODE == mode)
     {
@@ -2465,6 +2521,13 @@
             retStatus = eSIR_MEM_ALLOC_FAILED;
             return retStatus;
         }
+
+        if((pSessionEntry = peGetValidPowerSaveSession(pMac)) == NULL )
+        {
+            PELOGW(pmmLog(pMac, LOGW, FL("pmmUapsd :palAllocateMemory() failed\n"));)
+            retStatus = eSIR_FAILURE;
+            return retStatus;
+        }
         palZeroMemory( pMac->hHdd, (tANI_U8 *)pUapsdParams, sizeof(tUapsdParams));
         msgQ.type = WDA_ENTER_UAPSD_REQ;
         msgQ.bodyptr = pUapsdParams;
@@ -2480,6 +2543,8 @@
         pUapsdParams->beTriggerEnabled = LIM_UAPSD_GET(ACBE, uapsdTriggerMask);
         pUapsdParams->viTriggerEnabled = LIM_UAPSD_GET(ACVI, uapsdTriggerMask);
         pUapsdParams->voTriggerEnabled = LIM_UAPSD_GET(ACVO, uapsdTriggerMask);
+        pUapsdParams->bssIdx = pSessionEntry->bssIdx;
+
         PELOGE(pmmLog(pMac, LOGE, 
                       FL("UAPSD Mask:  static = 0x%x, DeliveryEnabled = 0x%x, TriggerEnabled = 0x%x \n"),
             pMac->lim.gUapsdPerAcBitmask,
@@ -2514,7 +2579,7 @@
 
     msgQ.reserved = 0;
     msgQ.bodyval = 0;
-    MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+    MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
     retStatus = wdaPostCtrlMsg(pMac, &msgQ);
     if ( eSIR_SUCCESS != retStatus )
     {
diff --git a/CORE/MAC/src/pe/rrm/rrmApi.c b/CORE/MAC/src/pe/rrm/rrmApi.c
index 6363f17..5ac52ba 100644
--- a/CORE/MAC/src/pe/rrm/rrmApi.c
+++ b/CORE/MAC/src/pe/rrm/rrmApi.c
@@ -163,7 +163,7 @@
 
    PELOGW(limLog(pMac, LOGW, FL( "Sending WDA_SET_MAX_TX_POWER_REQ to HAL"));)
 
-      MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+      MTRACE(macTraceMsgTx(pMac, pSessionEntry->peSessionId, msgQ.type));
    if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
    {
       limLog( pMac, LOGP, FL("Posting WDA_SET_MAX_TX_POWER_REQ to HAL failed, reason=%X"), retCode );
@@ -380,7 +380,7 @@
    //Send request to SME.
    mmhMsg.type    = pSmeNeighborRpt->messageType;
    mmhMsg.bodyptr = pSmeNeighborRpt;
-   MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+   MTRACE(macTraceMsgTx(pMac, pSessionEntry->peSessionId, mmhMsg.type));
    status = limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
 
    return status;
@@ -607,7 +607,7 @@
    //Send request to SME.
    mmhMsg.type    = eWNI_SME_BEACON_REPORT_REQ_IND;
    mmhMsg.bodyptr = pSmeBcnReportReq;
-   MTRACE(macTraceMsgTx(pMac, 0, mmhMsg.type));
+   MTRACE(macTraceMsgTx(pMac, pSessionEntry->peSessionId, mmhMsg.type));
    return limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
 }
 
diff --git a/CORE/MAC/src/pe/sch/schApi.c b/CORE/MAC/src/pe/sch/schApi.c
index 8d90e5e..fa85478 100644
--- a/CORE/MAC/src/pe/sch/schApi.c
+++ b/CORE/MAC/src/pe/sch/schApi.c
@@ -341,7 +341,7 @@
     psessionEntry->bcnLen = size;
   }
 
-  MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
+  MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
   if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
   {
     schLog( pMac, LOGE,
diff --git a/CORE/MAC/src/pe/sch/schBeaconGen.c b/CORE/MAC/src/pe/sch/schBeaconGen.c
index 23b85c3..0921d00 100644
--- a/CORE/MAC/src/pe/sch/schBeaconGen.c
+++ b/CORE/MAC/src/pe/sch/schBeaconGen.c
@@ -303,14 +303,14 @@
         PopulateDot11fEDCAParamSet( pMac, &bcn2.EDCAParamSet, psessionEntry);
     }
 
-    if(pMac->lim.gLim11hEnable)
+    if(psessionEntry->lim11hEnable)
     {
       PopulateDot11fPowerConstraints( pMac, &bcn2.PowerConstraints );
       PopulateDot11fTPCReport( pMac, &bcn2.TPCReport, psessionEntry);
     }
 
 #ifdef ANI_PRODUCT_TYPE_AP
-    if( pMac->lim.gLim11hEnable && (eLIM_QUIET_RUNNING == pMac->lim.gLimSpecMgmt.quietState))
+    if( psessionEntry->lim11hEnable && (eLIM_QUIET_RUNNING == psessionEntry->gLimSpecMgmt.quietState))
     {
       PopulateDot11fQuiet( pMac, &bcn2.Quiet );
     }
@@ -321,28 +321,38 @@
      * populate the 802.11h channel switch IE in its Beacons and Probe
      * Responses.
      */
-    if ( (pMac->lim.gLim11hEnable) &&
-         (pMac->lim.gLimChannelSwitch.switchCount != 0) &&
-         (pMac->lim.gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING))
+    if ( (psessionEntry->lim11hEnable) &&
+         (psessionEntry->gLimChannelSwitch.switchCount != 0) &&
+         (psessionEntry->gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING))
 
     {
-      PopulateDot11fChanSwitchAnn( pMac, &bcn2.ChanSwitchAnn );
-      PopulateDot11fExtChanSwitchAnn(pMac, &bcn2.ExtChanSwitchAnn);
+      PopulateDot11fChanSwitchAnn( pMac, &bcn2.ChanSwitchAnn, psessionEntry );
+      PopulateDot11fExtChanSwitchAnn(pMac, &bcn2.ExtChanSwitchAnn, psessionEntry );
     }
 #endif
 
     if (psessionEntry->dot11mode != WNI_CFG_DOT11_MODE_11B)
         PopulateDot11fERPInfo( pMac, &bcn2.ERPInfo, psessionEntry );
 
-    if(psessionEntry->htCapabality)
+    if(psessionEntry->htCapability)
     {
-        PopulateDot11fHTCaps( pMac, &bcn2.HTCaps );
+        PopulateDot11fHTCaps( pMac, psessionEntry, &bcn2.HTCaps );
 #ifdef WLAN_SOFTAP_FEATURE
         PopulateDot11fHTInfo( pMac, &bcn2.HTInfo, psessionEntry );
 #else
         PopulateDot11fHTInfo( pMac, &bcn2.HTInfo );
 #endif
     }
+#ifdef WLAN_FEATURE_11AC
+    if(psessionEntry->vhtCapability)
+    {        
+        limLog( pMac, LOGW, FL("Populate VHT IEs in Beacon\n"));
+        PopulateDot11fVHTCaps( pMac, &bcn2.VHTCaps );
+        PopulateDot11fVHTOperation( pMac, &bcn2.VHTOperation);
+        // we do not support multi users yet
+        //PopulateDot11fVHTExtBssLoad( pMac, &bcn2.VHTExtBssLoad);
+    }
+#endif
 
     PopulateDot11fExtSuppRates( pMac, POPULATE_DOT11F_RATES_OPERATIONAL,
                                 &bcn2.ExtSuppRates, psessionEntry );
@@ -628,6 +638,30 @@
                             sizeof(beacon2->HTInfo));
     }
 
+#ifdef WLAN_FEATURE_11AC
+    if(beacon2->VHTCaps.present)
+    {
+        SetProbeRspIeBitmap(DefProbeRspIeBitmap,SIR_MAC_VHT_CAPABILITIES_EID);
+        palCopyMemory(pMac->hHdd,(void *)&prb_rsp->VHTCaps,
+                            (void *)&beacon2->VHTCaps,
+                            sizeof(beacon2->VHTCaps));
+    }
+    if(beacon2->VHTOperation.present)
+    {
+        SetProbeRspIeBitmap(DefProbeRspIeBitmap,SIR_MAC_VHT_OPERATION_EID);
+        palCopyMemory(pMac->hHdd,(void *)&prb_rsp->VHTOperation,
+                            (void *)&beacon2->VHTOperation,
+                            sizeof(beacon2->VHTOperation));
+    }
+    if(beacon2->VHTExtBssLoad.present)
+    {
+        SetProbeRspIeBitmap(DefProbeRspIeBitmap,SIR_MAC_VHT_EXT_BSS_LOAD_EID);
+        palCopyMemory(pMac->hHdd,(void *)&prb_rsp->VHTExtBssLoad,
+                            (void *)&beacon2->VHTExtBssLoad,
+                            sizeof(beacon2->VHTExtBssLoad));
+    }
+#endif
+
     //WMM IE
     if(beacon2->WMMParams.present)
     {
@@ -957,12 +991,12 @@
                     limSwitchPrimaryChannel(pMac, pMac->lim.gLimChannelSwitch.primaryChannel);
                     break;
                 case eLIM_CHANNEL_SWITCH_SECONDARY_ONLY:
-                    limSwitchPrimarySecondaryChannel(pMac,
+                    limSwitchPrimarySecondaryChannel(pMac, psessionEntry,
                                              psessionEntry->currentOperChannel,
                                              pMac->lim.gLimChannelSwitch.secondarySubBand);
                     break;
                 case eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY:
-                    limSwitchPrimarySecondaryChannel(pMac,
+                    limSwitchPrimarySecondaryChannel(pMac, psessionEntry,
                                              pMac->lim.gLimChannelSwitch.primaryChannel,
                                              pMac->lim.gLimChannelSwitch.secondarySubBand);
                     break;
diff --git a/CORE/MAC/src/pe/sch/schBeaconProcess.c b/CORE/MAC/src/pe/sch/schBeaconProcess.c
index abcfd62..1157847 100644
--- a/CORE/MAC/src/pe/sch/schBeaconProcess.c
+++ b/CORE/MAC/src/pe/sch/schBeaconProcess.c
@@ -85,7 +85,7 @@
 
     if(SIR_BAND_5_GHZ == rfBand)
     {
-        if (psessionEntry->htCapabality)
+        if (psessionEntry->htCapability)
         {
             if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel)
             {
@@ -122,7 +122,7 @@
     {
         //We are 11G AP.
         if ((phyMode == WNI_CFG_PHY_MODE_11G) &&
-              (false == psessionEntry->htCapabality))
+              (false == psessionEntry->htCapability))
         {
             if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel)        
             {
@@ -149,7 +149,7 @@
             }
         }        
         // handling the case when HT AP has overlapping legacy BSS.
-        else if(psessionEntry->htCapabality)
+        else if(psessionEntry->htCapability)
         {             
             if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel)
             {
@@ -396,8 +396,8 @@
 
 
 
-        MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[0]);)
-        MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[1]);)
+        MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, psessionEntry->peSessionId, pBeacon->timeStamp[0]);)
+        MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, psessionEntry->peSessionId, pBeacon->timeStamp[1]);)
 
         /* Read beacon interval session Entry */
         bi = psessionEntry->beaconParams.beaconInterval;
@@ -472,7 +472,7 @@
             sendProbeReq = TRUE;
     }
 
-    if ( pMac->lim.htCapability && pBeacon->HTInfo.present )
+    if ( psessionEntry->htCapability && pBeacon->HTInfo.present )
     {
         limUpdateStaRunTimeHTSwitchChnlParams( pMac, &pBeacon->HTInfo, bssIdx,psessionEntry);
     }
@@ -485,8 +485,8 @@
         {
             limUpdateQuietIEFromBeacon(pMac, &(pBeacon->quietIE), psessionEntry);
         }
-        else if ((pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN) ||
-             (pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING))
+        else if ((psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN) ||
+             (psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING))
         {
             PELOG1(limLog(pMac, LOG1, FL("Received a beacon without Quiet IE\n"));)
             limCancelDot11hQuiet(pMac, psessionEntry);
@@ -498,7 +498,7 @@
         {
             limUpdateChannelSwitch(pMac, pBeacon, psessionEntry);
         }
-        else if (pMac->lim.gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
+        else if (psessionEntry->gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
         {
             limCancelDot11hChannelSwitch(pMac, psessionEntry);
         }   
@@ -520,7 +520,7 @@
              {
                 limLog( pMac, LOG1, "RegMax = %d, lpc = %d, MaxTx = %d", regMax, localConstraint, maxTxPower );
                 limLog( pMac, LOG1, "Local power constraint change..updating new maxTx power to HAL");
-                if( limSendSetMaxTxPowerReq ( pMac, maxTxPower, psessionEntry ) == eHAL_STATUS_SUCCESS )
+                if( limSendSetMaxTxPowerReq ( pMac, maxTxPower, psessionEntry ) == eSIR_SUCCESS )
                    psessionEntry->maxTxPower = maxTxPower;
              }
            }
@@ -569,9 +569,6 @@
             psessionEntry->bssId, psessionEntry->currentOperChannel,psessionEntry->selfMacAddr,
             psessionEntry->dot11mode, 0, NULL);
 
-   PELOG2(schLog(pMac, LOG2, "Received Beacon's SeqNum=%d\n",
-           (pMh->seqControl.seqNumHi << 4) | (pMh->seqControl.seqNumLo));)
-
     if(beaconParams.paramChangeBitmap)
     {
         PELOGW(schLog(pMac, LOGW, FL("Beacon for session[%d] got changed. \n"), psessionEntry->peSessionId);)
diff --git a/CORE/SAP/inc/sapApi.h b/CORE/SAP/inc/sapApi.h
index 6c9953e..5ecc24b 100644
--- a/CORE/SAP/inc/sapApi.h
+++ b/CORE/SAP/inc/sapApi.h
@@ -148,7 +148,10 @@
     eSAP_DOT11_MODE_11g_ONLY = 0x0080,
     eSAP_DOT11_MODE_11n_ONLY = 0x0100,
     eSAP_DOT11_MODE_11b_ONLY = 0x0400,
-
+#ifdef WLAN_FEATURE_11AC
+    eSAP_DOT11_MODE_11ac     = 0x1000,
+    eSAP_DOT11_MODE_11ac_ONLY = 0x2000
+#endif
 } eSapPhyMode;
 
 typedef enum {
@@ -1375,7 +1378,7 @@
   SIDE EFFECTS   
 ============================================================================*/
 VOS_STATUS WLANSAP_SendAction( v_PVOID_t pvosGCtx, const tANI_U8 *pBuf, 
-                               tANI_U32 len );
+                               tANI_U32 len, tANI_U16 wait );
 
 /*==========================================================================
 
diff --git a/CORE/SAP/src/sapModule.c b/CORE/SAP/src/sapModule.c
index ffa755e..0210cdb 100644
--- a/CORE/SAP/src/sapModule.c
+++ b/CORE/SAP/src/sapModule.c
@@ -497,11 +497,9 @@
     }
     else
     {
-        VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, 
+        VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL, 
                "WLANSAP_pmcFullPwrReqCB: PMC failed to put the chip in Full power\n");
 
-        //ASSERT
-        VOS_ASSERT(0);
     }
 
 }// WLANSAP_pmcFullPwrReqCB
@@ -2001,7 +1999,7 @@
   SIDE EFFECTS   
 ============================================================================*/
 VOS_STATUS WLANSAP_SendAction( v_PVOID_t pvosGCtx, const tANI_U8 *pBuf,
-                               tANI_U32 len )
+                               tANI_U32 len, tANI_U16 wait )
 {
     ptSapContext  pSapCtx = NULL;
     v_PVOID_t hHal = NULL;
@@ -2025,7 +2023,7 @@
             return VOS_STATUS_E_FAULT;
         }
 
-        halStatus = sme_sendAction( hHal, pSapCtx->sessionId, pBuf, len );
+        halStatus = sme_sendAction( hHal, pSapCtx->sessionId, pBuf, len, 0 , 0);
 
         if ( eHAL_STATUS_SUCCESS == halStatus )
         {
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 6856670..b8391ed 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -128,9 +128,13 @@
     eCSR_DOT11_MODE_TAURUS_ONLY = 0x0200,
     eCSR_DOT11_MODE_11b_ONLY = 0x0400,
     eCSR_DOT11_MODE_11a_ONLY = 0x0800,
+#ifdef WLAN_FEATURE_11AC
+    eCSR_DOT11_MODE_11ac     = 0x1000,
+    eCSR_DOT11_MODE_11ac_ONLY = 0x2000,
+#endif
     //This is for WIFI test. It is same as eWNIAPI_MAC_PROTOCOL_ALL except when it starts IBSS in 11B of 2.4GHz
     //It is for CSR internal use
-    eCSR_DOT11_MODE_AUTO = 0x1000,
+    eCSR_DOT11_MODE_AUTO = 0x4000,
 
     eCSR_NUM_PHY_MODE = 16,     //specify the number of maximum bits for phyMode
 }eCsrPhyMode;
@@ -244,6 +248,7 @@
     eCsrRequestType requestType;    //11d scan or full scan
 #ifdef WLAN_FEATURE_P2P
     tANI_BOOLEAN p2pSearch;
+    tANI_BOOLEAN skipDfsChnlInP2pSearch;
 #endif
 }tCsrScanRequest;
 
@@ -495,6 +500,8 @@
 #endif
     // peer rejected assoc because max assoc limit reached. callback gets pointer to peer
     eCSR_ROAM_RESULT_MAX_ASSOC_EXCEEDED,
+    //Assoc rejected due to concurrent session running on a different channel
+    eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL,
 }eCsrRoamResult;
 
 
@@ -626,6 +633,8 @@
 #define CSR_CB_CHANNEL_GAP 4
 #define CSR_CB_CENTER_CHANNEL_OFFSET    2
 #define CSR_MAX_24GHz_CHANNEL_NUMBER ( SIR_11B_CHANNEL_END )
+#define CSR_MIN_5GHz_CHANNEL_NUMBER  ( SIR_11A_CHANNEL_BEGIN )
+#define CSR_MAX_5GHz_CHANNEL_NUMBER  ( SIR_11A_CHANNEL_END )
 
 // WEP keysize (in bits)...
 typedef enum  
@@ -837,6 +846,7 @@
     tCsrEncryptionList mcEncryptionInfo;
     eCsrCBChoice CBMode; //up, down or auto
     tANI_U8 operationChannel;
+    tANI_U16   beaconInterval;
     tCsrKeys Keys;
     // meaningless on connect. It's an OUT param from CSR's point of view
     // During assoc response carries the ACM bit-mask i.e. what
@@ -883,8 +893,8 @@
 typedef struct tagCsrConfigParam
 {
     tANI_U32 FragmentationThreshold;
-    tANI_U32 channelBondingMode24GHz;
-    tANI_U32 channelBondingMode5GHz;
+    tANI_U32 channelBondingMode24GHz;   // keep this tANI_U32. This gets converted to ePhyChannelBondState
+    tANI_U32 channelBondingMode5GHz;    // in csrChangeDefaultConfigParam using convertCBIniValueToPhyCBState
     eCsrPhyMode phyMode;
     eCsrBand eBand;
     tANI_U32 RTSThreshold;
@@ -988,6 +998,14 @@
 
     //To enable/disable scanning 2.4Ghz channels twice on a single scan request from HDD
     tANI_BOOLEAN fScanTwice;
+#ifdef WLAN_FEATURE_11AC
+    tANI_U32  nVhtChannelWidth;
+#endif
+
+    /*
+    * To enable/disable scanning only 2.4Ghz channels on first scan
+    */
+    tANI_BOOLEAN fFirstScanOnly2GChnl;
 
 }tCsrConfigParam;   
 
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index 09468f9..8d9b406 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -89,10 +89,16 @@
     eCSR_CFG_DOT11_MODE_11N,   
     eCSR_CFG_DOT11_MODE_POLARIS,    
     eCSR_CFG_DOT11_MODE_TITAN,    
+#ifdef WLAN_FEATURE_11AC
+    eCSR_CFG_DOT11_MODE_11AC,
+#endif
 #ifdef WLAN_SOFTAP_FEATURE
     eCSR_CFG_DOT11_MODE_11G_ONLY,    
     eCSR_CFG_DOT11_MODE_11N_ONLY,   
 #endif 
+#ifdef WLAN_FEATURE_11AC
+    eCSR_CFG_DOT11_MODE_11AC_ONLY,
+#endif 
     //This value can never set to CFG. It is for CSR's internal use
     eCSR_CFG_DOT11_MODE_AUTO,
 }eCsrCfgDot11Mode;  //Used to determine what to set to the WNI_CFG_DOT11_MODE
@@ -201,6 +207,7 @@
     eCsrStartIbss,
     eCsrStartIbssSameIbss,
     eCsrReassocToSelfNoCapChange,
+    eCsrStopRoamingDueToConcurrency,
     
 }eCsrJoinState;
 
@@ -306,7 +313,7 @@
     tANI_U32 uJoinTimeOut;
     tSirMacCapabilityInfo BssCap;
     tANI_BOOLEAN f11hSupport;
-    tAniCBSecondaryMode cbMode;
+    ePhyChanBondState cbMode;
 }tBssConfigParam;
 
 
@@ -315,7 +322,7 @@
     tSirMacSSid         ssId;
     tCsrBssid           bssid;    //this is the BSSID for the party we want to join (only use for IBSS or WDS)
     tSirNwType          sirNwType;
-    tAniCBSecondaryMode cbMode;
+    ePhyChanBondState   cbMode;
     tSirMacRateSet      operationalRateSet;
     tSirMacRateSet      extendedRateSet;
     tANI_U8             operationChn;
@@ -561,10 +568,15 @@
     tANI_BOOLEAN addTSWhenACMIsOff;
 
     tANI_BOOLEAN fValidateList;
-    tANI_BOOLEAN concurrencyEnabled;
+#ifndef BMPS_WORKAROUND_NOT_NEEDED
+    tANI_BOOLEAN doBMPSWorkaround;
+#endif
 
     //To enable/disable scanning 2.4Ghz channels twice on a single scan request from HDD
     tANI_BOOLEAN fScanTwice;
+#ifdef WLAN_FEATURE_11AC
+    tANI_U32  nVhtChannelWidth;
+#endif
 
 }tCsrConfig;
 
@@ -661,6 +673,11 @@
     * (apprx 1.3 sec) */
     tANI_BOOLEAN fEnableDFSChnlScan;
 
+    /*
+    * To enable/disable scanning only 2.4Ghz channels on first scan
+    */
+    tANI_BOOLEAN fFirstScanOnly2GChnl;
+
     tANI_BOOLEAN fDropScanCmd; //true means we don't accept scan commands
 
 #ifdef WLAN_AP_STA_CONCURRENCY
@@ -909,10 +926,19 @@
         ((eCSR_DOT11_MODE_11a == (pMac)->roam.configParam.phyMode) ||\
         (eCSR_DOT11_MODE_11a_ONLY == (pMac)->roam.configParam.phyMode))
         
+#ifdef WLAN_FEATURE_11AC
+#define CSR_IS_PHY_MODE_DUAL_BAND(phyMode) \
+        ((eCSR_DOT11_MODE_abg & (phyMode)) || (eCSR_DOT11_MODE_11n & (phyMode)) || \
+        (eCSR_DOT11_MODE_11ac & (phyMode)) || \
+        (eCSR_DOT11_MODE_TAURUS & (phyMode)) || \
+        (eCSR_DOT11_MODE_AUTO & (phyMode)))
+#else
 #define CSR_IS_PHY_MODE_DUAL_BAND(phyMode) \
         ((eCSR_DOT11_MODE_abg & (phyMode)) || (eCSR_DOT11_MODE_11n & (phyMode)) || \
         (eCSR_DOT11_MODE_TAURUS & (phyMode)) || \
         (eCSR_DOT11_MODE_AUTO & (phyMode)))
+#endif
+
 
 // this function returns TRUE if the NIC is operating exclusively in the 2.4 GHz band, meaning
 // it is NOT operating in the 5.0 GHz band.
@@ -948,7 +974,7 @@
         (CSR_IS_OPEARTING_DUAL_BAND((pMac)) || CSR_IS_RADIO_BG_ONLY((pMac)) || CSR_IS_24_BAND_ONLY((pMac)))
 
 #define CSR_IS_CHANNEL_5GHZ(chnNum) \
-        ((chnNum) > CSR_MAX_24GHz_CHANNEL_NUMBER)
+        (((chnNum) >= CSR_MIN_5GHz_CHANNEL_NUMBER) && ((chnNum) <= CSR_MAX_5GHz_CHANNEL_NUMBER))
 
 #define CSR_IS_CHANNEL_24GHZ(chnNum) \
         (((chnNum) > 0) && ((chnNum) <= CSR_MAX_24GHz_CHANNEL_NUMBER))
@@ -1010,11 +1036,16 @@
 tANI_BOOLEAN csrIsAllSessionDisconnected( tpAniSirGlobal pMac );
 tANI_BOOLEAN csrIsInfraConnected( tpAniSirGlobal pMac );
 tANI_BOOLEAN csrIsConcurrentInfraConnected( tpAniSirGlobal pMac );
+tANI_BOOLEAN csrIsConcurrentSessionRunning( tpAniSirGlobal pMac );
+#ifndef BMPS_WORKAROUND_NOT_NEEDED
+tANI_BOOLEAN csrIsInfraApStarted( tpAniSirGlobal pMac );
+#endif
 tANI_BOOLEAN csrIsIBSSStarted( tpAniSirGlobal pMac );
 tANI_BOOLEAN csrIsBTAMPStarted( tpAniSirGlobal pMac );
 tANI_BOOLEAN csrIsBTAMP( tpAniSirGlobal pMac, tANI_U32 sessionId );
 eHalStatus csrIsBTAMPAllowed( tpAniSirGlobal pMac, tANI_U32 chnId );
-tANI_BOOLEAN csrIsValidMcConcurrentSession(tpAniSirGlobal pMac, tANI_U32 sessionId);
+tANI_BOOLEAN csrIsValidMcConcurrentSession(tpAniSirGlobal pMac, tANI_U32 sessionId,
+                                                  tSirBssDescription *pBssDesc);
 #ifdef WLAN_SOFTAP_FEATURE
 tANI_BOOLEAN csrIsConnStateConnectedInfraAp( tpAniSirGlobal pMac, tANI_U32 sessionId );
 #endif
@@ -1185,8 +1216,9 @@
 tANI_BOOLEAN csrRoamIsCCXAssoc(tpAniSirGlobal pMac);
 #endif
 
-
+#ifndef BMPS_WORKAROUND_NOT_NEEDED
 void csrDisconnectAllActiveSessions(tpAniSirGlobal pMac);
+#endif
 #ifdef FEATURE_WLAN_LFR
 //Returns whether "Legacy Fast Roaming" is enabled...or not
 tANI_BOOLEAN csrRoamIsFastRoamEnabled(tpAniSirGlobal pMac);
diff --git a/CORE/SME/inc/csrSupport.h b/CORE/SME/inc/csrSupport.h
index d7257e7..3a2368e 100644
--- a/CORE/SME/inc/csrSupport.h
+++ b/CORE/SME/inc/csrSupport.h
@@ -799,6 +799,15 @@
                       tCsrRoamModifyProfileFields *pModProfileFields,
                       tANI_U32 *pRoamId, v_BOOL_t fForce);
 
+eHalStatus
+csrIsconcurrentsessionValid(tpAniSirGlobal pMac,tANI_U32 cursessionId,
+                                 tVOS_CON_MODE currBssPersona);
+
+//BeaconInterval valiadation for MCC support
+eHalStatus csrValidateBeaconInterval(tpAniSirGlobal pMac, tANI_U8 channelId, 
+                                     tANI_U16 *beaconInterval, tANI_U32 cursessionId,
+                                     tVOS_CON_MODE currBssPersona);
+
 #ifdef WLAN_FEATURE_VOWIFI_11R
 tANI_BOOLEAN csrIsProfile11r( tCsrRoamProfile *pProfile );
 tANI_BOOLEAN csrIsAuthType11r( eCsrAuthType AuthType );
diff --git a/CORE/SME/inc/measApi.h b/CORE/SME/inc/measApi.h
deleted file mode 100644
index 1e9b029..0000000
--- a/CORE/SME/inc/measApi.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2012, Code Aurora Forum. 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.
- */
-
diff --git a/CORE/SME/inc/measInternal.h b/CORE/SME/inc/measInternal.h
deleted file mode 100644
index 1e9b029..0000000
--- a/CORE/SME/inc/measInternal.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2012, Code Aurora Forum. 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.
- */
-
diff --git a/CORE/SME/inc/oemDataApi.h b/CORE/SME/inc/oemDataApi.h
new file mode 100644
index 0000000..0c665db
--- /dev/null
+++ b/CORE/SME/inc/oemDataApi.h
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2012, Code Aurora Forum. 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.
+ */
+
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+/** ------------------------------------------------------------------------- * 
+    ------------------------------------------------------------------------- *  
+
+  
+    \file oemDataApi.h
+  
+    Exports and types for the Common OEM DATA REQ/RSP Module interfaces.
+  
+    Copyright (C) 2010 Qualcomm Inc.
+  
+ 
+   ========================================================================== */
+
+#ifndef __OEM_DATA_API_H__
+#define __OEM_DATA_API_H__
+#include "sirApi.h"
+#include "sirMacProtDef.h"
+#include "csrLinkList.h"
+
+#ifndef OEM_DATA_REQ_SIZE
+#define OEM_DATA_REQ_SIZE 70
+#endif
+
+#ifndef OEM_DATA_RSP_SIZE
+#define OEM_DATA_RSP_SIZE 968
+#endif
+
+/*************************************************************************************************************
+  OEM DATA REQ/RSP - DATA STRUCTURES
+*************************************************************************************************************/
+
+/* Structure for defining req sent to the PE */
+typedef struct tagOemDataReq
+{
+    tANI_U8   sessionId;
+    tANI_U8   oemDataReq[OEM_DATA_REQ_SIZE];
+} tOemDataReq, tOemDataReqConfig;
+
+/*************************************************************************************************************
+  OEM DATA RESPONSE - DATA STRUCTURES
+*************************************************************************************************************/
+typedef struct tagOemDataRsp
+{
+    tANI_U8   oemDataRsp[OEM_DATA_RSP_SIZE];
+} tOemDataRsp;
+
+/*************************************************************************************************************/
+
+typedef enum
+{
+    eOEM_DATA_REQ_SUCCESS=1,
+    eOEM_DATA_REQ_FAILURE,
+    eOEM_DATA_REQ_INVALID_MODE,
+} eOemDataReqStatus;
+
+/* ---------------------------------------------------------------------------
+    \fn oemData_OemDataReqOpen
+    \brief This function must be called before any API call to MEAS (OEM DATA REQ/RSP module)
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+
+eHalStatus oemData_OemDataReqOpen(tHalHandle hHal);
+
+/* ---------------------------------------------------------------------------
+    \fn oemData_OemDataReqClose
+    \brief This function must be called before closing the csr module
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+
+eHalStatus oemData_OemDataReqClose(tHalHandle hHal);
+
+/* HDD Callback function for the sme to callback when the oem data rsp is available */
+typedef eHalStatus (*oemData_OemDataReqCompleteCallback)(
+                                           tHalHandle, 
+                                           void* p2, 
+                                           tANI_U32 oemDataReqID, 
+                                           eOemDataReqStatus status);
+
+/* ---------------------------------------------------------------------------
+    \fn oemData_OemDataReq
+    \brief Request an OEM DATA RSP
+    \param sessionId - Id of session to be used
+    \param pOemDataReqID - pointer to an object to get back the request ID
+    \param callback - a callback function that is called upon finish
+    \param pContext - a pointer passed in for the callback
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+eHalStatus oemData_OemDataReq(tHalHandle, tANI_U8, tOemDataReqConfig *, tANI_U32 *pOemDataReqID, 
+                            oemData_OemDataReqCompleteCallback callback, void *pContext);
+
+/* ---------------------------------------------------------------------------
+    \fn sme_HandleOemDataRsp
+    \brief This function processes the oem data response obtained from the PE
+    \param pMsg - Pointer to the pSirSmeOemDataRsp
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+eHalStatus sme_HandleOemDataRsp(tHalHandle hHal, tANI_U8*);
+
+/* ---------------------------------------------------------------------------
+    \fn oemData_IsOemDataReqAllowed
+    \brief This function checks if oem data req/rsp can be performed in the 
+           current driver state
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+eHalStatus oemData_IsOemDataReqAllowed(tHalHandle hHal);
+
+#endif //_OEM_DATA_API_H__
+
+#endif //FEATURE_OEM_DATA_SUPPORT
diff --git a/CORE/SME/inc/oemDataInternal.h b/CORE/SME/inc/oemDataInternal.h
new file mode 100644
index 0000000..82c9197
--- /dev/null
+++ b/CORE/SME/inc/oemDataInternal.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2012, Code Aurora Forum. 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.
+ */
+
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+/** ------------------------------------------------------------------------- * 
+    ------------------------------------------------------------------------- *  
+
+  
+    \file oemDataInternal.h
+  
+    Exports and types for the Common OEM DATA REQ/RSP Module interfaces.
+  
+    Copyright (C) 2010 Qualcomm Inc.
+  
+   ========================================================================== */
+
+
+#ifndef __OEM_DATA_INTERNAL_H__
+#define __OEM_DATA_INTERNAL_H__
+
+#include "palTimer.h"
+#include "csrSupport.h"
+#include "vos_nvitem.h"
+#include "wlan_qct_tl.h"
+
+#include "oemDataApi.h"
+
+typedef struct tagOemDataStruct
+{
+    tANI_U32                         nextOemReqId; //a global req id
+    tANI_BOOLEAN                     oemDataReqActive; //indicates that currently a request has been posted and 
+                                                        //waiting for the response
+    oemData_OemDataReqCompleteCallback   callback; //callback function pointer for returning the response
+    void*                            pContext; //context of the original caller
+    tANI_U32                         oemDataReqID; //original request ID
+    tOemDataRsp*                     pOemDataRsp; //response
+    tOemDataReqConfig                oemDataReqConfig; //current oem data request
+    tANI_U8                          sessionId; //Session on which oem data req is active
+} tOemDataStruct;
+
+typedef struct tagOemDataCmd
+{
+    tANI_U32                            oemDataReqID;
+    oemData_OemDataReqCompleteCallback      callback;
+    void*                               pContext;
+    tOemDataReq                         oemDataReq;
+} tOemDataCmd;
+
+#endif //__OEM_DATA_INTERNAL_H__
+
+#endif //FEATURE_OEM_DATA_SUPPORT
diff --git a/CORE/SME/inc/p2p_Api.h b/CORE/SME/inc/p2p_Api.h
index 13276de..47449bc 100644
--- a/CORE/SME/inc/p2p_Api.h
+++ b/CORE/SME/inc/p2p_Api.h
@@ -476,7 +476,8 @@
 eHalStatus sme_updateP2pIe( tHalHandle hHal, void *p2pIe, 
                             tANI_U32 p2pIeLength );
 eHalStatus sme_sendAction( tHalHandle hHal, tANI_U8 sessionId,
-                           const tANI_U8 *pBuf, tANI_U32 len );
+                           const tANI_U8 *pBuf, tANI_U32 len,
+                           tANI_U16 wait, tANI_BOOLEAN noack);
 eHalStatus sme_CancelRemainOnChannel( tHalHandle hHal, tANI_U8 sessionId );
 eHalStatus sme_p2pOpen( tHalHandle hHal );
 eHalStatus p2pStop( tHalHandle hHal );
@@ -493,7 +494,8 @@
                                remainOnChanCallback callback, void *pContext);
 #endif
 eHalStatus p2pSendAction( tHalHandle hHal, tANI_U8 sessionId,
-                          const tANI_U8 *pBuf, tANI_U32 len );
+                          const tANI_U8 *pBuf, tANI_U32 len,
+                           tANI_U16 wait, tANI_BOOLEAN noack);
 eHalStatus p2pCancelRemainOnChannel( tHalHandle hHal, tANI_U8 sessionId );
 eHalStatus p2pSetPs( tHalHandle hHal, tP2pPsConfig *pNoA );
 #ifdef WLAN_FEATURE_P2P_INTERNAL
diff --git a/CORE/SME/inc/pmcApi.h b/CORE/SME/inc/pmcApi.h
index 05a7fff..fc01a98 100644
--- a/CORE/SME/inc/pmcApi.h
+++ b/CORE/SME/inc/pmcApi.h
@@ -420,7 +420,8 @@
 extern eHalStatus pmcExitWowl (tHalHandle hHal);
 
 
-extern eHalStatus pmcSetHostOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest);
+extern eHalStatus pmcSetHostOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest,
+                                          tANI_U8 *bssId);
 
 /* ---------------------------------------------------------------------------
     \fn pmcSetKeepAlive
@@ -431,7 +432,7 @@
             eHAL_STATUS_FAILURE  Cannot set the keepalive.
             eHAL_STATUS_SUCCESS  Request accepted. 
   ---------------------------------------------------------------------------*/
-extern eHalStatus pmcSetKeepAlive (tHalHandle hHal, tpSirKeepAliveReq pRequest);
+extern eHalStatus pmcSetKeepAlive (tHalHandle hHal, tpSirKeepAliveReq pRequest, tANI_U8 *bssId);
 
 extern tANI_BOOLEAN pmcValidateConnectState( tHalHandle hHal );
 
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index 742ac7d..c89f4eb 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -51,6 +51,9 @@
 #include "smeQosInternal.h"
 
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+#include "oemDataInternal.h"
+#endif
 
 #if defined WLAN_FEATURE_VOWIFI
 #include "sme_RrmApi.h"
@@ -114,6 +117,9 @@
         tRemoveKeyCmd removeKeyCmd;
         tGenericPmcCmd pmcCmd;
         tGenericQosCmd qosCmd;
+#ifdef FEATURE_OEM_DATA_SUPPORT
+        tOemDataCmd oemDataCmd;
+#endif
 #ifdef WLAN_FEATURE_P2P
         tRemainChlCmd remainChlCmd;
         tNoACmd NoACmd;
@@ -165,6 +171,9 @@
 eHalStatus sme_AcquireGlobalLock( tSmeStruct *psSme);
 eHalStatus sme_ReleaseGlobalLock( tSmeStruct *psSme);
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+eHalStatus oemData_ProcessOemDataReqCommand(tpAniSirGlobal pMac, tSmeCmd *pCommand);
+#endif
 
 eHalStatus csrProcessAddStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand );
 eHalStatus csrProcessAddStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg);
@@ -181,7 +190,7 @@
             eHAL_STATUS_FAILURE  Cannot set the offload.
             eHAL_STATUS_SUCCESS  Request accepted. 
   ---------------------------------------------------------------------------*/
-eHalStatus pmcSetNSOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest);
+eHalStatus pmcSetNSOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest, tANI_U8 *bssId);
 #endif //WLAN_NS_OFFLOAD
 
 #ifdef FEATURE_WLAN_SCAN_PNO
diff --git a/CORE/SME/inc/smeInternal.h b/CORE/SME/inc/smeInternal.h
index 3d27d9b..2494651 100644
--- a/CORE/SME/inc/smeInternal.h
+++ b/CORE/SME/inc/smeInternal.h
@@ -80,6 +80,9 @@
     eSmeQosCommandMask = 0x40000,  //To identify Qos commands
     eSmeCommandAddTs,
     eSmeCommandDelTs,
+#ifdef FEATURE_OEM_DATA_SUPPORT
+    eSmeCommandOemDataReq = 0x80000, //To identify the oem data commands
+#endif
 #ifdef WLAN_FEATURE_P2P
     eSmeCommandRemainOnChannel,
     eSmeCommandNoAUpdate,
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index eed1638..8ccdf97 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -54,6 +54,9 @@
 #include "halFw.h"
 #endif
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+#include "oemDataApi.h"
+#endif
 
 #if defined WLAN_FEATURE_VOWIFI
 #include "smeRrmInternal.h"
@@ -1548,6 +1551,35 @@
                                         tANI_U32 *pNumItems );
 #endif /* FEATURE_WLAN_WAPI */
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/********************************************************************************************
+  Oem data related modifications
+*********************************************************************************************/
+/* ---------------------------------------------------------------------------
+    \fn sme_OemDataReq
+    \param sessionId - session id of session to be used for oem data req.
+    \param pOemDataReqID - pointer to an object to get back the request ID
+    \param callback - a callback function that is called upon finish
+    \param pContext - a pointer passed in for the callback
+    \return eHalStatus     
+  ---------------------------------------------------------------------------*/
+eHalStatus sme_OemDataReq(tHalHandle hHal, 
+                                       tANI_U8 sessionId,
+                                       tOemDataReqConfig *, 
+                                       tANI_U32 *pOemDataReqID, 
+                                       oemData_OemDataReqCompleteCallback callback, 
+                                       void *pContext);
+
+/* ---------------------------------------------------------------------------
+    \fn sme_getOemDataRsp
+    \param pOemDataRsp - A pointer to the response object
+    \param pOemDataReqID - pointer to an object to get back the request ID
+    \return eHalStatus     
+  ---------------------------------------------------------------------------*/
+eHalStatus sme_getOemDataRsp(tHalHandle hHal, 
+                                         tOemDataRsp **pOemDataRsp);
+
+#endif /*FEATURE_OEM_DATA_SUPPORT*/
 
 
 #ifdef WLAN_SOFTAP_FEATURE
@@ -1608,7 +1640,8 @@
     \param  pRequest -  Pointer to the offload request.
     \return eHalStatus
    ---------------------------------------------------------------------------*/
-eHalStatus sme_SetHostOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest);
+eHalStatus sme_SetHostOffload (tHalHandle hHal, tANI_U8 sessionId,
+                                    tpSirHostOffloadReq pRequest);
 
 /* ---------------------------------------------------------------------------
     \fn sme_SetKeepAlive
@@ -1617,7 +1650,8 @@
     \param  pRequest -  Pointer to the Keep Alive request.
     \return eHalStatus
   ---------------------------------------------------------------------------*/
-eHalStatus sme_SetKeepAlive (tHalHandle hHal, tpSirKeepAliveReq pRequest);
+eHalStatus sme_SetKeepAlive (tHalHandle hHal, tANI_U8 sessionId,
+                                  tpSirKeepAliveReq pRequest);
 
 
 /* ---------------------------------------------------------------------------
@@ -1906,7 +1940,8 @@
     \param  pRcvPktFilterCfg - Receive Packet Filter parameter
     \return eHalStatus   
   ---------------------------------------------------------------------------*/
-eHalStatus sme_ReceiveFilterSetFilter(tHalHandle hHal, tpSirRcvPktFilterCfgType pRcvPktFilterCfg);
+eHalStatus sme_ReceiveFilterSetFilter(tHalHandle hHal, tpSirRcvPktFilterCfgType pRcvPktFilterCfg,
+                                           tANI_U8 sessionId);
 
 /* ---------------------------------------------------------------------------
     \fn sme_GetFilterMatchCount
@@ -1928,7 +1963,8 @@
     \return eHalStatus   
   ---------------------------------------------------------------------------*/
 eHalStatus sme_ReceiveFilterClearFilter(tHalHandle hHal,
-                                        tpSirRcvFltPktClearParam pRcvFltPktClearParam);
+                                        tpSirRcvFltPktClearParam pRcvFltPktClearParam,
+                                        tANI_U8  sessionId);
 #endif // WLAN_FEATURE_PACKET_FILTERING
 /* ---------------------------------------------------------------------------
 
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index c2c6059..3381d94 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -21,7 +21,7 @@
 
 /** ------------------------------------------------------------------------- * 
     ------------------------------------------------------------------------- *  
-
+  
   
     \file csrApiRoam.c
   
@@ -31,36 +31,27 @@
   
  
    ========================================================================== */
-
 /*===========================================================================
-
                       EDIT HISTORY FOR FILE
 
-
   This section contains comments describing changes made to the module.
   Notice that changes are listed in reverse chronological order.
 
-
-
   when            who                 what, where, why
 ----------       ---                --------------------------------------------------------
 06/03/10     js                     Added support to hostapd driven 
  *                                  deauth/disassoc/mic failure
-
 ===========================================================================*/
-
 #include "aniGlobal.h" //for tpAniSirGlobal
 #include "wlan_qct_wda.h"
-
 #ifdef FEATURE_WLAN_INTEGRATED_SOC
 #include "halMsgApi.h" //for HAL_STA_INVALID_IDX.
 #endif
-
 #ifdef FEATURE_WLAN_NON_INTEGRATED_SOC
 #include "halPhyApi.h"
 #include "halInternal.h"
 #endif
-
+#include "limUtils.h"
 #include "palApi.h"
 #include "csrInsideApi.h"
 #include "smsDebug.h"
@@ -73,15 +64,12 @@
 #include "csrApi.h"
 #include "pmc.h"
 #include "vos_nvitem.h"
-
 #ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
 #include "csrNeighborRoam.h"
 #endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
-
 #ifdef FEATURE_WLAN_CCX
 #include "csrCcx.h"
 #endif /* FEATURE_WLAN_CCX */
-
 #define CSR_NUM_IBSS_START_CHANNELS_50      4
 #define CSR_NUM_IBSS_START_CHANNELS_24      3
 #define CSR_DEF_IBSS_START_CHANNEL_50       36
@@ -93,7 +81,6 @@
   OBIWAN recommends [8 10]% : pick 9% 
 ---------------------------------------------------------------------------*/
 #define CSR_VCC_UL_MAC_LOSS_THRESHOLD 9
-
 /*---------------------------------------------------------------------------
   OBIWAN recommends -85dBm 
 ---------------------------------------------------------------------------*/
@@ -102,51 +89,43 @@
 #define CSR_MIN_GLOBAL_STAT_QUERY_PERIOD_IN_BMPS 2000 //ms
 #define CSR_MIN_TL_STAT_QUERY_PERIOD       500 //ms
 #define CSR_DIAG_LOG_STAT_PERIOD           3000 //ms
-
 //We use constatnt 4 here
 //This macro returns true when higher AC parameter is bigger than lower AC for a difference
 //The bigger the number, the less chance of TX
 //It must put lower AC as the first parameter.
 #define SME_DETECT_AC_WEIGHT_DIFF(loAC, hiAC)   (v_BOOL_t)(((hiAC) > (loAC)) ? (((hiAC)-(loAC)) > 4) : 0)
-
 //Flag to send/do not send disassoc frame over the air
 #define CSR_DONT_SEND_DISASSOC_OVER_THE_AIR 1
-
 #define RSSI_HACK_BMPS (-40)
+#define MAX_CB_VALUE_IN_INI (2)
+
 /*-------------------------------------------------------------------------- 
   Static Type declarations
   ------------------------------------------------------------------------*/
 static tChannelListWithPower csrRoamPowerTableFromEeprom[WNI_CFG_VALID_CHANNEL_LIST_LEN];
 static tChannelListWithPower csrRoamPowerTableFromEeprom40MHz[WNI_CFG_VALID_CHANNEL_LIST_LEN];
 static tCsrRoamSession       csrRoamRoamSession[CSR_ROAM_SESSION_MAX];
-
 /*-------------------------------------------------------------------------- 
   Type declarations
   ------------------------------------------------------------------------*/
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
-
 int diagAuthTypeFromCSRType(eCsrAuthType authType)
 {
     int n = AUTH_OPEN;
-
     switch(authType)
     {
     case eCSR_AUTH_TYPE_SHARED_KEY:
         n = AUTH_SHARED;
         break;
-
     case eCSR_AUTH_TYPE_WPA:
         n = AUTH_WPA_EAP;
         break;
-
     case eCSR_AUTH_TYPE_WPA_PSK:
         n = AUTH_WPA_PSK;
         break;
-
     case eCSR_AUTH_TYPE_RSN:
         n = AUTH_WPA2_EAP;
         break;
-
     case eCSR_AUTH_TYPE_RSN_PSK:
         n = AUTH_WPA2_PSK;
         break;
@@ -154,43 +133,34 @@
     case eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE:
         n = AUTH_WAPI_CERT;
         break;
-
     case eCSR_AUTH_TYPE_WAPI_WAI_PSK:
         n = AUTH_WAPI_PSK;
         break;
 #endif /* FEATURE_WLAN_WAPI */
-
     default:
         break;
     }
-
     return (n);
 }
-
 int diagEncTypeFromCSRType(eCsrEncryptionType encType)
 {
     int n = ENC_MODE_OPEN;
-
     switch(encType)
     {
     case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
     case eCSR_ENCRYPT_TYPE_WEP40:
         n = ENC_MODE_WEP40;
         break;
-
     case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
     case eCSR_ENCRYPT_TYPE_WEP104:
         n = ENC_MODE_WEP104;
         break;
-
     case eCSR_ENCRYPT_TYPE_TKIP:
         n = ENC_MODE_TKIP;
         break;
-
     case eCSR_ENCRYPT_TYPE_AES:
         n = ENC_MODE_AES;
         break;
-
 #ifdef FEATURE_WLAN_WAPI
     case eCSR_ENCRYPT_TYPE_WPI:
         n = ENC_MODE_SMS4;
@@ -199,15 +169,11 @@
     default:
         break;
     }
-
     return (n);
 }
-
 #endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
-
 static const tANI_U8 csrStartIbssChannels50[ CSR_NUM_IBSS_START_CHANNELS_50 ] = { 36, 40,  44,  48}; 
 static const tANI_U8 csrStartIbssChannels24[ CSR_NUM_IBSS_START_CHANNELS_24 ] = { 1, 6, 11 };
-
 static void initConfigParam(tpAniSirGlobal pMac);
 static tANI_BOOLEAN csrRoamProcessResults( tpAniSirGlobal pMac, tSmeCmd *pCommand,
                                        eCsrRoamCompleteResult Result, void *Context );
@@ -216,8 +182,8 @@
                                     tANI_BOOLEAN *pfSameIbss );
 static void csrRoamUpdateConnectedProfileFromNewBss( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirSmeNewBssInfo *pNewBss );
 static void csrRoamPrepareBssParams(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, 
-                                     tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes);
-static tAniCBSecondaryMode csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes);
+                                     tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig, tDot11fBeaconIEs *pIes);
+static ePhyChanBondState csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes);
 eHalStatus csrInitGetChannels(tpAniSirGlobal pMac);
 static void csrRoamingStateConfigCnfProcessor( tpAniSirGlobal pMac, tANI_U32 result );
 eHalStatus csrRoamOpen(tpAniSirGlobal pMac);
@@ -237,6 +203,7 @@
 static void csrRoamWaitForKeyTimeOutHandler(void *pv);
  
 static eHalStatus CsrInit11dInfo(tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo);
+static eHalStatus csrInitChannelPowerList( tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo);
 static eHalStatus csrRoamFreeConnectedInfo( tpAniSirGlobal pMac, tCsrRoamConnectedInfo *pConnectedInfo );
 eHalStatus csrSendMBSetContextReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, 
            tSirMacAddr peerMacAddr, tANI_U8 numKeys, tAniEdType edType, 
@@ -248,7 +215,6 @@
                                     tCsrRoamProfile *pProfile );
 void csrRoamStatisticsTimerHandler(void *pv);
 void csrRoamStatsGlobalClassDTimerHandler(void *pv);
-
 static void csrRoamLinkUp(tpAniSirGlobal pMac, tCsrBssid bssid);
 VOS_STATUS csrRoamVccTriggerRssiIndCallback(tHalHandle hHal, 
                                             v_U8_t  rssiNotification, 
@@ -260,15 +226,12 @@
     pStaEntry is no longer invalid upon the return of this function.
 */
 static void csrRoamRemoveStatListEntry(tpAniSirGlobal pMac, tListElem *pEntry);
-
 #ifdef WLAN_SOFTAP_FEATURE
 static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,tANI_U8 operationChn, eCsrBand *pBand );
 #else
 static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, eCsrPhyMode phyModeIn, tANI_U8 operationChn, eCsrBand *pBand );
 #endif
 static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc);
-
-
 tCsrStatsClientReqInfo * csrRoamInsertEntryIntoList( tpAniSirGlobal pMac,
                                                      tDblLinkList *pStaList,
                                                      tCsrStatsClientReqInfo *pStaEntry);
@@ -277,7 +240,7 @@
                                                  tANI_U32 periodicity, tANI_BOOLEAN *pFound, tANI_U8 staId);
 void csrRoamReportStatistics(tpAniSirGlobal pMac, tANI_U32 statsMask, 
                              tCsrStatsCallback callback, tANI_U8 staId, void *pContext);
-void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE tlStats);
+void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE *pTlStats);
 void csrRoamTlStatsTimerHandler(void *pv);
 void csrRoamPeStatsTimerHandler(void *pv);
 tListElem * csrRoamCheckClientReqList(tpAniSirGlobal pMac, tANI_U32 statsMask);
@@ -296,9 +259,7 @@
 void csrRoamJoinRetryTimerHandler(void *pv);
 #endif
 extern void SysProcessMmhMsg(tpAniSirGlobal pMac, tSirMsgQ* pMsg);
-
 extern void btampEstablishLogLinkHdlr(void* pMsg);
-
 static void csrSerDesUnpackDiassocRsp(tANI_U8 *pBuf, tSirSmeDisassocRsp *pRsp);
 
 //Initialize global variables
@@ -313,7 +274,6 @@
     return;
 }
 
-
 static void csrRoamDeInitGlobals(tpAniSirGlobal pMac)
 {
     if(pMac)
@@ -324,13 +284,11 @@
     }
     return;
 }
-
 eHalStatus csrOpen(tpAniSirGlobal pMac)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     static uNvTables nvTables;
     VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
-
     v_REGDOMAIN_t regId;
     tANI_U32 i;
     
@@ -338,7 +296,6 @@
     {
         /* Initialize CSR Roam Globals */
         csrRoamInitGlobals(pMac);
-
         for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
            csrRoamStateChange( pMac, eCSR_ROAMING_STATE_STOP, i);
 
@@ -354,7 +311,6 @@
            break;
         if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &pMac->roam.roamCmdPendingList)))
            break;
-
         vosStatus = vos_nv_readDefaultCountryTable( &nvTables );
         if ( VOS_IS_STATUS_SUCCESS(vosStatus) )
         {
@@ -372,23 +328,18 @@
             //status = eHAL_STATUS_SUCCESS;
         }
         smsLog( pMac, LOGE, FL(" country Code from nvRam %s\n"), pMac->scan.countryCodeDefault );
-
         csrGetRegulatoryDomainForCountry(pMac, pMac->scan.countryCodeDefault, &regId);
-
         WDA_SetRegDomain(pMac, regId);
         pMac->scan.domainIdDefault = regId;
         pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
-
         status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent, 
                          pMac->scan.countryCodeDefault, WNI_CFG_COUNTRY_CODE_LEN);
         status = csrInitGetChannels( pMac );
-
     }while(0);
     
     return (status);
 }
 
-
 #ifdef WLAN_SOFTAP_FEATURE
 eHalStatus csrSetRegInfo(tHalHandle hHal,  tANI_U8 *apCntryCode)
 {
@@ -396,37 +347,30 @@
     tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
     v_REGDOMAIN_t regId;
     v_U8_t        cntryCodeLength;
-
     if(NULL == apCntryCode)
     {
        smsLog( pMac, LOGW, FL(" Invalid country Code Pointer\n") );
        return eHAL_STATUS_FAILURE;
     }
-
     smsLog( pMac, LOGW, FL(" country Code %s\n"), apCntryCode );
-
     /* To get correct Regulatory domain from NV table 
      * 2 character Country code should be used
      * 3rd charater is optional for indoor/outdoor setting */
     cntryCodeLength = strlen(apCntryCode);
-
     status = csrGetRegulatoryDomainForCountry(pMac, apCntryCode, &regId);
     if (status != eHAL_STATUS_SUCCESS)
     {
         smsLog( pMac, LOGE, FL("  fail to get regId for country Code %s\n"), apCntryCode );
         return status;
     }
-
     status = WDA_SetRegDomain(hHal, regId);
     if (status != eHAL_STATUS_SUCCESS)
     {
         smsLog( pMac, LOGE, FL("  fail to get regId for country Code %s\n"), apCntryCode );
         return status;
     }
-
     pMac->scan.domainIdDefault = regId;
     pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
-
     /* Clear CC field */
     palFillMemory( pMac->hHdd,
                    pMac->scan.countryCodeDefault,
@@ -435,7 +379,6 @@
     /* Copy 2 or 3 bytes country code */
     palCopyMemory( pMac->hHdd, pMac->scan.countryCodeDefault, 
                 apCntryCode, cntryCodeLength );
-
     /* If 2 bytes country code, 3rd byte must be filled with space */
     if((WNI_CFG_COUNTRY_CODE_LEN - 1) == cntryCodeLength)
     {
@@ -444,23 +387,18 @@
                       1,
                       0x20 );
     }
-
     status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent, 
                                pMac->scan.countryCodeDefault, WNI_CFG_COUNTRY_CODE_LEN);
     status = csrInitGetChannels( pMac );
-
     return status;
 }
-
 eHalStatus csrSetChannels(tHalHandle hHal,  tCsrConfigParam *pParam  )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
     tANI_U8   index = 0;
-
     palCopyMemory( pMac->hHdd, pParam->Csr11dinfo.countryCode, 
                    pMac->scan.countryCodeCurrent, WNI_CFG_COUNTRY_CODE_LEN );
-
     for ( index = 0; index < pMac->scan.base20MHzChannels.numChannels ; index++)
     {
         pParam->Csr11dinfo.Channels.channelList[index] = pMac->scan.base20MHzChannels.channelList[ index ];
@@ -473,7 +411,6 @@
     return status;
 }
 #endif
-
 eHalStatus csrClose(tpAniSirGlobal pMac)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -484,13 +421,10 @@
     csrLLClose(&pMac->roam.statsClientReqList);
     csrLLClose(&pMac->roam.peStatsReqList);
     csrLLClose(&pMac->roam.roamCmdPendingList);
-
     /* DeInit Globals */
     csrRoamDeInitGlobals(pMac);
-
     return (status);
 } 
-
 eHalStatus csrStart(tpAniSirGlobal pMac)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -524,15 +458,12 @@
            break;
         }
     }while(0);
-
 #if defined(ANI_LOGDUMP)
     csrDumpInit(pMac);
 #endif //#if defined(ANI_LOGDUMP)
-
     return (status);
 }
 
-
 eHalStatus csrStop(tpAniSirGlobal pMac)
 {
     tANI_U32 sessionId;
@@ -542,22 +473,18 @@
     {
         csrRoamCloseSession(pMac, sessionId, TRUE, NULL, NULL);
     }
-
     csrScanDisable(pMac);
     pMac->scan.fCancelIdleScan = eANI_BOOLEAN_FALSE;
     pMac->scan.fRestartIdleScan = eANI_BOOLEAN_FALSE;
-
     csrLLPurge( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_TRUE );
     
 #if   defined WLAN_FEATURE_NEIGHBOR_ROAMING
     csrNeighborRoamClose(pMac);
 #endif
     csrScanFlushResult(pMac); //Do we want to do this?
-
     // deregister from PMC since we register during csrStart()
     // (ignore status since there is nothing we can do if it fails)
     (void) pmcDeregisterPowerSaveCheck(pMac, csrCheckPSReady);
-
     //Reset the domain back to the deault
     pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
     csrResetCountryInformation(pMac, eANI_BOOLEAN_TRUE);
@@ -571,49 +498,44 @@
     return (eHAL_STATUS_SUCCESS);
 }
 
-
 eHalStatus csrReady(tpAniSirGlobal pMac)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
-
     csrScanGetSupportedChannels( pMac );
     //WNI_CFG_VALID_CHANNEL_LIST should be set by this time
     //use it to init the background scan list
     csrInitBGScanChannelList(pMac);
     /* HDD issues the init scan */
     csrScanStartResultAgingTimer(pMac);
-
     //Store the AC weights in TL for later use
     WLANTL_GetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
-
     status = csrInitChannelList( pMac );
     if ( ! HAL_STATUS_SUCCESS( status ) )
     {
        smsLog( pMac, LOGE, "csrInitChannelList failed during csrReady with status=%d\n",
                status );
     }
-
     return (status);
 }
-
 void csrSetDefaultDot11Mode( tpAniSirGlobal pMac )
 {
     v_U32_t wniDot11mode = 0;
-
     wniDot11mode = csrTranslateToWNICfgDot11Mode(pMac,pMac->roam.configParam.uCfgDot11Mode);
     ccmCfgSetInt(pMac, WNI_CFG_DOT11_MODE, wniDot11mode, NULL, eANI_BOOLEAN_FALSE);
 }
-
 void csrSetGlobalCfgs( tpAniSirGlobal pMac )
 {
+
     ccmCfgSetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, csrGetFragThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
     ccmCfgSetInt(pMac, WNI_CFG_RTS_THRESHOLD, csrGetRTSThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
     ccmCfgSetInt(pMac, WNI_CFG_11D_ENABLED,
                         ((pMac->roam.configParam.Is11hSupportEnabled) ? pMac->roam.configParam.Is11dSupportEnabled : pMac->roam.configParam.Is11dSupportEnabled), 
                         NULL, eANI_BOOLEAN_FALSE);
     ccmCfgSetInt(pMac, WNI_CFG_11H_ENABLED, pMac->roam.configParam.Is11hSupportEnabled, NULL, eANI_BOOLEAN_FALSE);
-    //Enable channel bonding at init; for 2.4 Ghz we will update this CFG at start BSS or join 
-    ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, WNI_CFG_CHANNEL_BONDING_MODE_ENABLE, NULL, eANI_BOOLEAN_FALSE);
+    /* For now we will just use the 5GHz CB mode ini parameter to decide whether CB supported or not in Probes when there is no session
+     * Once session is established we will use the session related params stored in PE session for CB mode
+     */
+    ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, !!(pMac->roam.configParam.channelBondingMode5GHz), NULL, eANI_BOOLEAN_FALSE);
     ccmCfgSetInt(pMac, WNI_CFG_HEART_BEAT_THRESHOLD, pMac->roam.configParam.HeartbeatThresh24, NULL, eANI_BOOLEAN_FALSE);
     
     //Update the operating mode to configured value during initialization,
@@ -621,13 +543,11 @@
     csrSetDefaultDot11Mode( pMac );    
 }
 
-
 eHalStatus csrRoamOpen(tpAniSirGlobal pMac)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tANI_U32 i;
     tCsrRoamSession *pSession;
-
     do
     {
         for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
@@ -636,7 +556,6 @@
             pSession->roamingTimerInfo.pMac = pMac;
             pSession->roamingTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
         }
-
         pMac->roam.WaitForKeyTimerInfo.pMac = pMac;
         pMac->roam.WaitForKeyTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
         status = palTimerAlloc(pMac->hHdd, &pMac->roam.hTimerWaitForKey, csrRoamWaitForKeyTimeOutHandler, 
@@ -646,7 +565,6 @@
         smsLog(pMac, LOGE, FL("cannot allocate memory for WaitForKey time out timer\n"));
         break;
       }
-
       status = palTimerAlloc(pMac->hHdd, &pMac->roam.tlStatsReqInfo.hTlStatsTimer, csrRoamTlStatsTimerHandler, pMac);
       if(!HAL_STATUS_SUCCESS(status))
       {
@@ -654,49 +572,38 @@
          return eHAL_STATUS_FAILURE;
       }
     }while (0);
-
     return (status);
 }
 
-
 eHalStatus csrRoamClose(tpAniSirGlobal pMac)
 {
     tANI_U32 sessionId;
-
     for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
     {
         csrRoamCloseSession(pMac, sessionId, TRUE, NULL, NULL);
     }
-
     palTimerStop(pMac->hHdd, pMac->roam.hTimerWaitForKey);
     palTimerFree(pMac->hHdd, pMac->roam.hTimerWaitForKey);
-
     palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
     palTimerFree(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
-
     return (eHAL_STATUS_SUCCESS);
 }
 
-
 eHalStatus csrRoamStart(tpAniSirGlobal pMac)
 {
     (void)pMac;
-
     return (eHAL_STATUS_SUCCESS);
 }
 
-
 void csrRoamStop(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
    csrRoamStopRoamingTimer(pMac, sessionId);
    /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/
    csrRoamDeregStatisticsReq(pMac);
 }
-
 eHalStatus csrRoamGetConnectState(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrConnectState *pState)
 {
     eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
-
     if( pState )
     {
         status = eHAL_STATUS_SUCCESS;
@@ -705,8 +612,6 @@
     return (status);
 }
 
-
-
 eHalStatus csrRoamCopyConnectProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamConnectedProfile *pProfile)
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
@@ -754,10 +659,8 @@
                     pProfile->MDID.mobilityDomain = 0;
                 }
 #endif
-
 #ifdef FEATURE_WLAN_CCX
                 pProfile->isCCXAssoc = pSession->connectedProfile.isCCXAssoc;
-
                 if (csrIsAuthTypeCCX(pSession->connectedProfile.AuthType))
                 {
                     palCopyMemory( pMac->hHdd, pProfile->ccxCckmInfo.krk, 
@@ -775,8 +678,6 @@
     return (status);
 }
 
-
-
 eHalStatus csrRoamGetConnectProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamConnectedProfile *pProfile)
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
@@ -788,10 +689,8 @@
             status = csrRoamCopyConnectProfile(pMac, sessionId, pProfile);
         }
     }
-
     return (status);
 }
-
 eHalStatus csrRoamFreeConnectProfile(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -805,11 +704,9 @@
     return (status);
 }
 
-
 static eHalStatus csrRoamFreeConnectedInfo( tpAniSirGlobal pMac, tCsrRoamConnectedInfo *pConnectedInfo )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
-
     if( pConnectedInfo->pbFrames )
     {
         palFreeMemory( pMac->hHdd, pConnectedInfo->pbFrames );
@@ -825,59 +722,50 @@
 #ifdef FEATURE_WLAN_CCX
     pConnectedInfo->nTspecIeLength = 0;
 #endif    
-
-
     return ( status );
 }
 
-
     
                 
+                
 void csrReleaseCommandRoam(tpAniSirGlobal pMac, tSmeCmd *pCommand)
 {
     csrReinitRoamCmd(pMac, pCommand);
     csrReleaseCommand( pMac, pCommand );
 }
 
-
 void csrReleaseCommandScan(tpAniSirGlobal pMac, tSmeCmd *pCommand)
 {
     csrReinitScanCmd(pMac, pCommand);
     csrReleaseCommand( pMac, pCommand );
 }
 
-
 void csrReleaseCommandWmStatusChange(tpAniSirGlobal pMac, tSmeCmd *pCommand)
 {
     csrReinitWmStatusChangeCmd(pMac, pCommand);
     csrReleaseCommand( pMac, pCommand );
 }
 
-
 void csrReinitSetKeyCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
 {
     palZeroMemory(pMac->hHdd, &pCommand->u.setKeyCmd, sizeof(tSetKeyCmd));
 }
 
-
 void csrReinitRemoveKeyCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
 {
     palZeroMemory(pMac->hHdd, &pCommand->u.removeKeyCmd, sizeof(tRemoveKeyCmd));
 }
 
-
 void csrReleaseCommandSetKey(tpAniSirGlobal pMac, tSmeCmd *pCommand)
 {
     csrReinitSetKeyCmd(pMac, pCommand);
     csrReleaseCommand( pMac, pCommand );
 }
-
 void csrReleaseCommandRemoveKey(tpAniSirGlobal pMac, tSmeCmd *pCommand)
 {
     csrReinitRemoveKeyCmd(pMac, pCommand);
     csrReleaseCommand( pMac, pCommand );
 }
-
 void csrAbortCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fStopping )
 {
 
@@ -896,7 +784,6 @@
             }
             csrReleaseCommandScan( pMac, pCommand );
             break;
-
         case eSmeCommandRoam:
             csrReleaseCommandRoam( pMac, pCommand );
             break;
@@ -921,21 +808,17 @@
     }
 }
 
-
-
 void csrRoamSubstateChange( tpAniSirGlobal pMac, eCsrRoamSubState NewSubstate, tANI_U32 sessionId)
 {
     smsLog( pMac, LOG1, "   CSR RoamSubstate: [ %d <== %d ]\n", NewSubstate, pMac->roam.curSubState[sessionId]);
 
-
     if(pMac->roam.curSubState[sessionId] == NewSubstate)
     {
        return;
-                }
+    }
     pMac->roam.curSubState[sessionId] = NewSubstate;
 }
 
-
 eCsrRoamState csrRoamStateChange( tpAniSirGlobal pMac, eCsrRoamState NewRoamState, tANI_U8 sessionId)
 {
     eCsrRoamState PreviousState;
@@ -957,11 +840,9 @@
     return( PreviousState );
 }
 
-
 void csrAssignRssiForCategory(tpAniSirGlobal pMac, tANI_U8 catOffset)
 {
     int i;
-
     if(catOffset)
     {
         pMac->roam.configParam.bCatRssiOffset = catOffset;
@@ -972,14 +853,13 @@
     }
 }
 
-
 static void initConfigParam(tpAniSirGlobal pMac)
 {
     int i;
-
     pMac->roam.configParam.agingCount = CSR_AGING_COUNT;
     pMac->roam.configParam.channelBondingMode24GHz = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
     pMac->roam.configParam.channelBondingMode5GHz = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
+
     pMac->roam.configParam.phyMode = eCSR_DOT11_MODE_TAURUS;
     pMac->roam.configParam.eBand = eCSR_BAND_ALL;
     pMac->roam.configParam.uCfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
@@ -989,7 +869,7 @@
     pMac->roam.configParam.Is11dSupportEnabled = eANI_BOOLEAN_FALSE;
     pMac->roam.configParam.Is11dSupportEnabledOriginal = eANI_BOOLEAN_FALSE;
     pMac->roam.configParam.Is11eSupportEnabled = eANI_BOOLEAN_TRUE;
-    pMac->roam.configParam.Is11hSupportEnabled = eANI_BOOLEAN_FALSE;
+    pMac->roam.configParam.Is11hSupportEnabled = eANI_BOOLEAN_TRUE;
     pMac->roam.configParam.RTSThreshold = 2346;
     pMac->roam.configParam.shortSlotTime = eANI_BOOLEAN_TRUE;
     pMac->roam.configParam.WMMSupportMode = eCsrRoamWmmAuto;
@@ -1008,23 +888,19 @@
     pMac->roam.configParam.nRoamingTime = CSR_DEFAULT_ROAMING_TIME;
     pMac->roam.configParam.fEnforce11dChannels = eANI_BOOLEAN_FALSE;
     pMac->roam.configParam.fSupplicantCountryCodeHasPriority = eANI_BOOLEAN_FALSE;
-
     pMac->roam.configParam.fEnforceCountryCodeMatch = eANI_BOOLEAN_FALSE;
     pMac->roam.configParam.fEnforceDefaultDomain = eANI_BOOLEAN_FALSE;
     pMac->roam.configParam.nActiveMaxChnTime = CSR_ACTIVE_MAX_CHANNEL_TIME;
     pMac->roam.configParam.nActiveMinChnTime = CSR_ACTIVE_MIN_CHANNEL_TIME;
     pMac->roam.configParam.nPassiveMaxChnTime = CSR_PASSIVE_MAX_CHANNEL_TIME;
     pMac->roam.configParam.nPassiveMinChnTime = CSR_PASSIVE_MIN_CHANNEL_TIME;
-
     pMac->roam.configParam.IsIdleScanEnabled = TRUE; //enable the idle scan by default
     pMac->roam.configParam.nTxPowerCap = CSR_MAX_TX_POWER;
     pMac->roam.configParam.statsReqPeriodicity = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD;
     pMac->roam.configParam.statsReqPeriodicityInPS = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD_IN_BMPS;
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
     pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported = 0;
 #endif
-
 #ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
     pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries = 3;
     pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold = 120;
@@ -1038,22 +914,26 @@
     pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[2] = 11;
     pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod = 20000; //20 seconds
 #endif
+#ifdef WLAN_FEATURE_11AC
+     pMac->roam.configParam.nVhtChannelWidth = WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ + 1;
+#endif
 
     pMac->roam.configParam.addTSWhenACMIsOff = 0;
     pMac->roam.configParam.fScanTwice = eANI_BOOLEAN_FALSE;
-}
+#ifndef BMPS_WORKAROUND_NOT_NEEDED
+    pMac->roam.configParam.doBMPSWorkaround = 0;
+#endif
 
+}
 eCsrBand csrGetCurrentBand(tHalHandle hHal)
 {
     tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
     return pMac->roam.configParam.bandCapability;
 }
-
 eHalStatus csrSetBand(tHalHandle hHal, eCsrBand eBand)
 {
     tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
     eHalStatus status = eHAL_STATUS_SUCCESS;
-    
     if (CSR_IS_PHY_MODE_A_ONLY(pMac) &&
             (eBand == eCSR_BAND_24))
     {
@@ -1064,7 +944,6 @@
             pMac->roam.configParam.uCfgDot11Mode, eBand);
         return eHAL_STATUS_INVALID_PARAMETER;
     }
-
     if ((CSR_IS_PHY_MODE_B_ONLY(pMac) ||
                 CSR_IS_PHY_MODE_G_ONLY(pMac)) &&
             (eBand == eCSR_BAND_5G))
@@ -1076,7 +955,6 @@
             pMac->roam.configParam.uCfgDot11Mode, eBand);
         return eHAL_STATUS_INVALID_PARAMETER;
     }
-
     VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, 
             "Band changed to %u (0 - ALL, 1 - 2.4 GHZ, 2 - 5GHZ)\n", eBand);
     pMac->roam.configParam.eBand = eBand; 
@@ -1087,6 +965,118 @@
         csrInitChannelList( hHal );
     return status;
 }
+/* The funcns csrConvertCBIniValueToPhyCBState and csrConvertPhyCBStateToIniValue have been
+ * introduced to convert the ini value to the ENUM used in csr and MAC for CB state
+ * Ideally we should have kept the ini value and enum value same and representing the same
+ * cb values as in 11n standard i.e. 
+ * Set to 1 (SCA) if the secondary channel is above the primary channel 
+ * Set to 3 (SCB) if the secondary channel is below the primary channel 
+ * Set to 0 (SCN) if no secondary channel is present 
+ * However, since our driver is already distributed we will keep the ini definition as it is which is:
+ * 0 - secondary none
+ * 1 - secondary LOW
+ * 2 - secondary HIGH
+ * and convert to enum value used within the driver in csrChangeDefaultConfigParam using this funcn
+ * The enum values are as follows:
+ * PHY_SINGLE_CHANNEL_CENTERED          = 0
+ * PHY_DOUBLE_CHANNEL_LOW_PRIMARY   = 1
+ * PHY_DOUBLE_CHANNEL_HIGH_PRIMARY  = 3
+ */
+ePhyChanBondState csrConvertCBIniValueToPhyCBState(v_U32_t cbIniValue)
+{
+
+   ePhyChanBondState phyCbState;
+   switch (cbIniValue) {
+      // secondary none
+      case 0:
+        phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
+        break;
+      // secondary LOW
+      case 1:
+        phyCbState = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+        break;
+      // secondary HIGH
+      case 2:
+        phyCbState = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
+        break;
+#ifdef WLAN_FEATURE_11AC
+      case 3:
+        phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED; 
+        break;
+      case 4:
+        phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
+        break;
+      case 5:
+        phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
+        break; 
+      case 6:
+        phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
+        break;
+      case 7:
+        phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
+        break; 
+      case 8:
+        phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
+        break;
+      case 9:
+        phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
+        break; 
+#endif 
+      default:
+        // If an invalid value is passed, disable CHANNEL BONDING
+        phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
+        break;
+   }
+   return phyCbState;
+}
+
+v_U32_t csrConvertPhyCBStateToIniValue(ePhyChanBondState phyCbState)
+{
+
+   v_U32_t cbIniValue;
+   switch (phyCbState) {
+      // secondary none
+      case PHY_SINGLE_CHANNEL_CENTERED:
+        cbIniValue = 0;
+        break;
+      // secondary LOW
+      case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
+        cbIniValue = 1;
+        break;
+      // secondary HIGH
+      case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
+        cbIniValue = 2;
+        break;
+#ifdef WLAN_FEATURE_11AC
+      case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
+        cbIniValue = 3;
+        break;
+      case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
+        cbIniValue = 4;
+        break;
+      case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
+        cbIniValue = 5;
+        break;
+      case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
+        cbIniValue = 6;
+        break;
+      case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
+        cbIniValue = 7;
+        break;
+      case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
+        cbIniValue = 8;
+        break;
+      case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
+        cbIniValue = 9;
+        break;
+#endif
+      default:
+        // return some invalid value
+        cbIniValue = 10;
+        break;
+   }
+   return cbIniValue;
+}
 
 eHalStatus csrChangeDefaultConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
 {
@@ -1102,8 +1092,20 @@
         pMac->roam.configParam.Is11hSupportEnabled = pParam->Is11hSupportEnabled;
 
         pMac->roam.configParam.fenableMCCMode = pParam->fEnableMCCMode;
-        pMac->roam.configParam.channelBondingMode24GHz = pParam->channelBondingMode24GHz;
-        pMac->roam.configParam.channelBondingMode5GHz = pParam->channelBondingMode5GHz;
+        /* channelBondingMode5GHz plays a dual role right now
+         * INFRA STA will use this non zero value as CB enabled and SOFTAP will use this non-zero value to determine the secondary channel offset
+         * This is how channelBondingMode5GHz works now and this is kept intact to avoid any cfg.ini change
+         */
+        if (pParam->channelBondingMode24GHz > MAX_CB_VALUE_IN_INI)
+        {
+            smsLog( pMac, LOGW, "Invalid CB value from ini in 2.4GHz band %d, CB DISABLED\n", pParam->channelBondingMode24GHz); 
+        }
+        pMac->roam.configParam.channelBondingMode24GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode24GHz);
+        if (pParam->channelBondingMode5GHz > MAX_CB_VALUE_IN_INI)
+        {
+            smsLog( pMac, LOGW, "Invalid CB value from ini in 5GHz band %d, CB DISABLED\n", pParam->channelBondingMode5GHz); 
+        }
+        pMac->roam.configParam.channelBondingMode5GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode5GHz);
         pMac->roam.configParam.RTSThreshold = pParam->RTSThreshold;
         pMac->roam.configParam.phyMode = pParam->phyMode;
         pMac->roam.configParam.shortSlotTime = pParam->shortSlotTime;
@@ -1116,7 +1118,6 @@
         pMac->roam.configParam.bandCapability = pParam->bandCapability;
         pMac->roam.configParam.cbChoice = pParam->cbChoice;
         pMac->roam.configParam.bgScanInterval = pParam->bgScanInterval;
-
         //if HDD passed down non zero values then only update,
         //otherwise keep using the defaults
         if(pParam->nActiveMaxChnTime)
@@ -1140,7 +1141,6 @@
         {
             //Change the unit from second to microsecond
             tANI_U32 impsSleepTime = pParam->impsSleepTime * PAL_TIMER_TO_SEC_UNIT;
-
             if(CSR_IDLE_SCAN_NO_PS_INTERVAL_MIN <= impsSleepTime)
             {
                 pMac->roam.configParam.impsSleepTime = impsSleepTime;
@@ -1168,17 +1168,14 @@
         {
             pMac->roam.configParam.agingCount = pParam->nScanResultAgeCount;
         }
-
         if(pParam->scanAgeTimeNCNPS)
         {
             pMac->roam.configParam.scanAgeTimeNCNPS = pParam->scanAgeTimeNCNPS;  
         }
-
         if(pParam->scanAgeTimeNCPS)
         {
             pMac->roam.configParam.scanAgeTimeNCPS = pParam->scanAgeTimeNCPS;   
         }
-
         if(pParam->scanAgeTimeCNPS)
         {
             pMac->roam.configParam.scanAgeTimeCNPS = pParam->scanAgeTimeCNPS;   
@@ -1194,16 +1191,13 @@
         pMac->roam.configParam.fSupplicantCountryCodeHasPriority = pParam->fSupplicantCountryCodeHasPriority;
         pMac->roam.configParam.fEnforceCountryCodeMatch = pParam->fEnforceCountryCodeMatch;
         pMac->roam.configParam.fEnforceDefaultDomain = pParam->fEnforceDefaultDomain;
-
         pMac->roam.configParam.vccRssiThreshold = pParam->vccRssiThreshold;
         pMac->roam.configParam.vccUlMacLossThreshold = pParam->vccUlMacLossThreshold;
-
         pMac->roam.configParam.IsIdleScanEnabled = pParam->IsIdleScanEnabled;
         pMac->roam.configParam.statsReqPeriodicity = pParam->statsReqPeriodicity;
         pMac->roam.configParam.statsReqPeriodicityInPS = pParam->statsReqPeriodicityInPS;
         //Assign this before calling CsrInit11dInfo
         pMac->roam.configParam.nTxPowerCap = pParam->nTxPowerCap;
-
         if( csrIs11dSupported( pMac ) )
         {
             status = CsrInit11dInfo(pMac, &pParam->Csr11dinfo);
@@ -1212,16 +1206,23 @@
         {
             pMac->scan.curScanType = eSIR_ACTIVE_SCAN;
         }
+
+        /* Initialize the power + channel information if 11h is enabled.
+        If 11d is enabled this information has already been initialized */
+        if( csrIs11hSupported( pMac ) && !csrIs11dSupported( pMac ) )
+        {
+            csrInitChannelPowerList(pMac, &pParam->Csr11dinfo);
+        }
+
+
 #ifdef WLAN_FEATURE_VOWIFI_11R 
         palCopyMemory( pMac->hHdd, &pMac->roam.configParam.csr11rConfig, &pParam->csr11rConfig, sizeof(tCsr11rConfigParams) );
         smsLog( pMac, LOG1, "IsFTResourceReqSupp = %d\n", pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported); 
 #endif
-
 #if  defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
         pMac->roam.configParam.isFastTransitionEnabled = pParam->isFastTransitionEnabled;
         pMac->roam.configParam.RoamRssiDiff = pParam->RoamRssiDiff;
 #endif
-
 #ifdef FEATURE_WLAN_LFR 
         pMac->roam.configParam.isFastRoamIniFeatureEnabled = pParam->isFastRoamIniFeatureEnabled;
 #endif
@@ -1229,10 +1230,8 @@
 #ifdef FEATURE_WLAN_CCX 
         pMac->roam.configParam.isCcxIniFeatureEnabled = pParam->isCcxIniFeatureEnabled;
 #endif
-
 #ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
         palCopyMemory( pMac->hHdd, &pMac->roam.configParam.neighborRoamConfig, &pParam->neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
-
         smsLog( pMac, LOG1, "nNeighborScanTimerPerioid = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod);
         smsLog( pMac, LOG1, "nNeighborReassocRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold);  
         smsLog( pMac, LOG1, "nNeighborLookupRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold);  
@@ -1240,11 +1239,9 @@
         smsLog( pMac, LOG1, "nNeighborScanMaxChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime);
         smsLog( pMac, LOG1, "nMaxNeighborRetries = %d\n", pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries); 
         smsLog( pMac, LOG1, "nNeighborResultsRefreshPeriod = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod); 
-
         {
            int i;
            smsLog( pMac, LOG1, FL("Num of Channels in CFG Channel List: %d\n"), pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels); 
-
            for( i=0; i< pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels; i++)
            {
               smsLog( pMac, LOG1, "%d ", pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[i] );
@@ -1252,22 +1249,32 @@
            smsLog( pMac, LOG1, "\n");
         }
 #endif
-
         pMac->roam.configParam.addTSWhenACMIsOff = pParam->addTSWhenACMIsOff;
         pMac->scan.fValidateList = pParam->fValidateList;
         pMac->scan.fEnableBypass11d = pParam->fEnableBypass11d;
         pMac->scan.fEnableDFSChnlScan = pParam->fEnableDFSChnlScan;
         pMac->roam.configParam.fScanTwice = pParam->fScanTwice;
+        pMac->scan.fFirstScanOnly2GChnl = pParam->fFirstScanOnly2GChnl;
+        /* This parameter is not available in cfg and not passed from upper layers. Instead it is initialized here
+         * This paramtere is used in concurrency to determine if there are concurrent active sessions.
+         * Is used as a temporary fix to disconnect all active sessions when BMPS enabled so the active session if Infra STA
+         * will automatically connect back and resume BMPS since resume BMPS is not working when moving from concurrent to
+         * single session
+         */
+#ifndef BMPS_WORKAROUND_NOT_NEEDED
+       pMac->roam.configParam.doBMPSWorkaround = 0;
+#endif
+#ifdef WLAN_FEATURE_11AC
+        pMac->roam.configParam.nVhtChannelWidth = pParam->nVhtChannelWidth;
+#endif
     }
     
     return status;
 }
 
-
 eHalStatus csrGetConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
 {
     eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
-
     if(pParam)
     {
         pParam->WMMSupportMode = pMac->roam.configParam.WMMSupportMode;
@@ -1276,8 +1283,8 @@
         pParam->Is11dSupportEnabled = pMac->roam.configParam.Is11dSupportEnabled;
         pParam->Is11dSupportEnabledOriginal = pMac->roam.configParam.Is11dSupportEnabledOriginal;
         pParam->Is11hSupportEnabled = pMac->roam.configParam.Is11hSupportEnabled;
-        pParam->channelBondingMode24GHz = pMac->roam.configParam.channelBondingMode24GHz;
-        pParam->channelBondingMode5GHz = pMac->roam.configParam.channelBondingMode5GHz;
+        pParam->channelBondingMode24GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode24GHz);
+        pParam->channelBondingMode5GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode5GHz);
         pParam->RTSThreshold = pMac->roam.configParam.RTSThreshold;
         pParam->phyMode = pMac->roam.configParam.phyMode;
         pParam->shortSlotTime = pMac->roam.configParam.shortSlotTime;
@@ -1290,12 +1297,10 @@
         pParam->bandCapability = pMac->roam.configParam.bandCapability;
         pParam->cbChoice = pMac->roam.configParam.cbChoice;
         pParam->bgScanInterval = pMac->roam.configParam.bgScanInterval;
-
         pParam->nActiveMaxChnTime = pMac->roam.configParam.nActiveMaxChnTime;
         pParam->nActiveMinChnTime = pMac->roam.configParam.nActiveMinChnTime;
         pParam->nPassiveMaxChnTime = pMac->roam.configParam.nPassiveMaxChnTime;
         pParam->nPassiveMinChnTime = pMac->roam.configParam.nPassiveMinChnTime;
-
         //Change the unit from microsecond to second
         pParam->impsSleepTime = pMac->roam.configParam.impsSleepTime / PAL_TIMER_TO_SEC_UNIT;
         pParam->eBand = pMac->roam.configParam.eBand;
@@ -1312,38 +1317,37 @@
         pParam->fEnforceDefaultDomain = pMac->roam.configParam.fEnforceDefaultDomain;        
         pParam->vccRssiThreshold = pMac->roam.configParam.vccRssiThreshold;
         pParam->vccUlMacLossThreshold = pMac->roam.configParam.vccUlMacLossThreshold;
-
         pParam->IsIdleScanEnabled = pMac->roam.configParam.IsIdleScanEnabled;
         pParam->nTxPowerCap = pMac->roam.configParam.nTxPowerCap;
         pParam->statsReqPeriodicity = pMac->roam.configParam.statsReqPeriodicity;
         pParam->statsReqPeriodicityInPS = pMac->roam.configParam.statsReqPeriodicityInPS;
-
         pParam->addTSWhenACMIsOff = pMac->roam.configParam.addTSWhenACMIsOff;
         pParam->fValidateList = pMac->roam.configParam.fValidateList;
         pParam->fEnableBypass11d = pMac->scan.fEnableBypass11d;
         pParam->fEnableDFSChnlScan = pMac->scan.fEnableDFSChnlScan;
         pParam->fScanTwice = pMac->roam.configParam.fScanTwice;
+        pParam->fFirstScanOnly2GChnl = pMac->scan.fFirstScanOnly2GChnl;
 
 #ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
         palCopyMemory( pMac->hHdd, &pParam->neighborRoamConfig, &pMac->roam.configParam.neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
 #endif
+#ifdef WLAN_FEATURE_11AC
+        pParam->nVhtChannelWidth = pMac->roam.configParam.nVhtChannelWidth;
+#endif
 
         csrSetChannels(pMac, pParam);
 
         status = eHAL_STATUS_SUCCESS;
     }
-
     return (status);
 }
 
-
 eHalStatus csrSetPhyMode(tHalHandle hHal, tANI_U32 phyMode, eCsrBand eBand, tANI_BOOLEAN *pfRestartNeeded)
 {
     eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
     tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
     tANI_BOOLEAN fRestartNeeded = eANI_BOOLEAN_FALSE;
     eCsrPhyMode newPhyMode = eCSR_DOT11_MODE_AUTO;
-
     do
     {
         if(eCSR_BAND_24 == eBand)
@@ -1443,10 +1447,8 @@
                 newPhyMode = eCSR_DOT11_MODE_AUTO;
             }
         }
-
         //Done validating
         status = eHAL_STATUS_SUCCESS;
-
         //Now we need to check whether a restart is needed.
         if(eBand != pMac->roam.configParam.eBand)
         {
@@ -1458,9 +1460,7 @@
             fRestartNeeded = eANI_BOOLEAN_TRUE;
             break;
         }
-
     }while(0);
-
     if(HAL_STATUS_SUCCESS(status))
     {
         pMac->roam.configParam.eBand = eBand;
@@ -1470,16 +1470,13 @@
             *pfRestartNeeded = fRestartNeeded;
         }
     }
-
     return (status);
 }
     
-
 void csrPruneChannelListForMode( tpAniSirGlobal pMac, tCsrChannel *pChannelList )
 {
     tANI_U8 Index;
     tANI_U8 cChannels;
-
     // for dual band NICs, don't need to trim the channel list....
     if ( !CSR_IS_OPEARTING_DUAL_BAND( pMac ) )
     {
@@ -1496,7 +1493,6 @@
                     cChannels++;
                 }
             }
-
             // Cleanup the rest of channels.   Note we only need to clean up the channels if we had
             // to trim the list.  Calling palZeroMemory() with a 0 size is going to throw asserts on 
             // the debug builds so let's be a bit smarter about that.  Zero out the reset of the channels
@@ -1524,7 +1520,6 @@
                     cChannels++;
                 }
             }
-
             // Cleanup the rest of channels.   Note we only need to clean up the channels if we had
             // to trim the list.  Calling palZeroMemory() with a 0 size is going to throw asserts on 
             // the debug builds so let's be a bit smarter about that.  Zero out the reset of the channels
@@ -1541,9 +1536,7 @@
             pChannelList->numChannels = cChannels;
         }
     }
-
 }
-
 #ifdef WLAN_SOFTAP_FEATURE
 #define INFRA_AP_DEFAULT_CHANNEL 6
 eHalStatus csrIsValidChannel(tpAniSirGlobal pMac, tANI_U8 chnNum)
@@ -1560,7 +1553,6 @@
     return status;
 }
 #endif
-
 eHalStatus csrInitGetChannels(tpAniSirGlobal pMac)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -1568,7 +1560,7 @@
     VOS_STATUS vosStatus;
     tANI_U8 Index = 0;
     tANI_U8 num40MHzChannelsFound = 0;
-
+    
     
     //TODO: this interface changed to include the 40MHz channel list
     // this needs to be tied into the adapter structure somehow and referenced appropriately for CB operation
@@ -1610,16 +1602,13 @@
         }
         pMac->scan.base40MHzChannels.numChannels = num40MHzChannelsFound;
     }
-
     return (status);  
 }
 
-
 eHalStatus csrInitChannelList( tHalHandle hHal )
 {
     tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
     eHalStatus status = eHAL_STATUS_SUCCESS;
-
     csrPruneChannelListForMode(pMac, &pMac->scan.baseChannels);
     csrPruneChannelListForMode(pMac, &pMac->scan.base20MHzChannels);
     // Apply the base channel list, power info, and set the Country code...
@@ -1627,20 +1616,16 @@
  
     return (status);
 }
-
-
 eHalStatus csrChangeConfigParams(tpAniSirGlobal pMac, 
                                  tCsrUpdateConfigParam *pUpdateConfigParam)
 {
    eHalStatus status = eHAL_STATUS_FAILURE;
    tCsr11dinfo *ps11dinfo = NULL;
-
    ps11dinfo = &pUpdateConfigParam->Csr11dinfo;
    status = CsrInit11dInfo(pMac, ps11dinfo);
    return status;
 }
 
-
 static eHalStatus CsrInit11dInfo(tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
 {
   eHalStatus status = eHAL_STATUS_FAILURE;
@@ -1654,7 +1639,6 @@
   {
      return (status);
   }
-
   if ( ps11dinfo->Channels.numChannels && ( WNI_CFG_VALID_CHANNEL_LIST_LEN >= ps11dinfo->Channels.numChannels ) ) 
   {
     pMac->scan.base20MHzChannels.numChannels = ps11dinfo->Channels.numChannels;
@@ -1667,12 +1651,10 @@
      //No change
      return (eHAL_STATUS_SUCCESS);
   }
-
   //legacy maintenance
   status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeDefault, 
                          ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
   if(!HAL_STATUS_SUCCESS(status)) return (status);
-
   //Tush: at csropen get this initialized with default, during csr reset if this 
   // already set with some value no need initilaize with default again
   if(0 == pMac->scan.countryCodeCurrent[0])
@@ -1681,12 +1663,62 @@
                          ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
      if(!HAL_STATUS_SUCCESS(status)) return (status);
   }
-
   // need to add the max power channel list
   if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
   {
       palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
       pChanInfoStart = pChanInfo;
+      for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
+      {
+        pChanInfo->firstChanNum = ps11dinfo->ChnPower[index].firstChannel;
+        pChanInfo->numChannels  = ps11dinfo->ChnPower[index].numChannels;
+        pChanInfo->maxTxPower   = CSR_ROAM_MIN( ps11dinfo->ChnPower[index].maxtxPower, pMac->roam.configParam.nTxPowerCap );
+        pChanInfo++;
+        count++;
+      }
+      if(count)
+      {
+          csrSaveToChannelPower2G_5G( pMac, count * sizeof(tSirMacChanInfo), pChanInfoStart );
+      }
+      palFreeMemory(pMac->hHdd, pChanInfoStart);
+  }
+  //Only apply them to CFG when not in STOP state. Otherwise they will be applied later
+  if( HAL_STATUS_SUCCESS(status) )
+  {
+      for( index = 0; index < CSR_ROAM_SESSION_MAX; index++ )
+      {
+          if((CSR_IS_SESSION_VALID(pMac, index)) && CSR_IS_ROAM_STOP(pMac, index))
+          {
+              applyConfig = FALSE;
+          }
+    }
+
+    if(TRUE == applyConfig)
+    {
+        // Apply the base channel list, power info, and set the Country code...
+        csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
+    }
+
+  }
+  return (status);
+}
+/* Initialize the Channel + Power List in the local cache and in the CFG */
+eHalStatus csrInitChannelPowerList( tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
+{
+  tANI_U8  index;
+  tANI_U32 count=0;
+  tSirMacChanInfo *pChanInfo;
+  tSirMacChanInfo *pChanInfoStart;
+
+  if(!ps11dinfo || !pMac)
+  {
+     return eHAL_STATUS_FAILURE;
+  }
+
+  if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
+  {
+      palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
+      pChanInfoStart = pChanInfo;
 
       for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
       {
@@ -1703,26 +1735,7 @@
       palFreeMemory(pMac->hHdd, pChanInfoStart);
   }
 
-  //Only apply them to CFG when not in STOP state. Otherwise they will be applied later
-  if( HAL_STATUS_SUCCESS(status) )
-  {
-      for( index = 0; index < CSR_ROAM_SESSION_MAX; index++ )
-      {
-          if((CSR_IS_SESSION_VALID(pMac, index)) && CSR_IS_ROAM_STOP(pMac, index))
-          {
-              applyConfig = FALSE;
-          }
-    }
-
-    if(TRUE == applyConfig)
-    {
-        // Apply the base channel list, power info, and set the Country code...
-        csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
-    }
-
-  }
-
-  return (status);
+  return eHAL_STATUS_SUCCESS;
 }
 
 //pCommand may be NULL
@@ -1745,7 +1758,6 @@
     {
         pNextEntry = csrLLNext( &pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK );
         pDupCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
-
         // Remove the previous command if..
         // - the new roam command is for the same RoamReason...
         // - the new roam command is a NewProfileList.
@@ -1787,7 +1799,6 @@
     }
     csrLLClose(&localList);
 }
-
 eHalStatus csrRoamCallCallback(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo, 
                                tANI_U32 roamId, eRoamCmdStatus u1, eCsrRoamResult u2)
 {
@@ -1796,7 +1807,6 @@
     WLAN_VOS_DIAG_EVENT_DEF(connectionStatus, vos_event_wlan_status_payload_type);
 #endif
     tCsrRoamSession *pSession;
-
     if( CSR_IS_SESSION_VALID( pMac, sessionId) )
     {
         pSession = CSR_GET_SESSION( pMac, sessionId );
@@ -1807,12 +1817,10 @@
        VOS_ASSERT(0);
        return eHAL_STATUS_FAILURE;
     }
-
     if(eCSR_ROAM_ASSOCIATION_COMPLETION == u1 && pRoamInfo)
     {
         smsLog(pMac, LOGW, " Assoc complete result = %d statusCode = %d reasonCode = %d\n", u2, pRoamInfo->statusCode, pRoamInfo->reasonCode);
     }
-
     if ( (pSession == NULL) ||
         (eANI_BOOLEAN_FALSE == pSession->sessionActive) )
     {
@@ -1850,7 +1858,6 @@
           connectionStatus.rssi = pRoamInfo->pBssDesc->rssi * (-1);
           connectionStatus.channel = pRoamInfo->pBssDesc->channelId;
        }
-
        connectionStatus.qosCapability = pRoamInfo->u.pConnectedProfile->qosConnection;
        connectionStatus.authType = (v_U8_t)diagAuthTypeFromCSRType(pRoamInfo->u.pConnectedProfile->AuthType);
        connectionStatus.encryptionType = (v_U8_t)diagEncTypeFromCSRType(pRoamInfo->u.pConnectedProfile->EncryptionType);
@@ -1858,40 +1865,34 @@
        connectionStatus.reason = eCSR_REASON_UNSPECIFIED;
        WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
     }
-
     if((eCSR_ROAM_MIC_ERROR_IND == u1) || (eCSR_ROAM_RESULT_MIC_FAILURE == u2))
     {
        connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
        connectionStatus.reason = eCSR_REASON_MIC_ERROR;
        WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
     }
-
     if(eCSR_ROAM_RESULT_FORCED == u2)
     {
        connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
        connectionStatus.reason = eCSR_REASON_USER_REQUESTED;
        WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
     }
-
     if(eCSR_ROAM_RESULT_DISASSOC_IND == u2)
     {
        connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
        connectionStatus.reason = eCSR_REASON_DISASSOC;
        WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
     }
-
     if(eCSR_ROAM_RESULT_DEAUTH_IND == u2)
     {
        connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
        connectionStatus.reason = eCSR_REASON_DEAUTH;
        WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
     }
-
 #endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
     
     return (status);
 }
-
 // Returns whether handoff is currently in progress or not
 tANI_BOOLEAN csrRoamIsHandoffInProgress(tpAniSirGlobal pMac)
 {
@@ -1900,9 +1901,7 @@
 #else
     return eANI_BOOLEAN_FALSE;
 #endif
-
 }
-
 eHalStatus csrRoamIssueDisassociate( tpAniSirGlobal pMac, tANI_U32 sessionId,
                                      eCsrRoamSubState NewSubstate, tANI_BOOLEAN fMICFailure )
 {   
@@ -1930,26 +1929,23 @@
     {
         reasonCode = eSIR_MAC_UNSPEC_FAILURE_REASON;
     }    
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
     if ( (csrRoamIsHandoffInProgress(pMac)) && 
          (NewSubstate != eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF))
     {
         tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
         palCopyMemory(pMac->hHdd, &bssId, pNeighborRoamInfo->csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
-
     } else 
 #endif
     if(pSession->pConnectBssDesc)
     {
         palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
     }
-
+    
     
     smsLog( pMac, LOGE, "CSR Attempting to Disassociate Bssid= %02x-%02x-%02x-%02x-%02x-%02x subState = %d\n", 
                   bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
                   bssId[ 3 ], bssId[ 4 ], bssId[ 5 ], NewSubstate );    
-
     csrRoamSubstateChange( pMac, NewSubstate, sessionId);
 
     status = csrSendMBDisassocReqMsg( pMac, sessionId, bssId, reasonCode );    
@@ -1957,7 +1953,6 @@
     if(HAL_STATUS_SUCCESS(status)) 
     {
         csrRoamLinkDown(pMac, sessionId);
-
 #ifndef WLAN_MDM_CODE_REDUCTION_OPT
         //no need to tell QoS that we are disassociating, it will be taken care off in assoc req for HO
         if(eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF != NewSubstate)
@@ -1967,14 +1962,10 @@
         }
 #endif
      }
-
     return (status);
 }
-
 #ifdef WLAN_SOFTAP_FEATURE
 
-
-
 /* ---------------------------------------------------------------------------
     \fn csrRoamIssueDisassociateStaCmd
     \brief csr function that HDD calls to disassociate a associated station
@@ -2017,7 +2008,6 @@
 }
 
 
-
 /* ---------------------------------------------------------------------------
     \fn csrRoamIssueDeauthSta
     \brief csr function that HDD calls to delete a associated station
@@ -2058,9 +2048,6 @@
 
     return status;
 }
-
-
-
 eHalStatus
 csrRoamIssueTkipCounterMeasures( tpAniSirGlobal pMac, tANI_U32 sessionId,
                                     tANI_BOOLEAN bEnable )
@@ -2068,13 +2055,11 @@
     eHalStatus status = eHAL_STATUS_FAILURE;
     tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if (!pSession)
     {
         smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:CSR Session not found\n");
         return (status);
     }
-
     if (pSession->pConnectBssDesc)
     {
         palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
@@ -2084,15 +2069,12 @@
         smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:Connected BSS Description in CSR Session not found\n");
         return (status);
     }
-
     smsLog( pMac, LOG2, "CSR issuing tkip counter measures for Bssid = %02x-%02x-%02x-%02x-%02x-%02x, Enable = %d\n", 
                   bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
                   bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] , bEnable);
-
     status = csrSendMBTkipCounterMeasuresReqMsg( pMac, sessionId, bEnable, bssId );
     return (status);
 }
-
 eHalStatus
 csrRoamGetAssociatedStas( tpAniSirGlobal pMac, tANI_U32 sessionId,
                             VOS_MODULE_ID modId,  void *pUsrContext,
@@ -2101,13 +2083,11 @@
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if (!pSession)
     {
         smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:CSR Session not found\n");
         return (status);
     }
-
     if(pSession->pConnectBssDesc)
     {
         palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
@@ -2117,15 +2097,12 @@
         smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:Connected BSS Description in CSR Session not found\n");
         return (status);
     }
-
     smsLog( pMac, LOG2, "CSR getting associated stations for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
                   bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
                   bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
-
     status = csrSendMBGetAssociatedStasReqMsg( pMac, sessionId, modId, bssId, pUsrContext, pfnSapEventCallback, pAssocStasBuf );
     return (status);
 }
-
 eHalStatus
 csrRoamGetWpsSessionOverlap( tpAniSirGlobal pMac, tANI_U32 sessionId,
                              void *pUsrContext, void *pfnSapEventCallback, v_MACADDR_t pRemoveMac )
@@ -2139,7 +2116,6 @@
         smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:CSR Session not found\n");
         return (status);
     }
-
     if(pSession->pConnectBssDesc)
     {
         palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
@@ -2149,7 +2125,6 @@
         smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:Connected BSS Description in CSR Session not found\n");
         return (status);
     }
-
     smsLog( pMac, LOG2, "CSR getting WPS Session Overlap for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
                   bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
                   bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
@@ -2158,9 +2133,7 @@
             
     return (status);
 }
-
 #endif
-
 eHalStatus csrRoamIssueDeauth( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
 {   
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -2171,11 +2144,9 @@
     {
         palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
     }
-
     smsLog( pMac, LOG2, "CSR Attempting to Deauth Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n", 
                   bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
                   bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );    
-
     csrRoamSubstateChange( pMac, NewSubstate, sessionId);
     
     status = csrSendMBDeauthReqMsg( pMac, sessionId, bssId, eSIR_MAC_DISASSOC_LEAVING_BSS_REASON );    
@@ -2183,8 +2154,6 @@
     return (status);
 }
 
-
-
 eHalStatus csrRoamSaveConnectedBssDesc( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDesc )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -2221,18 +2190,16 @@
     return (status);
 }
 
-
 eHalStatus csrRoamPrepareBssConfig(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, 
                                     tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
                                     tDot11fBeaconIEs *pIes)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     eCsrCfgDot11Mode cfgDot11Mode;
-
 #if defined(VOSS_ENABLED)
     VOS_ASSERT( pIes != NULL );
 #endif
-    
+
     do
     {
         palCopyMemory(pMac->hHdd, &pBssConfig->BssCap, &pBssDesc->capabilityInfo, sizeof(tSirMacCapabilityInfo));
@@ -2283,7 +2250,6 @@
                 pBssConfig->uCfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
             }
         }
-
         //Qos
         if ((pBssConfig->uCfgDot11Mode != eCSR_CFG_DOT11_MODE_11N) &&
                 (pMac->roam.configParam.WMMSupportMode == eCsrRoamWmmNoQos))
@@ -2303,11 +2269,9 @@
             case eCSR_AUTH_TYPE_OPEN_SYSTEM:
                 pBssConfig->authType = eSIR_OPEN_SYSTEM;
                 break;
-
             case eCSR_AUTH_TYPE_SHARED_KEY:
                 pBssConfig->authType = eSIR_SHARED_KEY;
                 break;
-
             case eCSR_AUTH_TYPE_AUTOSWITCH:
                 pBssConfig->authType = eSIR_AUTO_SWITCH;
                 break;
@@ -2343,11 +2307,11 @@
         }
         //Join timeout
         // if we find a BeaconInterval in the BssDescription, then set the Join Timeout to 
-        // be 3 x the BeaconInterval.                          
+        // be 10 x the BeaconInterval.                          
         if ( pBssDesc->beaconInterval )
         {
             //Make sure it is bigger than the minimal
-            pBssConfig->uJoinTimeOut = CSR_ROAM_MAX(3 * pBssDesc->beaconInterval, CSR_JOIN_FAILURE_TIMEOUT_MIN);
+            pBssConfig->uJoinTimeOut = CSR_ROAM_MAX(10 * pBssDesc->beaconInterval, CSR_JOIN_FAILURE_TIMEOUT_MIN);
         }
         else 
         {
@@ -2356,11 +2320,9 @@
         //validate CB
         pBssConfig->cbMode = csrGetCBModeFromIes(pMac, pBssDesc->channelId, pIes);
     }while(0);
-
     return (status);
 }
 
-
 static eHalStatus csrRoamPrepareBssConfigFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, 
                                                      tBssConfigParam *pBssConfig, tSirBssDescription *pBssDesc)
 {
@@ -2379,7 +2341,6 @@
         //SSID must present
         return eHAL_STATUS_FAILURE;
     }
-
     //Settomg up the capabilities
     if( csrIsBssTypeIBSS(pProfile->BSSType) )
     {
@@ -2393,25 +2354,21 @@
     {
         pBssConfig->BssCap.privacy = 1;
     }
-
     pBssConfig->eBand = pMac->roam.configParam.eBand;
     //phymode
     if(pProfile->ChannelInfo.ChannelList)
     {
        operationChannel = pProfile->ChannelInfo.ChannelList[0];
     }
-
 #ifdef WLAN_SOFTAP_FEATURE
     pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, operationChannel, 
                                         &pBssConfig->eBand);
 #else
-
     pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, 
                                         &pBssConfig->eBand);
 #endif
     //QOS
     //Is this correct to always set to this //***
-
     if ( pBssConfig->BssCap.ess == 1 ) 
     {
 #ifdef WLAN_SOFTAP_FEATURE
@@ -2429,7 +2386,6 @@
     } else {
              qAPisEnabled = TRUE;
     }
-
     if (( eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode && qAPisEnabled) ||
           (( eCSR_CFG_DOT11_MODE_11N == pBssConfig->uCfgDot11Mode && qAPisEnabled) ||
              ( eCSR_CFG_DOT11_MODE_TAURUS == pBssConfig->uCfgDot11Mode ) ) //For 11n, need QoS
@@ -2450,11 +2406,9 @@
         case eCSR_AUTH_TYPE_OPEN_SYSTEM:
             pBssConfig->authType = eSIR_OPEN_SYSTEM;
             break;
-
         case eCSR_AUTH_TYPE_SHARED_KEY:
             pBssConfig->authType = eSIR_SHARED_KEY;
             break;
-
         case eCSR_AUTH_TYPE_AUTOSWITCH:
             pBssConfig->authType = eSIR_AUTO_SWITCH;
             break;
@@ -2482,10 +2436,9 @@
     }
     //Join timeout
     pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
-    
+
     return (status);
 }
-
 static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc)
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
@@ -2498,7 +2451,6 @@
          //err msg
          VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, 
                    "csrRoamGetQosInfoFromBss() failed\n");
-
          break;
       }
       //check if the AP is QAP & it supports APSD
@@ -2507,14 +2459,11 @@
          return eHAL_STATUS_SUCCESS;
       }
    } while (0);
-
    return status;
 }
 
-
 void csrSetCfgPrivacy( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, tANI_BOOLEAN fPrivacy )
 {
-
     // !! Note:  the only difference between this function and the csrSetCfgPrivacyFromProfile() is the 
     // setting of the privacy CFG based on the advertised privacy setting from the AP for WPA associations. 
     // See !!Note: below in this function...
@@ -2559,7 +2508,6 @@
                         
             // Set the Wep default key ID.
             WepDefaultKeyId = pProfile->Keys.defaultIndex;
-
             // Wep key size if 5 bytes (40 bits).
             WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5;            
             
@@ -2603,7 +2551,6 @@
             {
                 Key3Length = 0;
             }      
-
             break;
         
         case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
@@ -2684,7 +2631,6 @@
             Key3Length = 0;        
           
             break;     
-
         default:
             PrivacyEnabled = 0;
             RsnEnabled = 0;
@@ -2701,7 +2647,6 @@
     ccmCfgSetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, WepDefaultKeyId, NULL, eANI_BOOLEAN_FALSE);
 }
 
-
 static void csrSetCfgSsid( tpAniSirGlobal pMac, tSirMacSSid *pSSID )
 {
     tANI_U32 len = 0;
@@ -2712,58 +2657,46 @@
     ccmCfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *)pSSID->ssId, len, NULL, eANI_BOOLEAN_FALSE);
 }
 
-
 eHalStatus csrSetQosToCfg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrMediaAccessType qosType )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tANI_U32 QoSEnabled;
     tANI_U32 WmeEnabled;
-
     // set the CFG enable/disable variables based on the qosType being configured...
     switch( qosType )
     {
-
         case eCSR_MEDIUM_ACCESS_WMM_eDCF_802dot1p:
             QoSEnabled = FALSE;
             WmeEnabled = TRUE;
             break;
-
         case eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP:
             QoSEnabled = FALSE;
             WmeEnabled = TRUE;
             break;
-
         case eCSR_MEDIUM_ACCESS_WMM_eDCF_NoClassify:
             QoSEnabled = FALSE;
             WmeEnabled = TRUE;
             break;
-
         case eCSR_MEDIUM_ACCESS_11e_eDCF:
             QoSEnabled = TRUE;
             WmeEnabled = FALSE;
             break;
-
         case eCSR_MEDIUM_ACCESS_11e_HCF:
             QoSEnabled = TRUE;
             WmeEnabled = FALSE;
             break;
-
         default:
         case eCSR_MEDIUM_ACCESS_DCF:
             QoSEnabled = FALSE;
             WmeEnabled = FALSE;
             break;
-
     }
     //save the WMM setting for later use
     pMac->roam.roamSession[sessionId].fWMMConnection = (tANI_BOOLEAN)WmeEnabled;
-
     status = ccmCfgSetInt(pMac, WNI_CFG_QOS_ENABLED, QoSEnabled, NULL, eANI_BOOLEAN_FALSE);
     status = ccmCfgSetInt(pMac, WNI_CFG_WME_ENABLED, WmeEnabled, NULL, eANI_BOOLEAN_FALSE);
-
     return (status);
 }
-
 static eHalStatus csrGetRateSet( tpAniSirGlobal pMac,  tCsrRoamProfile *pProfile, eCsrPhyMode phyMode, tSirBssDescription *pBssDesc,
                            tDot11fBeaconIEs *pIes, tSirMacRateSet *pOpRateSet, tSirMacRateSet *pExRateSet)
 {
@@ -2771,10 +2704,8 @@
     int i;
     eCsrCfgDot11Mode cfgDot11Mode;
     tANI_U8 *pDstRate;
-
     palZeroMemory(pMac->hHdd, pOpRateSet, sizeof(tSirMacRateSet));
     palZeroMemory(pMac->hHdd, pExRateSet, sizeof(tSirMacRateSet));
-
 #if defined(VOSS_ENABLED)
     VOS_ASSERT( pIes != NULL );
 #endif
@@ -2782,14 +2713,12 @@
     if( NULL != pIes )
     {
         csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
-
         // Originally, we thought that for 11a networks, the 11a rates are always
         // in the Operational Rate set & for 11b and 11g networks, the 11b rates
         // appear in the Operational Rate set.  Consequently, in either case, we
         // would blindly put the rates we support into our Operational Rate set
         // (including the basic rates, which we have already verified are
         // supported earlier in the roaming decision).
-
         // However, it turns out that this is not always the case.  Some AP's
         // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
         // too.  Now, we're a little more careful:
@@ -2805,7 +2734,6 @@
                 }
             }
         }
-
         if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode || 
              eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
              eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
@@ -2851,22 +2779,18 @@
     tANI_U32 PropRatesEnable = 0;
     tANI_U8 MCSRateIdxSet[ SIZE_OF_SUPPORTED_MCS_SET ];
     tANI_U32 MCSRateLength = 0;
-
 #if defined(VOSS_ENABLED)
     VOS_ASSERT( pIes != NULL );
 #endif
-
     if( NULL != pIes )
     {
         csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
-
         // Originally, we thought that for 11a networks, the 11a rates are always
         // in the Operational Rate set & for 11b and 11g networks, the 11b rates
         // appear in the Operational Rate set.  Consequently, in either case, we
         // would blindly put the rates we support into our Operational Rate set
         // (including the basic rates, which we have already verified are
         // supported earlier in the roaming decision).
-
         // However, it turns out that this is not always the case.  Some AP's
         // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
         // too.  Now, we're a little more careful:
@@ -2883,7 +2807,6 @@
                 }
             }
         }
-
         if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode || 
              eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
              eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
@@ -2906,7 +2829,6 @@
                 }
             }
         }
-
         // Enable proprietary MAC features if peer node is Airgo node and STA
         // user wants to use them
         if( pIes->Airgo.present && pMac->roam.configParam.ProprietaryRatesEnabled )
@@ -2917,7 +2839,6 @@
         {
             PropRatesEnable = 0;
         }
-
         // For ANI network companions, we need to populate the proprietary rate
         // set with any proprietary rates we found in the beacon, only if user
         // allows them...
@@ -2935,7 +2856,6 @@
             // No proprietary modes...
             ProprietaryOperationalRatesLength = 0;
         }
-
         /* Get MCS Rate */
         pDstRate = MCSRateIdxSet;
         if ( pIes->HTCaps.present )
@@ -2949,7 +2869,6 @@
               }
            }
         }
-
         // Set the operational rate set CFG variables...
         ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates, 
                         OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
@@ -2968,7 +2887,6 @@
     }
 }
 
-
 static void csrSetCfgRateSetFromProfile( tpAniSirGlobal pMac,
                                          tCsrRoamProfile *pProfile  )
 {
@@ -2982,7 +2900,6 @@
                                                    SIR_MAC_RATE_36,
                                                    SIR_MAC_RATE_48,
                                                        SIR_MAC_RATE_54  } } };
-
     tSirMacRateSetIE DefaultSupportedRates11b = {  SIR_MAC_RATESET_EID, 
                                                    { 4, 
                                                      { SIR_MAC_RATE_1, 
@@ -3005,12 +2922,10 @@
     tANI_U32 ProprietaryOperationalRatesLength = 0;
     tANI_U32 PropRatesEnable = 0;
     tANI_U8 operationChannel = 0; 
-
     if(pProfile->ChannelInfo.ChannelList)
     {
        operationChannel = pProfile->ChannelInfo.ChannelList[0];
     }
-
 #ifdef WLAN_SOFTAP_FEATURE
     cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
 #else
@@ -3032,7 +2947,6 @@
                          
         // Nothing in the Extended rate set.
         ExtendedOperationalRatesLength = 0;
-
         // populate proprietary rates if user allows them
         if ( pMac->roam.configParam.ProprietaryRatesEnabled ) 
         {
@@ -3094,7 +3008,6 @@
             ProprietaryOperationalRatesLength = 0;         
         }    
     }  
-
     // set this to 1 if prop. rates need to be advertised in to the IBSS beacon and user wants to use them
     if ( ProprietaryOperationalRatesLength && pMac->roam.configParam.ProprietaryRatesEnabled ) 
     {
@@ -3114,12 +3027,11 @@
                     ProprietaryOperationalRates, 
                     ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
     ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
-
 }
-
 void csrRoamCcmCfgSetCallback(tHalHandle hHal, tANI_S32 result)
 {
     tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+
     tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
     tANI_U32 sessionId;
     tSmeCmd *pCommand = NULL;
@@ -3138,7 +3050,6 @@
     }
 }
 
-
 //This function is very dump. It is here because PE still need WNI_CFG_PHY_MODE
 tANI_U32 csrRoamGetPhyModeFromDot11Mode(eCsrCfgDot11Mode dot11Mode, eCsrBand band)
 {
@@ -3151,11 +3062,30 @@
         if(eCSR_BAND_24 == band)
             return (WNI_CFG_PHY_MODE_11G);
     }
-
     return (WNI_CFG_PHY_MODE_11A);
 }
-
         
+        
+#ifdef WLAN_FEATURE_11AC
+ePhyChanBondState csrGetHTCBStateFromVHTCBState(ePhyChanBondState aniCBMode)
+{
+    switch ( aniCBMode )
+    {
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
+            return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
+            return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
+        case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
+	    default :
+            return PHY_SINGLE_CHANNEL_CENTERED;
+    }
+}
+#endif
+
 //pIes may be NULL
 eHalStatus csrRoamSetBssConfigCfg(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
                           tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
@@ -3193,7 +3123,6 @@
     csrSetCfgPrivacy(pMac, pProfile, (tANI_BOOLEAN)pBssConfig->BssCap.privacy );
     //short slot time
     ccmCfgSetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, pBssConfig->uShortSlotTime, NULL, eANI_BOOLEAN_FALSE);
-
 #ifdef WLAN_SOFTAP_FEATURE
     //11d
     ccmCfgSetInt(pMac, WNI_CFG_11D_ENABLED,
@@ -3205,6 +3134,7 @@
     */
     ccmCfgSetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, pBssConfig->uPowerLimit, NULL, eANI_BOOLEAN_FALSE);
     //CB
+
     if(CSR_IS_INFRA_AP(pProfile) || CSR_IS_WDS_AP(pProfile))
     {
         channel = pProfile->operationChannel;
@@ -3224,10 +3154,22 @@
         }
         else
         {
-           //cfgCb = pBssConfig->cbMode;
-           cfgCb = pMac->roam.configParam.channelBondingMode5GHz;
+           cfgCb = pBssConfig->cbMode;
         }
     }
+#ifdef WLAN_FEATURE_11AC
+    if(cfgCb > 2 )
+    {
+	if(!WDA_getFwWlanFeatCaps(DOT11AC)) {
+            cfgCb = csrGetHTCBStateFromVHTCBState(cfgCb);
+	}
+	else 
+	{
+            ccmCfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH,  pMac->roam.configParam.nVhtChannelWidth, NULL, eANI_BOOLEAN_FALSE);
+	}
+    }
+    else
+#endif
     ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, cfgCb, NULL, eANI_BOOLEAN_FALSE);
     //Rate
     //Fixed Rate
@@ -3244,19 +3186,15 @@
     csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_CONFIG, sessionId );
 
     ccmCfgSetInt(pMac, WNI_CFG_JOIN_FAILURE_TIMEOUT, pBssConfig->uJoinTimeOut, (tCcmCfgSetCallback)csrRoamCcmCfgSetCallback, eANI_BOOLEAN_FALSE);
-
     return (status);
 }
 
-
-
 eHalStatus csrRoamStopNetwork( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, 
                                tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
 {
     eHalStatus status;
     tBssConfigParam *pBssConfig;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam)); 
     if(HAL_STATUS_SUCCESS(status))
     {
@@ -3265,6 +3203,8 @@
         if(HAL_STATUS_SUCCESS(status))
         {
             pSession->bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
+            /* This will allow to pass cbMode during join req */
+            pSession->bssParams.cbMode= pBssConfig->cbMode;
             //For IBSS, we need to prepare some more information
             if( csrIsBssTypeIBSS(pProfile->BSSType) || CSR_IS_WDS( pProfile )
 #ifdef WLAN_SOFTAP_FEATURE
@@ -3272,7 +3212,7 @@
 #endif
             )
             {
-                csrRoamPrepareBssParams(pMac, sessionId, pProfile, pBssDesc, pIes);
+                csrRoamPrepareBssParams(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
             }
             // If we are in an IBSS, then stop the IBSS...
             ////Not worry about WDS connection for now
@@ -3327,7 +3267,6 @@
     return (status);
 }
 
-
 eCsrJoinState csrRoamJoin( tpAniSirGlobal pMac, tANI_U32 sessionId, 
                            tCsrScanResultInfo *pScanResult, tCsrRoamProfile *pProfile )
 {
@@ -3336,7 +3275,6 @@
     tSirBssDescription *pBssDesc = &pScanResult->BssDescriptor;
     tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)( pScanResult->pvIes ); //This may be NULL
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if( CSR_IS_WDS_STA( pProfile ) )
     {
         status = csrRoamStartWds( pMac, sessionId, pProfile, pBssDesc );
@@ -3377,13 +3315,13 @@
                 else
                 {
                     tBssConfigParam bssConfig;
-
                     //The key changes
                     palZeroMemory(pMac->hHdd, &bssConfig, sizeof(bssConfig));
                     status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, &bssConfig, pIesLocal);
                     if(HAL_STATUS_SUCCESS(status))
                     {
                         pSession->bssParams.uCfgDot11Mode = bssConfig.uCfgDot11Mode;
+                        pSession->bssParams.cbMode = bssConfig.cbMode;
                         //Reapply the config including Keys so reassoc is happening.
                         status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, &bssConfig, pIesLocal);
                         if(!HAL_STATUS_SUCCESS(status))
@@ -3433,23 +3371,19 @@
             palFreeMemory(pMac->hHdd, pIesLocal);
         }
     }
-
     return( eRoamState );
 }
 
-
 eHalStatus csrRoamShouldRoam(tpAniSirGlobal pMac, tANI_U32 sessionId, 
                              tSirBssDescription *pBssDesc, tANI_U32 roamId)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tCsrRoamInfo roamInfo;
-
     palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
     roamInfo.pBssDesc = pBssDesc;
     status = csrRoamCallCallback(pMac, sessionId, &roamInfo, roamId, eCSR_ROAM_SHOULD_ROAM, eCSR_ROAM_RESULT_NONE);
     return (status);
 }
-
 //In case no matching BSS is found, use whatever default we can find
 static void csrRoamAssignDefaultParam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
 {
@@ -3495,7 +3429,7 @@
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
     tANI_U8  concurrentChannel = 0;
-    
+
     do  
     {
         // Check for Cardbus eject condition, before trying to Roam to any BSS
@@ -3535,16 +3469,15 @@
                 while(pCommand->u.roamCmd.pRoamBssEntry)
                 {
                     pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
-
                     /*If concurrency enabled take the concurrent connected channel first. */
                     /* Valid multichannel concurrent sessions exempted */
-                    if (vos_concurrent_sessions_running() && !csrIsValidMcConcurrentSession(pMac, sessionId))
+                    if (vos_concurrent_sessions_running() && 
+                        !csrIsValidMcConcurrentSession(pMac, sessionId, &pScanResult->Result.BssDescriptor))
                     {
                         concurrentChannel = 
                             csrGetConcurrentOperationChannel(pMac);
                         VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_HIGH, "%s: "
                                 " csr Concurrent Channel = %d", __FUNCTION__, concurrentChannel);
-
                         if ((concurrentChannel) && 
                                 (concurrentChannel == 
                                  pScanResult->Result.BssDescriptor.channelId))
@@ -3556,14 +3489,8 @@
                                     FL("Concurrent channel match =%d"),
                                     concurrentChannel);
                             concurrentChannel = 0; 
-
                         }
                     }
-                    if ((vos_concurrent_sessions_running()) && 
-                         csrIsAnySessionInConnectState( pMac ))
-                    {
-                        pMac->roam.configParam.concurrencyEnabled = 1;
-                    }
 
                     if (!concurrentChannel)
                     {
@@ -3576,6 +3503,10 @@
                             break;
                         }
                      }
+                     else
+                     {
+                         eRoamState = eCsrStopRoamingDueToConcurrency;
+                     }
                     pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
                     if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
                     {
@@ -3607,7 +3538,6 @@
             if(pScanResult)
             {
                 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
-
                 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, &pScanResult->Result.BssDescriptor, &pIesLocal))) )
                 {
                     smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
@@ -3623,12 +3553,10 @@
                     CSR_IS_UAPSD_BSS(pIesLocal) )
                 {
 #ifndef WLAN_MDM_CODE_REDUCTION_OPT
-
                     acm_mask = sme_QosGetACMMask(pMac, &pScanResult->Result.BssDescriptor, 
                          pIesLocal);
                     pCommand->u.roamCmd.roamProfile.uapsd_mask &= ~(acm_mask);
 #endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
-
                 }
                 else
                 {
@@ -3648,14 +3576,12 @@
             csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, 
                                  eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
         }
-
         if ( NULL == pCommand->u.roamCmd.pRoamBssEntry ) 
         {
             // If this is a start IBSS profile, then we need to start the IBSS.
             if ( CSR_IS_START_IBSS(pProfile) ) 
             {
                 tANI_BOOLEAN fSameIbss = eANI_BOOLEAN_FALSE;
-
                 // Attempt to start this IBSS...
                 csrRoamAssignDefaultParam( pMac, pCommand );
                 status = csrRoamStartIbss( pMac, sessionId, pProfile, &fSameIbss );
@@ -3733,7 +3659,6 @@
         }
         
     } while( 0 );
-
     if( (eCsrStopRoaming == eRoamState) && (CSR_IS_INFRASTRUCTURE( pProfile )) )
     {
         //Need to indicate association_completion if association_start has been done
@@ -3750,24 +3675,21 @@
     return( eRoamState );
 }
 
-
 static eHalStatus csrRoam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     eCsrJoinState RoamState;
     tANI_U32 sessionId = pCommand->sessionId;
     
-    smsLog(pMac, LOG2, FL("is called\n"));
     //***if( hddIsRadioStateOn( pAdapter ) )
     {
         // Attept to join a Bss...
         RoamState = csrRoamJoinNextBss( pMac, pCommand, eANI_BOOLEAN_FALSE );
-    
+
         // if nothing to join..
-        if ( eCsrStopRoaming == RoamState ) 
+        if (( eCsrStopRoaming == RoamState ) || ( eCsrStopRoamingDueToConcurrency == RoamState))
         {
             tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
-
             // and if connected in Infrastructure mode...
             if ( csrIsConnStateInfra(pMac, sessionId) ) 
             {
@@ -3809,7 +3731,14 @@
             if(fComplete)
             {
                // ... otherwise, we can complete the Roam command here.
-               csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
+               if(eCsrStopRoamingDueToConcurrency == RoamState)
+               {
+                   csrRoamComplete( pMac, eCsrJoinFailureDueToConcurrency, NULL );
+               }
+               else
+               {
+                   csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
+               }
             }    
        }
        else if ( eCsrReassocToSelfNoCapChange == RoamState )
@@ -3824,7 +3753,6 @@
     
     return status;
 }
-
 eHalStatus csrProcessFTReassocRoamCommand ( tpAniSirGlobal pMac, tSmeCmd *pCommand )
 {
     tANI_U32 sessionId;
@@ -3832,10 +3760,8 @@
     tCsrScanResult *pScanResult = NULL;
     tSirBssDescription *pBssDesc = NULL;
     eHalStatus status = eHAL_STATUS_SUCCESS;
-
     sessionId = pCommand->sessionId;
     pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
     {
         //the roaming is cancelled. Simply complete the command
@@ -3843,7 +3769,6 @@
         csrRoamComplete(pMac, eCsrNothingToJoin, NULL); 
         return eHAL_STATUS_FAILURE;
     }
-
     if (pCommand->u.roamCmd.pRoamBssEntry)
     {
         pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
@@ -3856,13 +3781,11 @@
         csrRoamComplete(pMac, eCsrNothingToJoin, NULL); 
         return eHAL_STATUS_FAILURE;
     }
-
     status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc, 
         (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
     return status;
 }
 
-
 eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -3876,7 +3799,6 @@
         csrFreeRoamProfile(pMac, sessionId);
         status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
         break;
-
      case eCsrSmeIssuedDisassocForHandoff:
         //Not to free pMac->roam.pCurRoamProfile (via csrFreeRoamProfile) because it is needed after disconnect
 #if 0 // TODO : Confirm this change
@@ -3886,23 +3808,19 @@
 #endif
 
         break;
-
     case eCsrForcedDisassocMICFailure:
         csrFreeRoamProfile(pMac, sessionId);
         status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, TRUE );
         break;
-
     case eCsrForcedDeauth:
         csrFreeRoamProfile(pMac, sessionId);
         status = csrRoamProcessDisassocDeauth( pMac, pCommand, FALSE, FALSE );
         break;
-
     case eCsrHddIssuedReassocToSameAP:
     case eCsrSmeIssuedReassocToSameAP:
     {
         tDot11fBeaconIEs *pIes = NULL;
 
-
         if( pSession->pConnectBssDesc )
         {
             status = csrGetParsedBssDescriptionIEs(pMac, pSession->pConnectBssDesc, &pIes);
@@ -3915,7 +3833,6 @@
                 roamInfo.reasonCode = eCsrRoamReasonStaCapabilityChanged;
                 csrRoamCallCallback(pMac, pSession->sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
                 pSession->roamingReason = eCsrReassocRoaming;
-
                 roamInfo.pBssDesc = pSession->pConnectBssDesc;
                 roamInfo.pProfile = &pCommand->u.roamCmd.roamProfile;
                 pSession->bRefAssocStartCnt++;
@@ -3931,17 +3848,16 @@
         }
         break;
     }
-
     case eCsrCapsChange:
         smsLog(pMac, LOGE, FL("received eCsrCapsChange \n"));
         csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
         status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE); 
         break;
-
     case eCsrSmeIssuedFTReassoc:
         smsLog(pMac, LOGE, FL("received FT Reassoc Req \n"));
         status = csrProcessFTReassocRoamCommand(pMac, pCommand);
         break;
+
     case eCsrStopBss:
        csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
        status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
@@ -3982,11 +3898,9 @@
         status = csrRoam( pMac, pCommand );
         break;
     }
-
     return (status);
 }
 
-
 void csrReinitRoamCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand) 
 {
     if(pCommand->u.roamCmd.fReleaseBssList)
@@ -4005,25 +3919,20 @@
     palZeroMemory(pMac->hHdd, &pCommand->u.roamCmd, sizeof(tRoamCmd));
 }
 
-
 void csrReinitWmStatusChangeCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
 {
     palZeroMemory(pMac->hHdd, &pCommand->u.wmStatusChangeCmd, sizeof(tWmStatusChangeCmd));
 }
-
 void csrRoamComplete( tpAniSirGlobal pMac, eCsrRoamCompleteResult Result, void *Context )
 {
     tListElem *pEntry;
     tSmeCmd *pCommand;
     tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
-
     smsLog( pMac, LOG2, "roamQ: Roam Completion ...\n" );
-
     pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
     if ( pEntry )
     {
         pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
-
         // If the head of the queue is Active and it is a ROAM command, remove
         // and put this on the Free queue.
         if ( eSmeCommandRoam == pCommand->command )
@@ -4058,22 +3967,18 @@
     {
         smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
     }
-
     if( fReleaseCommand )
     {
         smeProcessPendingQueue( pMac );
     }
 }
 
-
 void csrResetPMKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
 {
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     palZeroMemory( pMac->hHdd, &(pSession->PmkidCandidateInfo[0]), sizeof(tPmkidCandidateInfo) * CSR_MAX_PMKID_ALLOWED );
     pSession->NumPmkidCandidate = 0;
 }
-
 #ifdef FEATURE_WLAN_WAPI
 void csrResetBKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
 {
@@ -4082,11 +3987,8 @@
     pSession->NumBkidCandidate = 0;
 }
 #endif /* FEATURE_WLAN_WAPI */
-
 extern tANI_U8 csrWpaOui[][ CSR_WPA_OUI_SIZE ];
 
-
-
 static eHalStatus csrRoamSaveSecurityRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrAuthType authType, 
                                          tSirBssDescription *pSirBssDesc,
                                          tDot11fBeaconIEs *pIes)
@@ -4094,7 +3996,6 @@
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     tDot11fBeaconIEs *pIesLocal = pIes;
-
     if((eCSR_AUTH_TYPE_WPA == authType) ||
         (eCSR_AUTH_TYPE_WPA_PSK == authType) ||
         (eCSR_AUTH_TYPE_RSN == authType) ||
@@ -4111,7 +4012,6 @@
 #endif /* FEATURE_WLAN_WAPI */
         )
     {
-
         if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
         {
             smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
@@ -4120,7 +4020,6 @@
         {
             tANI_U32 nIeLen;
             tANI_U8 *pIeBuf;
-
             if((eCSR_AUTH_TYPE_RSN == authType) ||
 #if defined WLAN_FEATURE_VOWIFI_11R
                 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
@@ -4241,7 +4140,6 @@
     }
                       palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.unicast_cipher_suite_count, 2);
                       pIeBuf += 2;
-
                       if( pIesLocal->WAPI.unicast_cipher_suite_count )
                       {
                          //copy pwise_cipher_suites
@@ -4260,7 +4158,6 @@
                       }
                       pSession->nWapiRspIeLength = nIeLen + 2; 
                    }
-
                 }
           }
 #endif /* FEATURE_WLAN_WAPI */
@@ -4271,18 +4168,14 @@
         }
     }
     }
-
     return (status);
 }
 
-
-
 static void csrCheckAndUpdateACWeight( tpAniSirGlobal pMac, tDot11fBeaconIEs *pIEs )
 {
     v_U8_t bACWeights[WLANTL_MAX_AC];
     v_U8_t paramBk, paramBe, paramVi, paramVo;
     v_BOOL_t fWeightChange = VOS_FALSE;
-
     //Compare two ACs' EDCA parameters, from low to high (BK, BE, VI, VO)
     //The "formula" is, if lower AC's AIFSN+CWMin is bigger than a fixed amount
     //of the higher AC one, make the higher AC has the same weight as the lower AC.
@@ -4336,7 +4229,6 @@
         }
     }
 }
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
 //Returns whether the current association is a 11r assoc or not
 tANI_BOOLEAN csrRoamIs11rAssoc(tpAniSirGlobal pMac)
@@ -4348,7 +4240,6 @@
 #endif
 }
 #endif
-
 #ifdef FEATURE_WLAN_CCX
 //Returns whether the current association is a CCX assoc or not
 tANI_BOOLEAN csrRoamIsCCXAssoc(tpAniSirGlobal pMac)
@@ -4360,7 +4251,6 @@
 #endif
 }
 #endif
-
 #ifdef FEATURE_WLAN_LFR
 //Returns whether "Legacy Fast Roaming" is currently enabled...or not
 tANI_BOOLEAN csrRoamIsFastRoamEnabled(tpAniSirGlobal pMac)
@@ -4393,9 +4283,7 @@
     tSirSmeStartBssRsp  *pSmeStartBssRsp = NULL;
 #endif
 
-
     smsLog( pMac, LOG1, FL("Processing ROAM results...\n"));
-
     switch( Result )
     {
         case eCsrJoinSuccess:
@@ -4423,7 +4311,6 @@
                 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
                 pSession->pWpaRsnRspIE = NULL;
             }
-
 #ifdef FEATURE_WLAN_WAPI
             if(pSession->pWapiRspIE)
             {
@@ -4449,7 +4336,6 @@
             {
                 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;
             }
-
             //Use the last connected bssdesc for reassoc-ing to the same AP.
             //NOTE: What to do when reassoc to a different AP???
             if( (eCsrHddIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) ||
@@ -4478,9 +4364,7 @@
             }
             if( pSirBssDesc )
             {
-
                 roamInfo.staId = HAL_STA_INVALID_IDX;
-
                 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
                     //Save WPA/RSN IE
                 csrRoamSaveSecurityRspIE(pMac, sessionId, pProfile->negotiatedAuthType, pSirBssDesc, pIes);
@@ -4493,7 +4377,6 @@
                 // Moving even save profile above so that below mentioned conditon is also met.
                 // JEZ100225: Moved to after saving the profile. Fix needed in main/latest
                 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
-
                 // Make sure the Set Context is issued before link indication to NDIS.  After link indication is 
                 // made to NDIS, frames could start flowing.  If we have not set context with LIM, the frames
                 // will be dropped for the security context may not be set properly. 
@@ -4525,11 +4408,9 @@
                 {
                     //Need to wait for supplicant authtication
                     roamInfo.fAuthRequired = eANI_BOOLEAN_TRUE;
-
                     //Set the subestate to WaitForKey in case authentiation is needed
                     csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_WAIT_FOR_KEY, sessionId );
 
-
                     if(pProfile->bWPSAssociation)
                     {
                         key_timeout_interval = CSR_WAIT_FOR_WPS_KEY_TIMEOUT_PERIOD;
@@ -4552,12 +4433,10 @@
                 
                 assocInfo.pBssDesc = pSirBssDesc; //could be NULL
                 assocInfo.pProfile = pProfile;
-
                 if(Context)
                 {
                     tSirSmeJoinRsp *pJoinRsp = (tSirSmeJoinRsp *)Context;
                     tANI_U32 len;
-
                     csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
                     len = pJoinRsp->assocReqLength + pJoinRsp->assocRspLength + pJoinRsp->beaconLength;
 #ifdef WLAN_FEATURE_VOWIFI_11R
@@ -4622,8 +4501,6 @@
                 // copying the frames 
                 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, ind_qos, &assocInfo);
 #endif
-
-
                 roamInfo.pBssDesc = pSirBssDesc;
                 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
                 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
@@ -4631,7 +4508,6 @@
                 acm_mask = sme_QosGetACMMask(pMac, pSirBssDesc, NULL);
 #endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
                 pSession->connectedProfile.acm_mask = acm_mask;
-
 #ifdef FEATURE_WLAN_UAPSD_FW_TRG_FRAMES
                 //start UAPSD if uapsd_mask is not 0 because HDD will configure for trigger frame
                 //It may be better to let QoS do this????
@@ -4642,16 +4518,20 @@
                     pmcStartUapsd( pMac, NULL, NULL );
                 }
 #endif
-
                 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
                 if( pSession->bRefAssocStartCnt > 0 )
                 {
                     pSession->bRefAssocStartCnt--;
+#ifndef BMPS_WORKAROUND_NOT_NEEDED
+                    if(  csrIsConcurrentSessionRunning( pMac ) )
+                    {
+                       pMac->roam.configParam.doBMPSWorkaround = 1;
+                    }
+#endif
                     csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
                 }
                 
                 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_NONE, eANI_BOOLEAN_TRUE);
-
                 // reset the PMKID candidate list
                 csrResetPMKIDCandidateList( pMac, sessionId );
                 //Update TL's AC weight base on the current EDCA parameters
@@ -4672,7 +4552,6 @@
             {
                 smsLog(pMac, LOGW, "  Roam command doesn't have a BSS desc\n");
             }
-
             csrScanCancelIdleScan(pMac);
             //Not to signal link up because keys are yet to be set.
             //The linkup function will overwrite the sub-state that we need to keep at this point.
@@ -4680,7 +4559,6 @@
             {
                 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
             }
-
             //Check if BMPS is required and start the BMPS retry timer.  Timer period is large
             //enough to let security and DHCP handshake succeed before entry into BMPS
             if (pmcShouldBmpsTimerRun(pMac))
@@ -4692,10 +4570,8 @@
                 }
                 smsLog(pMac, LOG2, FL("BMPS Retry Timer already running or started"));
             }
-
             break;
 
-
         case eCsrStartBssSuccess:
             // on the StartBss Response, LIM is returning the Bss Description that we
             // are beaconing.  Add this Bss Description to our scan results and
@@ -4756,7 +4632,6 @@
                 }
                 //We are doen with the IEs so free it
                 palFreeMemory(pMac->hHdd, pIes);
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
                 {
                     vos_log_ibss_pkt_type *pIbssLog;
@@ -4790,7 +4665,6 @@
 #endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
                 //Only set context for non-WDS_STA. We don't even need it for WDS_AP. But since the encryption
                 //is WPA2-PSK so it won't matter.
-
 #ifdef WLAN_SOFTAP_FEATURE
                 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) && !CSR_IS_INFRA_AP( pSession->pCurRoamProfile ))
                 {
@@ -4860,6 +4734,12 @@
 #ifdef WLAN_SOFTAP_FEATURE
                 roamInfo.staId = (tANI_U8)pSmeStartBssRsp->staId;
 #endif
+#ifndef BMPS_WORKAROUND_NOT_NEEDED
+                if(  csrIsConcurrentSessionRunning( pMac ) )
+                {
+                   pMac->roam.configParam.doBMPSWorkaround = 1;
+                }
+#endif
                 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
             }
     
@@ -4883,14 +4763,11 @@
                 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, 
                                         eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_STOPPED );
             }
-
             break;
-
         case eCsrStartBssFailure:
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
             {
                 vos_log_ibss_pkt_type *pIbssLog;
-
                 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
                 if(pIbssLog)
                 {
@@ -4899,7 +4776,6 @@
                 }
             }
 #endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
-
             roamStatus = eCSR_ROAM_IBSS_IND;
             roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
             if( CSR_IS_WDS( pProfile ) )
@@ -4928,7 +4804,6 @@
             csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
             csrSetDefaultDot11Mode( pMac );
             break;
-
         case eCsrSilentlyStopRoaming:
             // We are here because we try to start the same IBSS
             //No message to PE
@@ -4946,9 +4821,7 @@
             //HDD may be mistakenly mark to disconnected state.
             csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, 
                                         eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_NONE );
-
             break;
-
         case eCsrSilentlyStopRoamingSaveState:
             //We are here because we try to connect to the same AP
             //No message to PE
@@ -4963,7 +4836,6 @@
             {
                 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
             }
-
             roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
             roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
             roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
@@ -4980,7 +4852,6 @@
                                         eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
             csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_ASSOCIATED, eANI_BOOLEAN_TRUE);
             break;
-
         case eCsrReassocFailure:
 #ifndef WLAN_MDM_CODE_REDUCTION_OPT
             sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_REASSOC_FAILURE, NULL);
@@ -4999,9 +4870,9 @@
                                     eCSR_ROAM_RESULT_WDS_NOT_ASSOCIATED);
             //Need to issue stop_bss
             break;
-
         case eCsrJoinFailure:
         case eCsrNothingToJoin:
+        case eCsrJoinFailureDueToConcurrency:
         default:
         {
             smsLog(pMac, LOGW, FL("receives no association indication\n"));
@@ -5020,6 +4891,7 @@
                 // If this transition is because of an 802.11 OID, then we transition
                 // back to INIT state so we sit waiting for more OIDs to be issued and
                 // we don't start the IDLE timer.
+                case eCsrSmeIssuedFTReassoc:
                 case eCsrSmeIssuedAssocToSimilarAP:
                 case eCsrHddIssued:
                     csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
@@ -5027,27 +4899,31 @@
                     roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
                     roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
                     roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
-
                     /* Defeaturize this later if needed */
 #ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
                     /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
                     if (csrRoamIsHandoffInProgress(pMac))
                     {
-                        csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
                         /* Should indicate neighbor roam algorithm about the connect failure here */
                         csrNeighborRoamIndicateConnect(pMac, (tANI_U8)sessionId, VOS_STATUS_E_FAILURE);
                     }
-                    else
 #endif
-                    {
                         if(pSession->bRefAssocStartCnt > 0)
                         {
                             pSession->bRefAssocStartCnt--;
-                            csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, 
+                            if(eCsrJoinFailureDueToConcurrency == Result)
+                            {
+                                csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, 
+                                                eCSR_ROAM_ASSOCIATION_COMPLETION, 
+                                                eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL);
+                            }
+                            else
+                            {
+                                csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, 
                                                 eCSR_ROAM_ASSOCIATION_COMPLETION, 
                                                 eCSR_ROAM_RESULT_FAILURE);
+                            }
                         }
-                    }
                     smsLog(pMac, LOG1, FL("  roam(reason %d) failed\n"), pCommand->u.roamCmd.roamReason);
 #ifndef WLAN_MDM_CODE_REDUCTION_OPT
                     sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
@@ -5063,7 +4939,6 @@
                     }
 #endif
                     break;
-
                 case eCsrHddIssuedReassocToSameAP:
                 case eCsrSmeIssuedReassocToSameAP:
                     csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
@@ -5158,23 +5033,18 @@
                     csrScanHandleFailedLostlink3(pMac, sessionId);
                     break;
             }
-
             break;
         }
     }
-
     return ( fReleaseCommand );
 }
 
-
 eHalStatus csrRoamRegisterCallback(tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
-
     return (status);
 }
 
-
 eHalStatus csrRoamCopyProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pDstProfile, tCsrRoamProfile *pSrcProfile)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -5237,7 +5107,6 @@
             palCopyMemory(pMac->hHdd, pDstProfile->pWAPIReqIE, pSrcProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
         }
 #endif /* FEATURE_WLAN_WAPI */
-
         if(pSrcProfile->nAddIEScanLength)
         {
             status = palAllocateMemory(pMac->hHdd,
@@ -5250,7 +5119,6 @@
             palCopyMemory(pMac->hHdd, pDstProfile->pAddIEScan, pSrcProfile->pAddIEScan,
                 pSrcProfile->nAddIEScanLength);
         }
-
         if(pSrcProfile->nAddIEAssocLength)
         {
             status = palAllocateMemory(pMac->hHdd,
@@ -5263,7 +5131,6 @@
             palCopyMemory(pMac->hHdd, pDstProfile->pAddIEAssoc, pSrcProfile->pAddIEAssoc,
                 pSrcProfile->nAddIEAssocLength);
         }
-
         if(pSrcProfile->ChannelInfo.ChannelList)
         {
             status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
@@ -5274,7 +5141,6 @@
             pDstProfile->ChannelInfo.numOfChannels = pSrcProfile->ChannelInfo.numOfChannels;
             palCopyMemory(pMac->hHdd, pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
         }
-
         pDstProfile->AuthType = pSrcProfile->AuthType;
         pDstProfile->EncryptionType = pSrcProfile->EncryptionType;
         pDstProfile->mcEncryptionType = pSrcProfile->mcEncryptionType;
@@ -5298,7 +5164,6 @@
         /*Save the WPS info*/
         pDstProfile->bWPSAssociation = pSrcProfile->bWPSAssociation;
         pDstProfile->uapsd_mask = pSrcProfile->uapsd_mask;
-
         pDstProfile->beaconInterval = pSrcProfile->beaconInterval;
 #ifdef WLAN_SOFTAP_FEATURE
         pDstProfile->privacy           = pSrcProfile->privacy;
@@ -5313,9 +5178,7 @@
         pDstProfile->wps_state         = pSrcProfile->wps_state;
         pDstProfile->ieee80211d        = pSrcProfile->ieee80211d;
 #endif
-
         palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
         if (pSrcProfile->MDID.mdiePresent)
         {
@@ -5323,7 +5186,6 @@
             pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
         }
 #endif
-
     }while(0);
     
     if(!HAL_STATUS_SUCCESS(status))
@@ -5334,7 +5196,6 @@
     
     return (status);
 }
-
 eHalStatus csrRoamCopyConnectedProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pDstProfile )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -5364,7 +5225,6 @@
             pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->ssidHidden;
             palCopyMemory(pMac->hHdd, &pDstProfile->SSIDs.SSIDList[0].SSID, &pSrcProfile->SSID, sizeof(tSirMacSSid));
         }
-
         status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, 1);
         if(!HAL_STATUS_SUCCESS(status))
         {
@@ -5372,7 +5232,6 @@
         }
         pDstProfile->ChannelInfo.numOfChannels = 1;
         pDstProfile->ChannelInfo.ChannelList[0] = pSrcProfile->operationChannel;
-
         pDstProfile->AuthType.numEntries = 1;
         pDstProfile->AuthType.authType[0] = pSrcProfile->AuthType;
         pDstProfile->negotiatedAuthType = pSrcProfile->AuthType;
@@ -5404,7 +5263,6 @@
     return (status);
 }
 
-
 eHalStatus csrRoamIssueConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, 
                                 tScanResultHandle hBSSList, 
                                 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate,
@@ -5455,11 +5313,9 @@
         //We need to free the BssList when the command is done
         pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_TRUE;
         pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
-
         VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
                   FL("CSR PERSONA=%d"),
                   pCommand->u.roamCmd.roamProfile.csrPersona);
-
         status = csrQueueSmeCommand(pMac, pCommand, fImediate);
         if( !HAL_STATUS_SUCCESS( status ) )
         {
@@ -5470,7 +5326,6 @@
     
     return (status);
 }
-
 eHalStatus csrRoamIssueReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
                                tCsrRoamModifyProfileFields *pMmodProfileFields,
                                eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
@@ -5490,22 +5345,18 @@
         csrScanAbortMacScanNotForConnect(pMac);
         if(pProfile)
         {
-
            //This is likely trying to reassoc to different profile
            pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
            //make a copy of the profile
            status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
            pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
-
         }
         else
         {
             status = csrRoamCopyConnectedProfile(pMac, sessionId, &pCommand->u.roamCmd.roamProfile);
             //how to update WPA/WPA2 info in roamProfile??
             pCommand->u.roamCmd.roamProfile.uapsd_mask = pMmodProfileFields->uapsd_mask;
-
         }
-
         if(HAL_STATUS_SUCCESS(status))
         {
            pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
@@ -5519,7 +5370,6 @@
         pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE; 
         pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
         pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
-
         status = csrQueueSmeCommand(pMac, pCommand, fImediate);
         if( !HAL_STATUS_SUCCESS( status ) )
     {
@@ -5528,18 +5378,15 @@
             csrReleaseCommandRoam( pMac, pCommand );
     }
     }
-
     return (status);
 }
 
-
 eHalStatus csrRoamConnectWithBSSList(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, 
                                      tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
     tScanResultHandle hBSSList;
     tANI_U32 roamId = 0;
-
     status = csrScanCopyResultList(pMac, hBssListIn, &hBSSList);
     if(HAL_STATUS_SUCCESS(status))
     {
@@ -5556,11 +5403,9 @@
             csrScanResultPurge(pMac, hBSSList);
         }
     }
-
     return (status);
 }
 
-
 eHalStatus csrRoamConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, 
                           tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
 {
@@ -5570,16 +5415,13 @@
     tANI_U32 roamId = 0;
     tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_FALSE;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if (NULL == pProfile)
     {
         smsLog(pMac, LOGP, FL("No profile specified"));
         return eHAL_STATUS_FAILURE;
     }
-
     smsLog(pMac, LOG1, FL("called  BSSType = %d authtype = %d  encryType = %d\n"),
                 pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
-
     if( CSR_IS_WDS( pProfile ) && 
         !HAL_STATUS_SUCCESS( status = csrIsBTAMPAllowed( pMac, pProfile->operationChannel ) ) )
     {
@@ -5590,14 +5432,12 @@
     csrScanCancelIdleScan(pMac);
     //Only abort the scan if it is not used for other roam/connect purpose
     csrScanAbortMacScan(pMac);
-
 #ifdef WLAN_SOFTAP_FEATURE
     if (!vos_concurrent_sessions_running() && (VOS_STA_SAP_MODE == pProfile->csrPersona))//In case of AP mode we do not want idle mode scan
     {
         csrScanDisable(pMac);
     }
 #endif
-
     csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
     //Check whether ssid changes
     if(csrIsConnStateConnected(pMac, sessionId))
@@ -5658,7 +5498,6 @@
                 {
                     pScanFilter->bWPSAssociation = 0;
                 }
-
                 do
                 {
                     if( (pProfile && CSR_IS_WDS_AP( pProfile ) )
@@ -5674,14 +5513,12 @@
                         {
                             fCallCallback = eANI_BOOLEAN_TRUE;
                         }
-
                         break;
                     }
                     status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
                     smsLog(pMac, LOGE, "************ csrScanGetResult Status ********* %d\n", status);
                     if(HAL_STATUS_SUCCESS(status))
                     {
-
                         status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued, 
                                                     roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
                         if(!HAL_STATUS_SUCCESS(status))
@@ -5736,7 +5573,6 @@
    
     return (status);
 }                         
-
 eHalStatus csrRoamReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
                           tCsrRoamModifyProfileFields modProfileFields,
                           tANI_U32 *pRoamId)
@@ -5745,20 +5581,17 @@
    tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_TRUE;
    tANI_U32 roamId = 0;
    tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
    if (NULL == pProfile)
    {
       smsLog(pMac, LOGP, FL("No profile specified"));
       return eHAL_STATUS_FAILURE;
    }
-
    smsLog(pMac, LOG1, FL("called  BSSType = %d authtype = %d  encryType = %d\n"), pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
    csrRoamCancelRoaming(pMac, sessionId);
    csrScanRemoveFreshScanCommand(pMac, sessionId);
    csrScanCancelIdleScan(pMac);
    csrScanAbortMacScanNotForConnect(pMac);
    csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssuedReassocToSameAP);
-
    if(csrIsConnStateConnected(pMac, sessionId))
    {
       if(pProfile)
@@ -5789,7 +5622,6 @@
    {
       smsLog(pMac, LOG1, FL("Not connected! No need to reassoc\n"));
    }
-
    if(!fCallCallback)
    {
       roamId = GET_NEXT_ROAM_ID(&pMac->roam);
@@ -5798,20 +5630,16 @@
          *pRoamId = roamId;
       }
 
-
       status = csrRoamIssueReassoc(pMac, sessionId, pProfile, &modProfileFields, 
                                    eCsrHddIssuedReassocToSameAP, roamId, eANI_BOOLEAN_FALSE);
-
    }
    else
    {
       status = csrRoamCallCallback(pMac, sessionId, NULL, roamId, 
                                    eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
    }
-
    return status;
 }
-
 eHalStatus csrRoamJoinLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
@@ -5820,7 +5648,6 @@
     tANI_U32 roamId;
     tCsrRoamProfile *pProfile = NULL;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     do
     {
         if(pSession->pCurRoamProfile)
@@ -5887,14 +5714,11 @@
         csrReleaseProfile(pMac, pProfile);
         palFreeMemory(pMac->hHdd, pProfile);
     }
-
     return (status);
 }
-
 eHalStatus csrRoamReconnect(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
-
     if(csrIsConnStateConnected(pMac, sessionId))
     {
         status = csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
@@ -5903,15 +5727,12 @@
             status = csrRoamJoinLastProfile(pMac, sessionId);
         }
     }
-
     return (status);
 }
 
-
 eHalStatus csrRoamConnectToLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
-
     smsLog(pMac, LOGW, FL("is called\n"));
     csrRoamCancelRoaming(pMac, sessionId);
     csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
@@ -5919,11 +5740,9 @@
     {
         status = csrRoamJoinLastProfile(pMac, sessionId);
     }
-
     return (status);
 }
 
-
 eHalStatus csrRoamProcessDisassocDeauth( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fDisassoc, tANI_BOOLEAN fMICFailure )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -6003,28 +5822,23 @@
     return (status);
 }
 
-
 /* This is been removed from latest code base */
 /*
 static eHalStatus csrRoamProcessStopBss( tpAniSirGlobal pMac, tSmeCmd *pCommand )
 {
     eHalStatus status;
     tANI_U32 sessionId = pCommand->sessionId;
-
     csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING );
     status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
-
     return ( status );
 }
 */
 
-
 eHalStatus csrRoamIssueDisassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tSmeCmd *pCommand;
         tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_FALSE;
-
     do
     {
         smsLog( pMac, LOGE, FL("  reason = %d\n"), reason );
@@ -6048,29 +5862,23 @@
         case eCSR_DISCONNECT_REASON_MIC_ERROR:
             pCommand->u.roamCmd.roamReason = eCsrForcedDisassocMICFailure;
             break;
-
         case eCSR_DISCONNECT_REASON_DEAUTH:
             pCommand->u.roamCmd.roamReason = eCsrForcedDeauth;
             break;
-
         case eCSR_DISCONNECT_REASON_HANDOFF:
             fHighPriority = eANI_BOOLEAN_TRUE;
             pCommand->u.roamCmd.roamReason = eCsrSmeIssuedDisassocForHandoff;
             break;
-
         case eCSR_DISCONNECT_REASON_UNSPECIFIED:
         case eCSR_DISCONNECT_REASON_DISASSOC:
             pCommand->u.roamCmd.roamReason = eCsrForcedDisassoc;
             break;
-
         case eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE:
             pCommand->u.roamCmd.roamReason = eCsrSmeIssuedIbssJoinFailure;
             break;
-
         case eCSR_DISCONNECT_REASON_IBSS_LEAVE:
             pCommand->u.roamCmd.roamReason = eCsrForcedIbssLeave;
             break;
-
         default:
             break;
         }
@@ -6081,16 +5889,13 @@
             csrReleaseCommandRoam( pMac, pCommand );
         }
     } while( 0 );
-
     return( status );
 }
 
-
 eHalStatus csrRoamIssueStopBssCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN fHighPriority )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tSmeCmd *pCommand;
-
     pCommand = csrGetCommandBuffer( pMac );
     if ( NULL != pCommand ) 
     {
@@ -6115,11 +5920,9 @@
         smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
         status = eHAL_STATUS_RESOURCES;
     }
-
     return ( status );
 }
 
-
 eHalStatus csrRoamDisconnectInternal(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -6139,15 +5942,12 @@
         smsLog(pMac, LOG2, FL("called\n"));
         status = csrRoamIssueDisassociateCmd(pMac, sessionId, reason);
     }
-
     return (status);
 }
 
-
 eHalStatus csrRoamDisconnect(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
 {
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     csrRoamCancelRoaming(pMac, sessionId);
     pSession->ibss_join_pending = FALSE;
     csrRoamStopIbssJoinTimer(pMac, sessionId);
@@ -6156,7 +5956,6 @@
     return (csrRoamDisconnectInternal(pMac, sessionId, reason));
 }
 
-
 eHalStatus csrRoamSaveConnectedInfomation(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, 
                                           tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes)
 {
@@ -6177,6 +5976,8 @@
     pConnectProfile->BSSType = pProfile->BSSType;
     pConnectProfile->modifyProfileFields.uapsd_mask = pProfile->uapsd_mask;
     pConnectProfile->operationChannel = pSirBssDesc->channelId;
+    pConnectProfile->beaconInterval = pSirBssDesc->beaconInterval;
+
     palCopyMemory(pMac->hHdd, &pConnectProfile->Keys, &pProfile->Keys, sizeof(tCsrKeys));
     //Save bssid
     csrGetBssIdBssDesc(pMac, pSirBssDesc, &pConnectProfile->bssid);
@@ -6217,7 +6018,6 @@
         
         //Save the bss desc
         status = csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
-
            if( CSR_IS_QOS_BSS(pIesTemp) )
            {
               pConnectProfile->qap = TRUE;
@@ -6226,7 +6026,6 @@
            {
               pConnectProfile->qap = FALSE;
            }
-
         if ( NULL == pIes )
         {
             //Free memory if it allocated locally
@@ -6255,20 +6054,16 @@
     return (status);
 }
 
-
-
 static void csrRoamJoinRspProcessor( tpAniSirGlobal pMac, tSirSmeJoinRsp *pSmeJoinRsp )
 {
    tListElem *pEntry = NULL;
    tSmeCmd *pCommand = NULL;
-
    //The head of the active list is the request we sent
    pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
    if(pEntry)
    {
        pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
    }
-
    if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode ) 
    {
             if(pCommand && eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason)
@@ -6290,7 +6085,6 @@
         {
             roamId = pCommand->u.roamCmd.roamId;
         }
-
         pSession->joinFailStatusCode.statusCode = pSmeJoinRsp->statusCode;
         pSession->joinFailStatusCode.reasonCode = pSmeJoinRsp->protStatusCode;
         smsLog( pMac, LOGW, "SmeJoinReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
@@ -6327,32 +6121,26 @@
     } /*else: ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode ) */
 }
 
-
 eHalStatus csrRoamIssueJoin( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc, 
                              tDot11fBeaconIEs *pIes,
                              tCsrRoamProfile *pProfile, tANI_U32 roamId )
 {
     eHalStatus status;
-
     smsLog( pMac, LOG1, "Attempting to Join Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n", 
                   pSirBssDesc->bssId[ 0 ],pSirBssDesc->bssId[ 1 ],pSirBssDesc->bssId[ 2 ],
                   pSirBssDesc->bssId[ 3 ],pSirBssDesc->bssId[ 4 ],pSirBssDesc->bssId[ 5 ] );
     
     // Set the roaming substate to 'join attempt'...
     csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
-
     // attempt to Join this BSS...
     status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
-
     return (status);
 }
 
-
 static eHalStatus csrRoamIssueReassociate( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc, 
                               tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile)
 {
     csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
-
     // Set the roaming substate to 'join attempt'...
     csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_REASSOC_REQ, sessionId );
 
@@ -6362,8 +6150,6 @@
     return csrSendSmeReassocReqMsg( pMac, sessionId, pSirBssDesc, pIes, pProfile );
 }
 
-
-
 void csrRoamReissueRoamCommand(tpAniSirGlobal pMac)
 {
     tListElem *pEntry;
@@ -6403,7 +6189,6 @@
  
 #endif                  
 
-
                 if( !HAL_STATUS_SUCCESS( csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ ) ) )
                 {
                     smsLog(pMac, LOGE, " Failed to reissue stop_bss command for WDS after disassociated\n");
@@ -6427,13 +6212,11 @@
     }
 }
 
-
 tANI_BOOLEAN csrIsRoamCommandWaitingForSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
     tListElem *pEntry;
     tSmeCmd *pCommand = NULL;
-
     //alwasy lock active list before locking pending list
     csrLLLock( &pMac->sme.smeCmdActiveList );
     pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
@@ -6462,16 +6245,13 @@
         csrLLUnlock(&pMac->sme.smeCmdPendingList);
     }
     csrLLUnlock( &pMac->sme.smeCmdActiveList );
-
     return (fRet);
 }
 
-
 tANI_BOOLEAN csrIsRoamCommandWaiting(tpAniSirGlobal pMac)
 {
     tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
     tANI_U32 i;
-
     for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
     {
         if( CSR_IS_SESSION_VALID( pMac, i ) && ( fRet = csrIsRoamCommandWaitingForSession( pMac, i ) ) )
@@ -6479,15 +6259,12 @@
             break;
         }
     }
-
     return ( fRet );
 }
 
-
 tANI_BOOLEAN csrIsCommandWaiting(tpAniSirGlobal pMac)
 {
     tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
-
     //alwasy lock active list before locking pending list
     csrLLLock( &pMac->sme.smeCmdActiveList );
     fRet = csrLLIsListEmpty(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
@@ -6496,17 +6273,14 @@
         fRet = csrLLIsListEmpty(&pMac->sme.smeCmdPendingList, LL_ACCESS_LOCK);
     }
     csrLLUnlock( &pMac->sme.smeCmdActiveList );
-
     return (fRet);
 }
 
-
 tANI_BOOLEAN csrIsScanForRoamCommandActive( tpAniSirGlobal pMac )
 {
     tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
     tListElem *pEntry;
     tCsrCmd *pCommand;
-
     //alwasy lock active list before locking pending list
     csrLLLock( &pMac->sme.smeCmdActiveList );
     pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
@@ -6522,10 +6296,8 @@
         }
     }
     csrLLUnlock( &pMac->sme.smeCmdActiveList );
-
     return (fRet);
 }
-
 eHalStatus csrRoamIssueReassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -6533,7 +6305,6 @@
     tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_TRUE;
     tANI_BOOLEAN fRemoveCmd = FALSE;
     tListElem *pEntry; 
-
     // Delete the old assoc command. All is setup for reassoc to be serialized
     pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
     if ( pEntry )
@@ -6562,13 +6333,11 @@
             }
         }
     }
-
     if(NULL == pCommand)
     {
         smsLog( pMac, LOGE, FL(" fail to get command buffer as expected based on previous connect roam command\n") );
         return eHAL_STATUS_RESOURCES;
     }
-
     do 
     {
         //Change the substate in case it is wait-for-key
@@ -6580,7 +6349,6 @@
         pCommand->command = eSmeCommandRoam;
         pCommand->sessionId = (tANI_U8)sessionId;
         pCommand->u.roamCmd.roamReason = eCsrSmeIssuedFTReassoc;
-
         status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
         if( !HAL_STATUS_SUCCESS( status ) )
         {
@@ -6589,7 +6357,6 @@
         }
     } while( 0 );
 
-
     return( status );
 }
 static void csrRoamingStateConfigCnfProcessor( tpAniSirGlobal pMac, tANI_U32 result )
@@ -6600,7 +6367,6 @@
     tSmeCmd *pCommand = NULL;
     tANI_U32 sessionId;
     tCsrRoamSession *pSession;
-
     if(NULL == pEntry)
     {
         smsLog(pMac, LOGW, "   CFG_CNF with active list empty\n");
@@ -6657,7 +6423,6 @@
                 if ( csrIsInfraBssDesc( pBssDesc ) )
                 {
                     tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
-
                     if(pIesLocal || (HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
                     {
                     // ..and currently in an Infrastructure connection....
@@ -6704,7 +6469,6 @@
                         }
                         else
 #endif
-
 #ifdef FEATURE_WLAN_CCX
                         if (csrRoamIsHandoffInProgress(pMac) && 
                                                 csrRoamIsCCXAssoc(pMac))
@@ -6773,7 +6537,6 @@
     }//we have active entry
 }
 
-
 static void csrRoamRoamingStateAuthRspProcessor( tpAniSirGlobal pMac, tSirSmeAuthRsp *pSmeAuthRsp )
 {
     //No one is sending eWNI_SME_AUTH_REQ to PE.
@@ -6784,7 +6547,6 @@
         // Successfully authenticated with a new Bss.  Attempt to stop the current Bss and
         // join the new one...
         /***pBssDesc = profGetRoamingBssDesc( pAdapter, &pHddProfile );
-
         roamStopNetwork( pAdapter, &pBssDesc->SirBssDescription );***/
     }
     else {
@@ -6795,7 +6557,6 @@
     }
 }
 
-
 static void csrRoamRoamingStateReassocRspProcessor( tpAniSirGlobal pMac, tpSirSmeJoinRsp pSmeJoinRsp )
 {
     eCsrRoamCompleteResult result;
@@ -6807,7 +6568,6 @@
     {
         smsLog( pMac, LOGW, "CSR SmeReassocReq Successful\n" );
         result = eCsrReassocSuccess;
-
         /* Defeaturize this part later if needed */
 #ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
         /* Since the neighbor roam algorithm uses reassoc req for handoff instead of join, 
@@ -6855,14 +6615,11 @@
     }
 }
 
-
 static void csrRoamRoamingStateStopBssRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSmeRsp)
 {
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
     {
         vos_log_ibss_pkt_type *pIbssLog;
-
         WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
         if(pIbssLog)
         {
@@ -6875,7 +6632,6 @@
         }
     }
 #endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
-
     pMac->roam.roamSession[pSmeRsp->sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
     if(CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, pSmeRsp->sessionId))
     {
@@ -6887,7 +6643,6 @@
     }
 }
 
-
 void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisassocRsp *pSmeRsp )
 {
     tSirResultCodes statusCode;
@@ -6904,6 +6659,7 @@
 #endif
     tANI_U32 sessionId;
     tCsrRoamSession *pSession;
+
     tSirSmeDisassocRsp SmeDisassocRsp;
 
     csrSerDesUnpackDiassocRsp((tANI_U8 *)pSmeRsp, &SmeDisassocRsp);
@@ -6916,7 +6672,6 @@
     {
         pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
     }
-
     pSession = CSR_GET_SESSION( pMac, sessionId );
     if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, sessionId ) )
     {
@@ -6932,7 +6687,6 @@
         } 
         csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
     }
-
     else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, sessionId ) )
     {
        smsLog( pMac, LOGE, "CSR SmeDisassocReq due to HO\n" );
@@ -6941,11 +6695,11 @@
         if ( pEntry )
         {
             pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
-
             // If the head of the queue is Active and it is a ROAM command, remove
             // and put this on the Free queue.
             if ( eSmeCommandRoam == pCommand->command )
             {
+
                 //we need to process the result first before removing it from active list because state changes 
                 //still happening insides roamQProcessRoamResults so no other roam command should be issued
                 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
@@ -6954,7 +6708,6 @@
                     csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
                     pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
                 }
-
                 if( fRemoveCmd )
                 {
                     csrReleaseCommandRoam( pMac, pCommand );
@@ -6974,13 +6727,12 @@
         {
             smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
         }
-
         //notify HDD for handoff, providing the BSSID too
         roamInfo.reasonCode = eCsrRoamReasonBetterAP;
 
         palCopyMemory(pMac->hHdd, roamInfo.bssid, pMac->roam.neighborRoamInfo.csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
 
-        csrRoamCallCallback(pMac,sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
+            csrRoamCallCallback(pMac,sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
 
         status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
         if(HAL_STATUS_SUCCESS(status))
@@ -7030,12 +6782,12 @@
         }
         if( pScanFilter )
         {
+
             csrFreeScanFilter(pMac, pScanFilter);
             palFreeMemory( pMac->hHdd, pScanFilter );
         }
-
-
 #endif
+
     } //else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac ) )
     else if ( CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, sessionId ) )
     {
@@ -7064,14 +6816,11 @@
         //We are not done yet. Get the data and continue roaming
         csrRoamReissueRoamCommand(pMac);
     }
-
 }
 
-
 static void csrRoamRoamingStateDeauthRspProcessor( tpAniSirGlobal pMac, tSirSmeDeauthRsp *pSmeRsp )
 {
     tSirResultCodes statusCode;
-
     //No one is sending eWNI_SME_DEAUTH_REQ to PE.
     smsLog(pMac, LOGW, FL("is no-op\n"));
     statusCode = csrGetDeAuthRspStatusCode( pSmeRsp );
@@ -7096,7 +6845,6 @@
     }
 }
 
-
 static void csrRoamRoamingStateStartBssRspProcessor( tpAniSirGlobal pMac, tSirSmeStartBssRsp *pSmeStartBssRsp )
 {
     eCsrRoamCompleteResult result;
@@ -7119,7 +6867,6 @@
 #endif
 }
 
-
 /*
   We need to be careful on whether to cast pMsgBuf (pSmeRsp) to other type of strucutres.
   It depends on how the message is constructed. If the message is sent by limSendSmeRsp,
@@ -7134,9 +6881,7 @@
     tCsrRoamInfo roamInfo;
         // TODO Session Id need to be acquired in this function
         tANI_U32 sessionId = 0;
-
     pSmeRsp = (tSirSmeRsp *)pMsgBuf;
-
     smsLog( pMac, LOG2, "Message %d[0x%04X] received in substate %d\n",
                 pSmeRsp->messageType, pSmeRsp->messageType,
                 pMac->roam.curSubState[pSmeRsp->sessionId] );
@@ -7214,9 +6959,7 @@
             {
                 csrRoamingStateConfigCnfProcessor( pMac, ((tCsrCfgSetRsp *)pSmeRsp)->respStatus );
             }
-
             break;
-
         //In case CSR issues STOP_BSS, we need to tell HDD about peer departed becasue PE is removing them
         case eWNI_SME_IBSS_PEER_DEPARTED_IND:
             pIbssPeerInd = (tSmeIbssPeerInd*)pSmeRsp;
@@ -7230,7 +6973,6 @@
                                 eCSR_ROAM_CONNECT_STATUS_UPDATE, 
                                 eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
             break;
-
         default:
             smsLog( pMac, LOG1, "Unexpected message type = %d[0x%X] received in substate %d\n",
                       pSmeRsp->messageType, pSmeRsp->messageType,
@@ -7245,11 +6987,9 @@
     }
 }
 
-
 void csrRoamJoinedStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
 {
     tSirSmeRsp *pSirMsg = (tSirSmeRsp *)pMsgBuf;
-
     switch (pSirMsg->messageType) 
     {
        case eWNI_SME_GET_STATISTICS_RSP:
@@ -7265,31 +7005,22 @@
             tCsrRoamInfo *pRoamInfo = NULL;
             tANI_U32 sessionId;
             eHalStatus status;
-
             smsLog( pMac, LOG1, FL("ASSOCIATION confirmation can be given to upper layer \n"));
-
             palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
             pRoamInfo = &roamInfo;
-
             pUpperLayerAssocCnf = (tSirSmeAssocIndToUpperLayerCnf *)pMsgBuf;
             status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pUpperLayerAssocCnf->bssId, &sessionId );
             pSession = CSR_GET_SESSION(pMac, sessionId);
-
             pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success 
             pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
-
             pRoamInfo->staId = (tANI_U8)pUpperLayerAssocCnf->aid;
             pRoamInfo->rsnIELen = (tANI_U8)pUpperLayerAssocCnf->rsnIE.length;
             pRoamInfo->prsnIE = pUpperLayerAssocCnf->rsnIE.rsnIEdata;
-
             pRoamInfo->addIELen = (tANI_U8)pUpperLayerAssocCnf->addIE.length;
             pRoamInfo->paddIE = pUpperLayerAssocCnf->addIE.addIEdata;           
-
             palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pUpperLayerAssocCnf->peerMacAddr, sizeof(tSirMacAddr));
             palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pUpperLayerAssocCnf->bssId, sizeof(tCsrBssid));
-
             pRoamInfo->wmmEnabledSta = pUpperLayerAssocCnf->wmmEnabledSta;
-
             if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) )
             {
                 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED;
@@ -7303,19 +7034,15 @@
                 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
             }
 
-
         }
         break;
 #endif
-
        default:
           csrRoamCheckForLinkStatusChange( pMac, pSirMsg );
           break;
     }
-
 }
 
-
 eHalStatus csrRoamIssueSetContextReq( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrEncryptionType EncryptType, 
                                      tSirBssDescription *pBssDescription,
                                 tSirMacAddr *bssId, tANI_BOOLEAN addKey,
@@ -7339,7 +7066,6 @@
            addKey )     
     {
         tCsrRoamSetKey setKey;
-
         setKey.encType = EncryptType;
         setKey.keyDirection = aniKeyDirection;    //Tx, Rx or Tx-and-Rx
         palCopyMemory( pMac->hHdd, &setKey.peerMac, bssId, sizeof(tCsrBssid) );   
@@ -7352,11 +7078,9 @@
         }
         status = csrRoamIssueSetKeyCommand( pMac, sessionId, &setKey, 0 );
     }
-
     return (status);
 }
 
-
 static eHalStatus csrRoamIssueSetKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId, 
                                              tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
 {
@@ -7458,6 +7182,7 @@
             break;
         }
 #endif /* FEATURE_WLAN_CCX */
+
 #ifdef WLAN_FEATURE_11W
         //Check for 11w BIP
         else if ( eCSR_ENCRYPT_TYPE_AES_CMAC == pSetKey->encType )
@@ -7488,7 +7213,6 @@
             smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
         }
     } while (0);
-
     // Free the command if there has been a failure, or it is a 
     // "local" operation like the set CCX CCKM KRK key.
     if( (!HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand )) 
@@ -7499,18 +7223,15 @@
     {
         csrReleaseCommandSetKey( pMac, pCommand );
     }
-
     return( status );
 }
 
-
 eHalStatus csrRoamIssueRemoveKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
                                          tCsrRoamRemoveKey *pRemoveKey, tANI_U32 roamId )
 {
     eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
     tSmeCmd *pCommand = NULL;
     tANI_BOOLEAN fImediate = eANI_BOOLEAN_TRUE;
-
     do
     {
         if( !csrIsSetKeyAllowed(pMac, sessionId) ) 
@@ -7537,7 +7258,6 @@
             //in this case, put it to the end of the Q incase there is a set key pending.
             fImediate = eANI_BOOLEAN_FALSE;
         }
-
         smsLog( pMac, LOGE, FL("keyType=%d, keyId=%d, PeerMac=%02x, %02x, %02x, %02x, %02x, %02x\n"),       
             pRemoveKey->encType, pRemoveKey->keyId,
             pCommand->u.removeKeyCmd.peerMac[0],
@@ -7546,7 +7266,6 @@
             pCommand->u.removeKeyCmd.peerMac[3], 
             pCommand->u.removeKeyCmd.peerMac[4],
             pCommand->u.removeKeyCmd.peerMac[5]);
-
         status = csrQueueSmeCommand(pMac, pCommand, fImediate);
         if( !HAL_STATUS_SUCCESS( status ) )
         {
@@ -7554,16 +7273,13 @@
             break;
         }
     } while (0);
-
     if( !HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ) )
     {
         csrReleaseCommandRemoveKey( pMac, pCommand );
     }
-
     return (status );
 }
 
-
 eHalStatus csrRoamProcessSetKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
 {
     eHalStatus status;
@@ -7571,11 +7287,9 @@
     tAniEdType edType = csrTranslateEncryptTypeToEdType( pCommand->u.setKeyCmd.encType );
     tANI_BOOLEAN fUnicast = ( pCommand->u.setKeyCmd.peerMac[0] == 0xFF ) ? eANI_BOOLEAN_FALSE : eANI_BOOLEAN_TRUE;
     tANI_U32 sessionId = pCommand->sessionId;
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
-
     if(eCSR_ENCRYPT_TYPE_NONE != edType)
     {
         palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
@@ -7595,7 +7309,6 @@
         if(CSR_IS_ENC_TYPE_STATIC(edType))
         {
             tANI_U32 defKeyId;
-
             //It has to be static WEP here
             if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, &defKeyId)))
             {
@@ -7610,7 +7323,6 @@
         WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
     }
 #endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
-
     if( csrIsSetKeyAllowed(pMac, sessionId) )
     {
         status = csrSendMBSetContextReqMsg( pMac, sessionId, 
@@ -7630,7 +7342,6 @@
     {
         smsLog( pMac, LOGE, FL("  error status %d\n"), status );
         csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.setKeyCmd.roamId, eCSR_ROAM_SET_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
         if(eCSR_ENCRYPT_TYPE_NONE != edType)
         {
@@ -7646,13 +7357,10 @@
             WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
         }
 #endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
-
     }
-
     return ( status );
 }
 
-
 eHalStatus csrRoamProcessRemoveKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
 {
     eHalStatus status;
@@ -7660,11 +7368,9 @@
     tANI_U16 wMsgLen = sizeof(tSirSmeRemoveKeyReq);
     tANI_U8 *p;
     tANI_U32 sessionId = pCommand->sessionId;
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
-
     palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
     removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_REQ;
     removeKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
@@ -7674,7 +7380,6 @@
     removeKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
     WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
 #endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
-
     if( csrIsSetKeyAllowed(pMac, sessionId) )
     {
         status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, wMsgLen );
@@ -7690,7 +7395,6 @@
         palZeroMemory(pMac->hHdd, pMsg, wMsgLen);
         pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REMOVEKEY_REQ);
                 pMsg->length = pal_cpu_to_be16(wMsgLen);
-
         pMsg->sessionId = (tANI_U8)sessionId;
         pMsg->transactionId = 0;
         p = (tANI_U8 *)pMsg + sizeof(pMsg->messageType) + sizeof(pMsg->length) +
@@ -7719,28 +7423,21 @@
         *p = pCommand->u.removeKeyCmd.keyId;
         p++;
         *p = (pCommand->u.removeKeyCmd.peerMac[0] == 0xFF ) ? 0 : 1;
-
         status = palSendMBMessage(pMac->hHdd, pMsg);
     }
-
     if( !HAL_STATUS_SUCCESS( status ) )
     {
         smsLog( pMac, LOGE, FL(" error status \n"), status );
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
         removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
         removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;;
         WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
 #endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
-
         csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.removeKeyCmd.roamId, eCSR_ROAM_REMOVE_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
     }
-
     return ( status );
 }
 
-
-
 eHalStatus csrRoamSetKey( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
 {
     eHalStatus status;
@@ -7753,11 +7450,9 @@
     {
         status = csrRoamIssueSetKeyCommand( pMac, sessionId, pSetKey, roamId );
     }
-
     return ( status );
 }
 
-
 /*
    Prepare a filter base on a profile for parsing the scan results.
    Upon successful return, caller MUST call csrFreeScanFilter on 
@@ -7826,14 +7521,12 @@
                  {
                          smsLog(pMac, LOG1, FL("process a channel (%d) that is invalid\n"), pProfile->ChannelInfo.ChannelList[index]);
                  }
-
             }
             }
             else
             {
                 break;
             }
-
         }
         else 
         {
@@ -7866,10 +7559,8 @@
              }
         }
 #endif /* FEATURE_WLAN_WAPI */
-
         /*Save the WPS info*/
         pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
-
         if( pProfile->countryCode[0] )
         {
             //This causes the matching function to use countryCode as one of the criteria.
@@ -7894,13 +7585,11 @@
     return(status);
 }
 
-
 tANI_BOOLEAN csrRoamIssueWmStatusChange( tpAniSirGlobal pMac, tANI_U32 sessionId,
                                          eCsrRoamWmStatusChangeTypes Type, tSirSmeRsp *pSmeRsp )
 {
     tANI_BOOLEAN fCommandQueued = eANI_BOOLEAN_FALSE;
     tSmeCmd *pCommand;
-
     do
     {
         // Validate the type is ok...
@@ -7940,16 +7629,12 @@
             csrReleaseCommandWmStatusChange( pMac, pCommand );
         }
 
-
         /* AP has issued Dissac/Deauth, Set the operating mode value to configured value */
         csrSetDefaultDot11Mode( pMac );
-
     } while( 0 );
-
     return( fCommandQueued );
 }
 
-
 static void csrUpdateRssi(tpAniSirGlobal pMac, void* pMsg)
 {
     v_S7_t  rssi = 0;
@@ -7982,6 +7667,27 @@
     }
     return;
 }
+static void csrRoamRssiIndHdlr(tpAniSirGlobal pMac, void* pMsg)
+{
+    WLANTL_TlIndicationReq *pTlRssiInd = (WLANTL_TlIndicationReq*)pMsg;
+    if(pTlRssiInd)
+    {
+        if(NULL != pTlRssiInd->tlCallback)
+        {
+            ((WLANTL_RSSICrossThresholdCBType)(pTlRssiInd->tlCallback))
+            (pTlRssiInd->pAdapter, pTlRssiInd->rssiNotification, pTlRssiInd->pUserCtxt);
+        }
+        else
+        {
+            smsLog( pMac, LOGE, FL("pTlRssiInd->tlCallback is NULL\n"));                
+        }
+    }
+    else
+    {
+        smsLog( pMac, LOGE, FL("pTlRssiInd is NULL\n"));    
+    }
+    return;
+}
 
 void csrRoamCheckForLinkStatusChange( tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg )
 {
@@ -8002,7 +7708,6 @@
     tCsrRoamSession *pSession = NULL;
     tpSirSmeSwitchChannelInd pSwitchChnInd;
     tSmeMaxAssocInd *pSmeMaxAssocInd;
-
 #if defined ANI_PRODUCT_TYPE_AP
     pSirMsg->messageType = pal_be16_to_cpu(pSirMsg->messageType);
     pSirMsg->length = pal_be16_to_cpu(pSirMsg->length);
@@ -8012,9 +7717,7 @@
     pSirMsg->length = (pSirMsg->length);
     pSirMsg->statusCode = (pSirMsg->statusCode);
 #endif
-
     palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
-
     switch( pSirMsg->messageType ) 
     {
         case eWNI_SME_ASSOC_IND:
@@ -8044,7 +7747,6 @@
                 
                 pRoamInfo->addIELen = (tANI_U8)pAssocInd->addIE.length;
                 pRoamInfo->paddIE =  pAssocInd->addIE.addIEdata;
-
                     palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
                     palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pAssocInd->bssId, sizeof(tCsrBssid));
 #ifdef WLAN_SOFTAP_FEATURE
@@ -8077,7 +7779,6 @@
                     
                     /* send a message to CSR itself just to avoid the EAPOL frames going
                      * OTA before association response */
-
                     if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
                 {
                     status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
@@ -8093,10 +7794,8 @@
                 }
             }
             break;
-
         case eWNI_SME_DISASSOC_IND:
             smsLog( pMac, LOGE, FL("DISASSOCIATION Indication from MAC\n"));
-
             // Check if AP dis-associated us because of MIC failure. If so,
             // then we need to take action immediately and not wait till the
             // the WmStatusChange requests is pushed and processed
@@ -8132,7 +7831,6 @@
                 {
                     pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
                 }
-
 #ifndef WLAN_MDM_CODE_REDUCTION_OPT
                 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
 #endif
@@ -8157,7 +7855,6 @@
 #endif                
             }
             break;
-
         case eWNI_SME_DEAUTH_IND:
             smsLog( pMac, LOG1, FL("DEAUTHENTICATION Indication from MAC\n"));
             pDeauthInd = (tpSirSmeDeauthInd)pSirMsg;
@@ -8192,7 +7889,6 @@
                 {
                     pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
                 }
-
 #ifndef WLAN_MDM_CODE_REDUCTION_OPT
                 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
 #endif
@@ -8244,7 +7940,6 @@
                 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
                 {                    
                     pSession = CSR_GET_SESSION(pMac, sessionId);
-
                     if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
                     {
                         pRoamInfo = &roamInfo;
@@ -8268,7 +7963,6 @@
                 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
                 {                    
                     pSession = CSR_GET_SESSION(pMac, sessionId);
-
                     if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
                     {
                         pRoamInfo = &roamInfo;
@@ -8282,13 +7976,11 @@
             }
 #endif
             break;
-
         case eWNI_SME_MIC_FAILURE_IND:
             {
                 tpSirSmeMicFailureInd pMicInd = (tpSirSmeMicFailureInd)pSirMsg;
                 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
                 eCsrRoamResult result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
                 {
                     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
@@ -8305,7 +7997,6 @@
                     WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
                 }
 #endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
-
                 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pMicInd->bssId, &sessionId );
                 if( HAL_STATUS_SUCCESS( status ) )
                 {
@@ -8324,13 +8015,11 @@
                 }
             }
             break;
-
 #ifdef WLAN_SOFTAP_FEATURE
         case eWNI_SME_WPS_PBC_PROBE_REQ_IND:
             {
                 tpSirSmeProbeReqInd pProbeReqInd = (tpSirSmeProbeReqInd)pSirMsg;
                 tCsrRoamInfo roamInfo;
-
                 smsLog( pMac, LOG1, FL("WPS PBC Probe request Indication from SME\n"));
            
                 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pProbeReqInd->bssId, &sessionId );
@@ -8345,7 +8034,6 @@
             break;        
 #endif
             
-
         case eWNI_SME_WM_STATUS_CHANGE_NTF:
             pStatusChangeMsg = (tSirSmeWmStatusChangeNtf *)pSirMsg;
             switch( pStatusChangeMsg->statusChangeCode ) 
@@ -8370,7 +8058,6 @@
                         roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
                     }
                     break;
-
                 case eSIR_SME_IBSS_INACTIVE:
                     sessionId = csrFindIbssSession( pMac );
                     if( CSR_SESSION_ID_INVALID != sessionId )
@@ -8381,7 +8068,6 @@
                         roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
                     }
                     break;
-
                 case eSIR_SME_JOINED_NEW_BSS:    // IBSS coalescing.
                     sessionId = csrFindIbssSession( pMac );
                     if( CSR_SESSION_ID_INVALID != sessionId )
@@ -8389,12 +8075,10 @@
                         pSession = CSR_GET_SESSION( pMac, sessionId );
                         // update the connection state information
                         pNewBss = &pStatusChangeMsg->statusChangeInfo.newBssInfo;
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
                         {
                             vos_log_ibss_pkt_type *pIbssLog;
                             tANI_U32 bi;
-
                             WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
                             if(pIbssLog)
                             {
@@ -8417,7 +8101,6 @@
                             }
                         }
 #endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
-
                         csrRoamUpdateConnectedProfileFromNewBss( pMac, sessionId, pNewBss );
                         csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType, 
                                                     pSession->pConnectBssDesc,
@@ -8443,7 +8126,6 @@
                     }
                     smsLog(pMac, LOGW, "CSR:  eSIR_SME_JOINED_NEW_BSS received from PE\n");
                     break;
-
                 // detection by LIM that the capabilities of the associated AP have changed.
                 case eSIR_SME_AP_CAPS_CHANGED:
                     pApNewCaps = &pStatusChangeMsg->statusChangeInfo.apNewCaps;
@@ -8461,21 +8143,17 @@
                     roamStatus = eCSR_ROAM_FAILED;
                     result = eCSR_ROAM_RESULT_NONE;
                     break;
-
             }  // end switch on statusChangeCode
             if(eCSR_ROAM_RESULT_NONE != result)
             {
                 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, roamStatus, result);
             }
             break;
-
         case eWNI_SME_IBSS_NEW_PEER_IND:
             pIbssPeerInd = (tSmeIbssPeerInd *)pSirMsg;
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
             {
                 vos_log_ibss_pkt_type *pIbssLog;
-
                 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
                 if(pIbssLog)
                 {
@@ -8485,7 +8163,6 @@
                 }
             }
 #endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
-
             sessionId = csrFindIbssSession( pMac );
             if( CSR_SESSION_ID_INVALID != sessionId )
             {
@@ -8564,13 +8241,11 @@
                 }
             }
             break;
-
         case eWNI_SME_IBSS_PEER_DEPARTED_IND:
             pIbssPeerInd = (tSmeIbssPeerInd*)pSirMsg;
             sessionId = csrFindIbssSession( pMac );
             if( CSR_SESSION_ID_INVALID != sessionId )
             {
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
                 {
                     vos_log_ibss_pkt_type *pIbssLog;
@@ -8587,7 +8262,6 @@
                     }
                 }
 #endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
-
                 smsLog(pMac, LOGW, "CSR: Peer departed notification from LIM\n");
                 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
                 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
@@ -8597,7 +8271,6 @@
                         eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
             }
             break;
-
         case eWNI_SME_SETCONTEXT_RSP:
             {
                 tSirSmeSetContextRsp *pRsp = (tSirSmeSetContextRsp *)pSirMsg;
@@ -8656,17 +8329,17 @@
                         if( eSIR_SME_SUCCESS == pRsp->statusCode )
                         {
                             palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
-                            //Make sure we install the GTK before indicating to HDD as authenticated
-                            //This is to prevent broadcast packets go out after PTK and before GTK.
-                            if( palEqualMemory( pMac->hHdd, &Broadcastaddr, pRsp->peerMacAddr, 
-                                        sizeof(tSirMacAddr) ) )
-                            {
-                                result = eCSR_ROAM_RESULT_AUTHENTICATED;
-                            }
-                            else
-                            {
-                            result = eCSR_ROAM_RESULT_NONE;
-                            }
+                                //Make sure we install the GTK before indicating to HDD as authenticated
+                                //This is to prevent broadcast packets go out after PTK and before GTK.
+                                if( palEqualMemory( pMac->hHdd, &Broadcastaddr, pRsp->peerMacAddr, 
+                                           sizeof(tSirMacAddr) ) )
+                                {
+                                    result = eCSR_ROAM_RESULT_AUTHENTICATED;
+                                }
+                                else
+                                {
+                                    result = eCSR_ROAM_RESULT_NONE;
+                                }
                             pRoamInfo = &roamInfo;
                         }
                         else
@@ -8678,11 +8351,9 @@
                         }
                         csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId, 
                                             eCSR_ROAM_SET_KEY_COMPLETE, result);
-
                         // Indicate SME_QOS that the SET_KEY is completed, so that SME_QOS
                         // can go ahead and initiate the TSPEC if any are pending
                         sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_SET_KEY_SUCCESS_IND, NULL);
-
 #ifdef FEATURE_WLAN_CCX
                         //Send Adjacent AP repot to new AP.
                         if (result == eCSR_ROAM_RESULT_AUTHENTICATED &&
@@ -8695,7 +8366,6 @@
                             pSession->isPrevApInfoValid = FALSE;
                         }
 #endif
-
                         if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
                         {
                             csrReleaseCommandSetKey( pMac, pCommand );
@@ -8710,11 +8380,9 @@
                 {
                     smsLog( pMac, LOGE, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
                 }
-
                 smeProcessPendingQueue( pMac );
             }
             break;
-
         case eWNI_SME_REMOVEKEY_RSP:
             {
                 tSirSmeRemoveKeyRsp *pRsp = (tSirSmeRemoveKeyRsp *)pSirMsg;
@@ -8729,7 +8397,6 @@
                     {                
                         sessionId = pCommand->sessionId;
                         pSession = CSR_GET_SESSION( pMac, sessionId );
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
                         {
                             WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
@@ -8749,7 +8416,6 @@
                             WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
                         }
 #endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
-
                         if( eSIR_SME_SUCCESS == pRsp->statusCode )
                         {
                             palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
@@ -8776,28 +8442,23 @@
                 {
                     smsLog( pMac, LOGW, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
                 }
-
                 smeProcessPendingQueue( pMac );
             }
             break;
-
         case eWNI_SME_GET_STATISTICS_RSP:
             smsLog( pMac, LOGW, FL("Stats rsp from PE\n"));
             csrRoamStatsRspProcessor( pMac, pSirMsg );
             break;
-
         case eWNI_SME_GET_RSSI_REQ:
             smsLog( pMac, LOGW, FL("GetRssiReq from self\n"));
             csrUpdateRssi( pMac, pSirMsg );
             break;
 
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
         case eWNI_SME_FT_PRE_AUTH_RSP:
             csrRoamFTPreAuthRspProcessor( pMac, (tpSirFTPreAuthRsp)pSirMsg );
             break;
 #endif
-
         case eWNI_SME_MAX_ASSOC_EXCEEDED:
             pSmeMaxAssocInd = (tSmeMaxAssocInd*)pSirMsg;
             smsLog( pMac, LOG1, FL("send indication that max assoc have been reached and the new peer cannot be accepted\n"));          
@@ -8812,15 +8473,16 @@
             smsLog( pMac, LOG1, FL("Establish logical link req from HCI serialized through MC thread\n"));
             btampEstablishLogLinkHdlr( pSirMsg );
             break;
+        case eWNI_SME_RSSI_IND:
+            smsLog( pMac, LOG1, FL("RSSI indication from TL serialized through MC thread\n"));
+            csrRoamRssiIndHdlr( pMac, pSirMsg );
+        break;
 
         default:
             break;
-
     }  // end switch on message type
-
 }
 
-
 void csrCallRoamingCompletionCallback(tpAniSirGlobal pMac, tCsrRoamSession *pSession, 
                                       tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, eCsrRoamResult roamResult)
 {
@@ -8847,17 +8509,14 @@
 eHalStatus csrRoamStartRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamingReason roamingReason)
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
-
     if(CSR_IS_LOSTLINK_ROAMING(roamingReason) && 
         (eANI_BOOLEAN_FALSE == pMac->roam.roamSession[sessionId].fCancelRoaming))
     {
         status = csrScanRequestLostLink1( pMac, sessionId );
     }
-
     return(status);
 }
 
-
 //return a boolean to indicate whether roaming completed or continue.
 tANI_BOOLEAN csrRoamCompleteRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId, 
                                     tANI_BOOLEAN fForce, eCsrRoamResult roamResult)
@@ -8866,7 +8525,6 @@
     tANI_TIMESTAMP roamTime = (tANI_TIMESTAMP)(pMac->roam.configParam.nRoamingTime * PAL_TICKS_PER_SECOND);
     tANI_TIMESTAMP curTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     //Check whether time is up
     if(pSession->fCancelRoaming || fForce || 
        ((curTime - pSession->roamingStartTime) > roamTime) ||
@@ -8913,15 +8571,12 @@
             fCompleted = eANI_BOOLEAN_FALSE;
         }
     }
-
     return(fCompleted);
 }
 
-
 void csrRoamCancelRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if(CSR_IS_ROAMING(pSession))
     {
         smsLog(pMac, LOGW, "   Cancelling roaming\n");
@@ -8943,7 +8598,6 @@
     }
 }
 
-
 void csrRoamRoamingTimerHandler(void *pv)
 {
     tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
@@ -8961,7 +8615,6 @@
     }
 }
 
-
 eHalStatus csrRoamStartRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
 {
     eHalStatus status;
@@ -8974,18 +8627,15 @@
     return (status);
 }
 
-
 eHalStatus csrRoamStopRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerRoaming));
 }
 
-
 void csrRoamWaitForKeyTimeOutHandler(void *pv)
 {
     tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
     tpAniSirGlobal pMac = pInfo->pMac;
-
     if( CSR_IS_WAIT_FOR_KEY( pMac, pInfo->sessionId ) )
     {
         smsLog(pMac, LOGW, " SME pre-auth state timeout. \n ");
@@ -8995,7 +8645,6 @@
     
 }
 
-
 eHalStatus csrRoamStartWaitForKeyTimer(tpAniSirGlobal pMac, tANI_U32 interval)
 {
     eHalStatus status;
@@ -9006,13 +8655,11 @@
     return (status);
 }
 
-
 eHalStatus csrRoamStopWaitForKeyTimer(tpAniSirGlobal pMac)
 {
     return (palTimerStop(pMac->hHdd, pMac->roam.hTimerWaitForKey));
 }
 
-
 void csrRoamIbssJoinTimerHandler(void *pv)
 {
     tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
@@ -9026,9 +8673,7 @@
     //csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
     // Send an IBSS stop request to PE
     csrRoamDisconnectInternal(pMac, sessionId, reason);
-
 }
-
 eHalStatus csrRoamStartIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
 {
     eHalStatus status;
@@ -9040,12 +8685,10 @@
     
     return (status);
 }
-
 eHalStatus csrRoamStopIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerIbssJoining));
 }
-
 void csrRoamCompletion(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo, tSmeCmd *pCommand, 
                         eCsrRoamResult roamResult, tANI_BOOLEAN fSuccess)
 {
@@ -9059,7 +8702,6 @@
         VOS_ASSERT( sessionId == pCommand->sessionId );
 #endif
     }
-
     if(eCSR_ROAM_ROAMING_COMPLETION == roamStatus)
     {
         //if success, force roaming completion
@@ -9073,7 +8715,6 @@
     }
 }
 
-
 eHalStatus csrRoamLostLink( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 type, tSirSmeRsp *pSirMsg)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -9085,7 +8726,6 @@
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     //Only need to roam for infra station. In this case P2P client will roam as well
     tANI_BOOLEAN fToRoam = CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile);
-
     pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
     if ( eWNI_SME_DISASSOC_IND == type )
     {
@@ -9121,7 +8761,6 @@
     {
         status = csrSendMBDeauthCnfMsg(pMac, pDeauthIndMsg);
     }
-
     if(!HAL_STATUS_SUCCESS(status))
     {
        //If fail to send confirmation to PE, not to trigger roaming
@@ -9135,16 +8774,16 @@
 #ifdef WLAN_SOFTAP_FEATURE
     if( eWNI_SME_DISASSOC_IND == type)
     {
-        //staMacAddr
-        palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
-        roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
-    }
+            //staMacAddr
+            palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
+            roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
+        }
     else if( eWNI_SME_DEAUTH_IND == type )
     {
-        //staMacAddr
-        palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
-        roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
-    }
+            //staMacAddr
+            palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
+            roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
+        }
 #endif
     smsLog(pMac, LOGW, FL("roamInfo.staId (%d)\n"), roamInfo.staId);
     csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
@@ -9171,7 +8810,7 @@
                 {
                    roamInfo.reasonCode = eCsrRoamReasonSmeIssuedForLostLink;
                 }
-                pRoamInfo = &roamInfo;
+                    pRoamInfo = &roamInfo;
                 pSession->roamingReason = ( eWNI_SME_DEAUTH_IND == type ) ? 
                         eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc;
                 pSession->roamingStartTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
@@ -9189,7 +8828,6 @@
             fToRoam = eANI_BOOLEAN_FALSE;
         }
     }
-
     if(!fToRoam)
     {
        if( eWNI_SME_DISASSOC_IND == type)
@@ -9217,7 +8855,6 @@
     return (status);
 }
 
-
 eHalStatus csrRoamLostLinkAfterhandoffFailure( tpAniSirGlobal pMac,tANI_U32 sessionId)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -9225,7 +8862,6 @@
     tSmeCmd *pCommand = NULL;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     pSession->fCancelRoaming =  eANI_BOOLEAN_FALSE;
-
     //Only remove the connected BSS in infrastructure mode
     csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
     if(pMac->roam.configParam.nRoamingTime)
@@ -9249,7 +8885,6 @@
                  }
              }
           }
-
           smsLog( pMac, LOGW, "Lost link roaming started ...\n");
        }
     }
@@ -9261,12 +8896,10 @@
     
     return (status);
 }
-
 void csrRoamWmStatusChangeComplete( tpAniSirGlobal pMac )
 {
     tListElem *pEntry;
     tSmeCmd *pCommand;
-
     pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
     if ( pEntry )
     {
@@ -9294,29 +8927,24 @@
     {
         smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but NO commands are ACTIVE ...\n" );
     }
-
     smeProcessPendingQueue( pMac );
 }
 
-
 void csrRoamProcessWmStatusChangeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
     tSirSmeRsp *pSirSmeMsg;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pCommand->sessionId );
-
     switch ( pCommand->u.wmStatusChangeCmd.Type )
     {
         case eCsrDisassociated:
             pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg;
             status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DISASSOC_IND, pSirSmeMsg);
             break;
-
         case eCsrDeauthenticated:
             pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg;
             status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DEAUTH_IND, pSirSmeMsg);
             break;
-
         default:
             smsLog(pMac, LOGW, FL("gets an unknown command %d\n"), pCommand->u.wmStatusChangeCmd.Type);
             break;
@@ -9330,13 +8958,11 @@
             smsLog(pMac, LOGE, FL("  failed to issue stopBSS command\n"));
         }
     }
-
     // Lost Link just triggers a roaming sequence.  We can complte the Lost Link
     // command here since there is nothing else to do.
     csrRoamWmStatusChangeComplete( pMac );
 }
 
-
 //This function returns band and mode information.
 //The only tricky part is that if phyMode is set to 11abg, this function may return eCSR_CFG_DOT11_MODE_11B
 //instead of eCSR_CFG_DOT11_MODE_11G if everything is set to auto-pick.
@@ -9348,7 +8974,6 @@
                                                      tANI_U8 operationChn, eCsrBand *pBand )
 #endif
 {
-
 #ifdef WLAN_SOFTAP_FEATURE
     eCsrPhyMode phyModeIn = (eCsrPhyMode)pProfile->phyMode;
     eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pProfile, phyModeIn, 
@@ -9369,7 +8994,6 @@
     if( (eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
         (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode) ||
         (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
-
 #endif
     {
         switch( pMac->roam.configParam.uCfgDot11Mode )
@@ -9470,21 +9094,18 @@
      smsLog(pMac, LOGE, FL("  Switching to Dot11B mode \n"));
      cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
    }
-
     return( cfgDot11Mode );
 }
 
-
 eHalStatus csrRoamIssueStopBss( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
 {
     eHalStatus status;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
+    
     
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
     {
         vos_log_ibss_pkt_type *pIbssLog;
-
         WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
         if(pIbssLog)
         {
@@ -9493,7 +9114,6 @@
         }
     }
 #endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
-
     pSession->ibss_join_pending = FALSE;
     csrRoamStopIbssJoinTimer(pMac, sessionId );
     // Set the roaming substate to 'stop Bss request'...
@@ -9505,7 +9125,6 @@
     return (status);
 }
 
-
 //pNumChan is a caller allocated space with the sizeof pChannels
 eHalStatus csrGetCfgValidChannels(tpAniSirGlobal pMac, tANI_U8 *pChannels, tANI_U32 *pNumChan)
 {
@@ -9515,7 +9134,6 @@
                   pNumChan));
 }
 
-
 tANI_BOOLEAN csrRoamIsChannelValid( tpAniSirGlobal pMac, tANI_U8 channel )
 {
     tANI_BOOLEAN fValid = FALSE;
@@ -9537,12 +9155,10 @@
     return fValid;
 }
 
-
 tANI_BOOLEAN csrRoamIsValid40MhzChannel(tpAniSirGlobal pMac, tANI_U8 channel)
 {
     tANI_BOOLEAN fValid = eANI_BOOLEAN_FALSE;
     tANI_U8 i;
-
     for(i = 0; i < pMac->scan.base40MHzChannels.numChannels; i++)
     {
         if(channel == pMac->scan.base40MHzChannels.channelList[i])
@@ -9551,18 +9167,15 @@
             break;
         }
     }
-
     return (fValid);
 }
 
-
 //This function check and validate whether the NIC can do CB (40MHz)
-static tAniCBSecondaryMode csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes)
+ static ePhyChanBondState csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes)
 {
-    tAniCBSecondaryMode eRet = eANI_CB_SECONDARY_NONE;
+    ePhyChanBondState eRet = PHY_SINGLE_CHANNEL_CENTERED;
     tANI_U8 centerChn;
     tANI_U32 ChannelBondingMode;
-
     if(CSR_IS_CHANNEL_24GHZ(primaryChn))
     {
         ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
@@ -9578,39 +9191,44 @@
         {
             if(pIes->HTInfo.present)
             {
-                if(PHY_DOUBLE_CHANNEL_LOW_PRIMARY == pIes->HTInfo.secondaryChannelOffset)
-                {
-                    eRet = eANI_CB_SECONDARY_UP;
-                    centerChn = primaryChn + CSR_CB_CENTER_CHANNEL_OFFSET;
-                }
-                else if(PHY_DOUBLE_CHANNEL_HIGH_PRIMARY == pIes->HTInfo.secondaryChannelOffset)
-                {
-                    eRet = eANI_CB_SECONDARY_DOWN;
-                    centerChn = primaryChn - CSR_CB_CENTER_CHANNEL_OFFSET;
-                }
+                /* This is called during INFRA STA/CLIENT and should use the merged value of 
+                 * supported channel width and recommended tx width as per standard
+                 */
+                smsLog(pMac, LOG1, "scws %u rtws %u sco %u\n",
+                    pIes->HTCaps.supportedChannelWidthSet,
+                    pIes->HTInfo.recommendedTxWidthSet,
+                    pIes->HTInfo.secondaryChannelOffset);
+
+                if (pIes->HTInfo.recommendedTxWidthSet == eHT_CHANNEL_WIDTH_40MHZ)
+                    eRet = (ePhyChanBondState)pIes->HTInfo.secondaryChannelOffset;
                 else
-                {
-                    //PHY_SINGLE_CHANNEL_CENTERED
-                    centerChn = primaryChn;
-                    eRet = eANI_CB_SECONDARY_NONE;
+                    eRet = PHY_SINGLE_CHANNEL_CENTERED;
+                switch (eRet) {
+                    case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
+                        centerChn = primaryChn + CSR_CB_CENTER_CHANNEL_OFFSET;
+                        break;
+                    case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
+                        centerChn = primaryChn - CSR_CB_CENTER_CHANNEL_OFFSET;
+                        break;
+                    case PHY_SINGLE_CHANNEL_CENTERED:
+                    default:
+                        centerChn = primaryChn;
+                        break;
                 }
-                if((eANI_CB_SECONDARY_NONE != eRet) && !csrRoamIsValid40MhzChannel(pMac, centerChn))
+                if((PHY_SINGLE_CHANNEL_CENTERED != eRet) && !csrRoamIsValid40MhzChannel(pMac, centerChn))
                 {
-                    smsLog(pMac, LOGW, "  Invalid center channel (%d), disable 40MHz mode\n", centerChn);
-                    eRet = eANI_CB_SECONDARY_NONE;
+                    smsLog(pMac, LOGE, "  Invalid center channel (%d), disable 40MHz mode\n", centerChn);
+                    //eRet = PHY_SINGLE_CHANNEL_CENTERED;
                 }
             }
         }
     }
-
     return eRet;
 }
-
 tANI_BOOLEAN csrIsEncryptionInList( tpAniSirGlobal pMac, tCsrEncryptionList *pCipherList, eCsrEncryptionType encryptionType )
 {
     tANI_BOOLEAN fFound = FALSE;
     tANI_U32 idx;
-
     for( idx = 0; idx < pCipherList->numEntries; idx++ )
     {
         if( pCipherList->encryptionType[idx] == encryptionType )
@@ -9619,15 +9237,12 @@
             break;
         }
     }
-
     return fFound;
 }
-
 tANI_BOOLEAN csrIsAuthInList( tpAniSirGlobal pMac, tCsrAuthList *pAuthList, eCsrAuthType authType )
 {
     tANI_BOOLEAN fFound = FALSE;
     tANI_U32 idx;
-
     for( idx = 0; idx < pAuthList->numEntries; idx++ )
     {
         if( pAuthList->authType[idx] == authType )
@@ -9636,10 +9251,8 @@
             break;
         }
     }
-
     return fFound;
 }
-
 tANI_BOOLEAN csrIsSameProfile(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile1, tCsrRoamProfile *pProfile2)
 {
     tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
@@ -9700,12 +9313,10 @@
     return (fCheck);
 }
 
-
 tANI_BOOLEAN csrRoamIsSameProfileKeys(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pConnProfile, tCsrRoamProfile *pProfile2)
 {
     tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
     int i;
-
     do
     {
         //Only check for static WEP
@@ -9731,14 +9342,11 @@
             fCheck = eANI_BOOLEAN_TRUE;
         }
     }while(0);
-
     return (fCheck);
 }
 
-
 //IBSS
 
-
 tANI_U8 csrRoamGetIbssStartChannelNumber50( tpAniSirGlobal pMac )
 {
     tANI_U8 channel = 0;     
@@ -9768,7 +9376,6 @@
                 }
             }
         }
-
         // this is rare, but if it does happen, we find anyone in 11a bandwidth and return the first 11a channel found!
         if (!fFound)    
         {
@@ -9786,7 +9393,6 @@
     return( channel );    
 }
 
-
 tANI_U8 csrRoamGetIbssStartChannelNumber24( tpAniSirGlobal pMac )
 {
     tANI_U8 channel = 1;
@@ -9822,7 +9428,6 @@
     return( channel );    
 }
 
-
 static void csrRoamGetBssStartParms( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, 
                                       tCsrRoamStartBssParams *pParam )
 {
@@ -9856,21 +9461,17 @@
         VOS_ASSERT(0);
     }
 #endif
-
     switch( cfgDot11Mode )
     {
         case eCSR_CFG_DOT11_MODE_11G:
             nwType = eSIR_11G_NW_TYPE;
             break;
-
         case eCSR_CFG_DOT11_MODE_11B:
             nwType = eSIR_11B_NW_TYPE;
             break;   
-
         case eCSR_CFG_DOT11_MODE_11A:
             nwType = eSIR_11A_NW_TYPE;
             break;
-
         default:
         case eCSR_CFG_DOT11_MODE_11N:
         case eCSR_CFG_DOT11_MODE_TAURUS:
@@ -9936,7 +9537,6 @@
             pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
             pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
             pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
-
             if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel ) 
             {
                 channel = csrRoamGetIbssStartChannelNumber24( pMac );
@@ -9947,7 +9547,6 @@
             }
             
             break;     
-
         case eSIR_11G_NW_TYPE:
 #ifdef WLAN_FEATURE_P2P
             /* For P2P Client and P2P GO, disable 11b rates */ 
@@ -9970,14 +9569,12 @@
 #endif            
             {
             pParam->operationalRateSet.numRates = 4;
-
             pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
             pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
             pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
             pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
                
             pParam->extendedRateSet.numRates = 8;
-
                         pParam->extendedRateSet.rate[0] = SIR_MAC_RATE_6;
             pParam->extendedRateSet.rate[1] = SIR_MAC_RATE_9;
             pParam->extendedRateSet.rate[2] = SIR_MAC_RATE_12;
@@ -10003,7 +9600,6 @@
     pParam->sirNwType = nwType;
 }
 
-
 static void csrRoamGetBssStartParmsFromBssDesc( tpAniSirGlobal pMac, tSirBssDescription *pBssDesc, 
                                                  tDot11fBeaconIEs *pIes, tCsrRoamStartBssParams *pParam )
 {
@@ -10011,7 +9607,7 @@
     if( pParam )
     {
         pParam->sirNwType = pBssDesc->nwType;
-        pParam->cbMode = eANI_CB_SECONDARY_NONE;
+        pParam->cbMode = PHY_SINGLE_CHANNEL_CENTERED;
         pParam->operationChn = pBssDesc->channelId;
         palCopyMemory( pMac->hHdd, &pParam->bssid, pBssDesc->bssId, sizeof(tCsrBssid) );
     
@@ -10035,7 +9631,6 @@
                 palCopyMemory(pMac->hHdd, pParam->ssId.ssId, pIes->SSID.ssid, pParam->ssId.length);
             }
             pParam->cbMode = csrGetCBModeFromIes(pMac, pParam->operationChn, pIes);
-
         }
         else
         {
@@ -10045,7 +9640,6 @@
     }
 }
 
-
 static void csrRoamDetermineMaxRateForAdHoc( tpAniSirGlobal pMac, tSirMacRateSet *pSirRateSet )
 {
     tANI_U8 MaxRate = 0;
@@ -10065,7 +9659,6 @@
     return;
 }
 
-
 //this function finds a valid secondary channel for channel bonding with "channel".
 //Param: channel -- primary channel, caller must validate it
 //       cbChoice -- CB directory
@@ -10073,7 +9666,6 @@
 static tANI_U8 csrRoamGetSecondaryChannel(tpAniSirGlobal pMac, tANI_U8 channel, eCsrCBChoice cbChoice)
 {
     tANI_U8 chnUp = 0, chnDown = 0, chnRet = 0;
-
     switch (cbChoice)
     {
     case eCSR_CB_OFF:
@@ -10095,7 +9687,6 @@
         chnDown = channel - CSR_CB_CHANNEL_GAP;
         break;
     }
-
     //if CB_UP or auto, try channel up first
     if(chnUp && CSR_IS_SAME_BAND_CHANNELS(chnUp, channel) && csrRoamIsChannelValid(pMac, chnUp))
     {
@@ -10114,26 +9705,21 @@
             chnRet = chnDown;
         }
     }
-
     return chnRet;
 }
 
-
 eHalStatus csrRoamIssueStartBss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamStartBssParams *pParam, 
                                  tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc, tANI_U32 roamId )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     eCsrBand eBand;
-
     // Set the roaming substate to 'Start BSS attempt'...
     csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_START_BSS_REQ, sessionId );
-
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
     //Need to figure out whether we need to log WDS???
     if( CSR_IS_IBSS( pProfile ) )
     {
         vos_log_ibss_pkt_type *pIbssLog;
-
         WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
         if(pIbssLog)
         {
@@ -10165,7 +9751,6 @@
     pParam->nRSNIELength = (tANI_U16)pProfile->nRSNReqIELength;
     pParam->pRSNIE = pProfile->pRSNReqIE;
 
-
 #ifdef WLAN_SOFTAP_FEATURE
     pParam->privacy           = pProfile->privacy;
     pParam->fwdWPSPBCProbeReq = pProfile->fwdWPSPBCProbeReq;   
@@ -10181,14 +9766,12 @@
             pParam->operationChn = INFRA_AP_DEFAULT_CHANNEL;                   
         }  
     }
-
     pParam->protEnabled     = pProfile->protEnabled;
     pParam->obssProtEnabled = pProfile->obssProtEnabled;
     pParam->ht_protection   = pProfile->cfg_protection;
     pParam->wps_state       = pProfile->wps_state;
 #endif
     
-
 #ifdef WLAN_SOFTAP_FEATURE
     pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, pParam->operationChn /* pProfile->operationChannel*/, 
                                         &eBand);
@@ -10199,19 +9782,16 @@
     pParam->bssPersona = pProfile->csrPersona;
     // When starting an IBSS, start on the channel from the Profile.
     status = csrSendMBStartBssReqMsg( pMac, sessionId, pProfile->BSSType, pParam, pBssDesc );
-
     return (status);
 }
 
-
 static void csrRoamPrepareBssParams(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, 
-                                     tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
+                                     tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig, tDot11fBeaconIEs *pIes)
 {
     tANI_U8 Channel, SecondChn;
-    tAniCBSecondaryMode cbMode = eANI_CB_SECONDARY_NONE;
+    ePhyChanBondState cbMode = PHY_SINGLE_CHANNEL_CENTERED;
     eCsrCBChoice cbChoice;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if( pBssDesc )
     {
         csrRoamGetBssStartParmsFromBssDesc( pMac, pBssDesc, pIes, &pSession->bssParams );
@@ -10226,7 +9806,6 @@
     else
     {
         csrRoamGetBssStartParms(pMac, pProfile, &pSession->bssParams);
-
         //Use the first SSID
         if(pProfile->SSIDs.numOfSSIDs)
         {
@@ -10248,7 +9827,6 @@
         }
     }
     Channel = pSession->bssParams.operationChn;
-
     //Set operating channel in pProfile which will be used 
     //in csrRoamSetBssConfigCfg() to determine channel bonding
     //mode and will be configured in CFG later 
@@ -10262,6 +9840,20 @@
     {
   
         csrRoamDetermineMaxRateForAdHoc( pMac, &pSession->bssParams.operationalRateSet );
+        if (CSR_IS_INFRA_AP(pProfile))
+        {
+            if(CSR_IS_CHANNEL_24GHZ(Channel))
+            {
+                cbMode = pMac->roam.configParam.channelBondingMode24GHz;
+            }
+            else
+            {
+                cbMode = pMac->roam.configParam.channelBondingMode5GHz;
+            }
+            smsLog(pMac, LOG1, "##softap cbMode %d\n", cbMode);
+            pBssConfig->cbMode = cbMode;
+            pSession->bssParams.cbMode = cbMode;
+        }
 
         if( CSR_IS_START_IBSS( pProfile ) )
         {
@@ -10286,7 +9878,6 @@
             }
             else {
                 tANI_U32 ChannelBondingMode;
-
                 if(CSR_IS_CHANNEL_24GHZ(Channel))
                 {
                     ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
@@ -10295,38 +9886,34 @@
                 {
                     ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
                 }
-
                 //now we have a valid channel
                 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
                 {
                     //let's pick a secondard channel
                     SecondChn = csrRoamGetSecondaryChannel(pMac, Channel, cbChoice);
-
                     if(SecondChn > Channel)
                     {
-                        cbMode = eANI_CB_SECONDARY_UP;
+                        cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
                     }
                     else if(SecondChn && SecondChn < Channel)
                     {
-                        cbMode =eANI_CB_SECONDARY_DOWN;
+                        cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
                     }
                     else
                     {
-                        cbMode = eANI_CB_SECONDARY_NONE;
+                        cbMode = PHY_SINGLE_CHANNEL_CENTERED;
                     }
                     pSession->bssParams.cbMode = cbMode;
                 }
                 else
                 {
-                    pSession->bssParams.cbMode = eANI_CB_SECONDARY_NONE;
+                    pSession->bssParams.cbMode = PHY_SINGLE_CHANNEL_CENTERED;
                 }
             }
         }
     }
 }
 
-
-
 static eHalStatus csrRoamStartIbss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, 
                                     tANI_BOOLEAN *pfSameIbss )
 {
@@ -10367,7 +9954,7 @@
                 //save dotMode
                 pMac->roam.roamSession[sessionId].bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
                 //Prepare some more parameters for this IBSS
-                csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, NULL);
+                csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
                 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
             }
             
@@ -10382,12 +9969,10 @@
     return( status );
 }
 
-
 static void csrRoamUpdateConnectedProfileFromNewBss( tpAniSirGlobal pMac, tANI_U32 sessionId, 
                                                      tSirSmeNewBssInfo *pNewBss )
 {
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if( pNewBss )
     {
         // Set the operating channel.
@@ -10396,18 +9981,15 @@
         palCopyMemory( pMac->hHdd, &pSession->connectedProfile.bssid, 
                       &(pNewBss->bssId), sizeof( tCsrBssid ) );    
     }
-
     return;
 }
 
-
 #ifdef FEATURE_WLAN_WAPI
 eHalStatus csrRoamSetBKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId, tBkidCacheInfo *pBKIDCache,
                                  tANI_U32 numItems )
 {
    eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
    tCsrRoamSession *pSession;
-
    if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
    {
        smsLog(pMac, LOGE, FL("  Invalid session ID\n"));
@@ -10426,22 +10008,18 @@
                            sizeof(tBkidCacheInfo) * numItems );
        }
    }
-
    return (status);
 }
-
 eHalStatus csrRoamGetBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum,
                                 tBkidCacheInfo *pBkidCache)
 {
    eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
    tCsrRoamSession *pSession;
-
    if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
    {
        smsLog(pMac, LOGE, FL("  Invalid session ID\n"));
        return status;
    }
-
    pSession = CSR_GET_SESSION( pMac, sessionId );
    if(pNum && pBkidCache)
    {
@@ -10464,24 +10042,18 @@
            status = eHAL_STATUS_SUCCESS;
        }
    }
-
    return (status);
-
 }
-
 tANI_U32 csrRoamGetNumBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
    return (pMac->roam.roamSession[sessionId].NumBkidCache);
-
 }
 #endif /* FEATURE_WLAN_WAPI */
-
 eHalStatus csrRoamSetPMKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId,
                                  tPmkidCacheInfo *pPMKIDCache, tANI_U32 numItems )
 {
     eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     smsLog(pMac, LOGW, "csrRoamSetPMKIDCache called, numItems = %d\n", numItems);
     if(numItems <= CSR_MAX_PMKID_ALLOWED)
     {
@@ -10500,7 +10072,6 @@
             WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
         }
 #endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
-
         status = eHAL_STATUS_SUCCESS;
         //numItems may be 0 to clear the cache
         pSession->NumPmkidCache = (tANI_U16)numItems;
@@ -10510,22 +10081,18 @@
                             sizeof(tPmkidCacheInfo) * numItems );
         }
     }
-
     return (status);
 }
 
-
 tANI_U32 csrRoamGetNumPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     return (pMac->roam.roamSession[sessionId].NumPmkidCache);
 }
 
-
 eHalStatus csrRoamGetPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum, tPmkidCacheInfo *pPmkidCache)
 {
     eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if(pNum && pPmkidCache)
     {
         if(pSession->NumPmkidCache == 0)
@@ -10547,17 +10114,14 @@
             status = eHAL_STATUS_SUCCESS;
         }
     }
-
     return (status);
 }
 
-
 eHalStatus csrRoamGetWpaRsnReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
 {
     eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
     tANI_U32 len;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if(pLen)
     {
         len = *pLen;
@@ -10570,17 +10134,14 @@
             }
         }
     }
-
     return (status);
 }
 
-
 eHalStatus csrRoamGetWpaRsnRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
 {
     eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
     tANI_U32 len;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if(pLen)
     {
         len = *pLen;
@@ -10593,10 +10154,8 @@
             }
         }
     }
-
     return (status);
 }
-
 #ifdef FEATURE_WLAN_WAPI
 eHalStatus csrRoamGetWapiReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
 {
@@ -10615,16 +10174,13 @@
             }
         }
     }
-
     return (status);
 }
-
 eHalStatus csrRoamGetWapiRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
 {
     eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
     tANI_U32 len;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if(pLen)
     {
         len = *pLen;
@@ -10637,26 +10193,21 @@
             }
         }
     }
-
     return (status);
 }
 #endif /* FEATURE_WLAN_WAPI */
-
 eRoamCmdStatus csrGetRoamCompleteStatus(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     eRoamCmdStatus retStatus = eCSR_ROAM_CONNECT_COMPLETION;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     if(CSR_IS_ROAMING(pSession))
     {
         retStatus = eCSR_ROAM_ROAMING_COMPLETION;
         pSession->fRoaming = eANI_BOOLEAN_FALSE;
     }
-
     return (retStatus);
 }
 
-
 //This function remove the connected BSS from te cached scan result
 eHalStatus csrRoamRemoveConnectedBssFromScanCache(tpAniSirGlobal pMac,
                                                   tCsrRoamConnectedProfile *pConnProfile)
@@ -10667,7 +10218,6 @@
     tCsrScanResult *pResult;
         tDot11fBeaconIEs *pIes;
     tANI_BOOLEAN fMatch;
-
     if(!(csrIsMacAddressZero(pMac, &pConnProfile->bssid) ||
             csrIsMacAddressBroadcast(pMac, &pConnProfile->bssid)))
     {
@@ -10701,7 +10251,6 @@
             pScanFilter->bWPSAssociation = eANI_BOOLEAN_FALSE;
             pScanFilter->countryCode[0] = 0;
             pScanFilter->phyMode = eCSR_DOT11_MODE_TAURUS;
-
             csrLLLock(&pMac->scan.scanResultList);
             pEntry = csrLLPeekHead( &pMac->scan.scanResultList, LL_ACCESS_NOLOCK );
             while( pEntry ) 
@@ -10739,15 +10288,11 @@
     return (status);
 }
 
-
-
 //BT-AMP
-
 eHalStatus csrIsBTAMPAllowed( tpAniSirGlobal pMac, tANI_U32 chnId )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tANI_U32 sessionId;
-
     for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
     {
         if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
@@ -10772,17 +10317,14 @@
             }
         }
     }
-
     return ( status );
 }
 
-
 static eHalStatus csrRoamStartWds( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     tBssConfigParam bssConfig;
-
     if ( csrIsConnStateIbss( pMac, sessionId ) ) 
     { 
         status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
@@ -10818,9 +10360,8 @@
                 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
                 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, pProfile);
             }
-
             //Prepare some more parameters for this WDS
-            csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, NULL);
+            csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
             status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
         }
     }
@@ -10828,10 +10369,8 @@
     return( status );
 }
 
-
 ////////////////////Mail box
 
-
 //pBuf is caller allocated memory point to &(tSirSmeJoinReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
 //or &(tSirSmeReassocReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
 static void csrPrepareJoinReassocReqBuffer( tpAniSirGlobal pMac, 
@@ -10844,16 +10383,13 @@
     tANI_BOOLEAN found = FALSE;
     tANI_U32 size = 0;
         tANI_U16 i;
-
     // plug in neighborhood occupancy info (i.e. BSSes on primary or secondary channels)
     *pBuf++ = (tANI_U8)FALSE;  //tAniTitanCBNeighborInfo->cbBssFoundPri
     *pBuf++ = (tANI_U8)FALSE;  //tAniTitanCBNeighborInfo->cbBssFoundSecDown
     *pBuf++ = (tANI_U8)FALSE;  //tAniTitanCBNeighborInfo->cbBssFoundSecUp
-
     // 802.11h
     //We can do this because it is in HOST CPU order for now.
     pAP_capabilityInfo = (tSirMacCapabilityInfo *)&pBssDescription->capabilityInfo;
-
         //tell the target AP my 11H capability only if both AP and STA support 11H and the channel being used is 11a
         if ( csrIs11hSupported( pMac ) && pAP_capabilityInfo->spectrumMgt && eSIR_11A_NW_TYPE == pBssDescription->nwType )   
         {  
@@ -10867,13 +10403,11 @@
     pBuf += sizeof(tAniBool);
     *pBuf++ = MIN_STA_PWR_CAP_DBM; // it is for pMsg->powerCap.minTxPower = 0;
         found = csrSearchChannelListForTxPower(pMac, pBssDescription, &channelGroup);
-
     // This is required for 11k test VoWiFi Ent: Test 2.
     // We need the power capabilities for Assoc Req. 
     // This macro is provided by the halPhyCfg.h. We pick our
     // max and min capability by the halPhy provided macros
     *pBuf++ = MAX_STA_PWR_CAP_DBM;
-
     size = sizeof(pMac->roam.validChannelList);
     if(HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &size)))
     { 
@@ -10889,7 +10423,6 @@
         smsLog(pMac, LOGE, FL("can not find any valid channel\n"));
         *pBuf++ = 0;  //tSirSupChnl->numChnl
     }                                                                                                                     
-
     //Check whether it is ok to enter UAPSD
 #ifndef WLAN_MDM_CODE_REDUCTION_OPT
     if( btcIsReadyForUapsd(pMac) )
@@ -10905,15 +10438,12 @@
     }
 #endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
   
-
     // move the entire BssDescription into the join request.
     palCopyMemory( pMac->hHdd, pBuf, pBssDescription, 
                     pBssDescription->length + sizeof( pBssDescription->length ) );
-
     pBuf += pBssDescription->length + sizeof( pBssDescription->length );   // update to new location
 }
 
-
 /* 
   * The communication between HDD and LIM is thru mailbox (MB).
   * Both sides will access the data structure "tSirSmeJoinReq".
@@ -10934,7 +10464,6 @@
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     tANI_U32 dwTmp;
     tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN];    //RSN MAX is bigger than WPA MAX
-
     do {
         pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
         pSession->joinFailStatusCode.reasonCode = 0;
@@ -10949,23 +10478,19 @@
         msgLen = sizeof( tSirSmeJoinReq ) - sizeof( *pBssDescription ) + 
             pBssDescription->length + sizeof( pBssDescription->length ) +
             sizeof( tCsrWpaIe ) + sizeof( tCsrWpaAuthIe ) + sizeof( tANI_U16 ); // add in the size of the WPA IE that we may build.
-
         status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
         if ( !HAL_STATUS_SUCCESS(status) ) break;
         palZeroMemory(pMac->hHdd, pMsg, msgLen);
         pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_JOIN_REQ);
         pMsg->length = pal_cpu_to_be16(msgLen);
         pBuf = &pMsg->sessionId;
-
         // sessionId
         *pBuf = (tANI_U8)sessionId;
         pBuf++;
-
         // transactionId
         *pBuf = 0;
         *( pBuf + 1 ) = 0;
         pBuf += sizeof(tANI_U16);
-
         // ssId
         if( pIes->SSID.present && pIes->SSID.num_ssid )
         {
@@ -10980,7 +10505,6 @@
             *pBuf = 0;
             pBuf++;
         }
-
         // selfMacAddr
         palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
         pBuf += sizeof(tSirMacAddr);
@@ -10992,23 +10516,24 @@
         // dot11mode
         *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
         pBuf++;
-
         //Persona
         *pBuf = (tANI_U8)pProfile->csrPersona;
         pBuf++;
+        //CBMode
+        *pBuf = (tANI_U8)pSession->bssParams.cbMode;
+        pBuf++;
 
         VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
-                  FL("CSR PERSONA=%d"), pProfile->csrPersona);
-        
+                  FL("CSR PERSONA=%d CSR CbMode %d"), pProfile->csrPersona, pSession->bssParams.cbMode);
+
         // uapsdPerAcBitmask
         *pBuf = pProfile->uapsd_mask;
         pBuf++;
 
-
+    
     
 #if (WNI_POLARIS_FW_PACKAGE == ADVANCED)        
 #endif /*(WNI_POLARIS_FW_PACKAGE == ADVANCED)*/
-
         status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode, pBssDescription, pIes, &OpRateSet, &ExRateSet);
         if (HAL_STATUS_SUCCESS(status) ) 
         {
@@ -11030,7 +10555,6 @@
             *pBuf++ = 0;
             *pBuf++ = 0;
         }
-
         // rsnIE
         if ( csrIsProfileWpa( pProfile ) )
         {
@@ -11052,7 +10576,6 @@
                     (tCsrWapiIe *)( wpaRsnIE ) );
         }
 #endif /* FEATURE_WLAN_WAPI */
-
         else
         {
             ieLen = 0;
@@ -11130,7 +10653,6 @@
             *(pBuf + 1) = 0;
             pBuf += 2;
         }
-
 #ifdef FEATURE_WLAN_CCX
         // Never include the cckmIE in an Join Request
         //length is two bytes
@@ -11138,12 +10660,10 @@
         *(pBuf + 1) = 0;
         pBuf += 2;
 #endif 
-
         // addIEScan
         if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
         {
             ieLen = pProfile->nAddIEScanLength;
-
             if(ieLen > pSession->nAddIEScanLength)
             {
                 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
@@ -11175,12 +10695,10 @@
             *(pBuf + 1) = 0;
             pBuf += 2;
         }
-
         // addIEAssoc
         if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
         {
             ieLen = pProfile->nAddIEAssocLength;
-
             if(ieLen > pSession->nAddIEAssocLength)
             {
                 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
@@ -11212,15 +10730,12 @@
             *(pBuf + 1) = 0;
             pBuf += 2;
         }
-
         dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
         palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
         pBuf += sizeof(tANI_U32);        
-
         dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
         palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
         pBuf += sizeof(tANI_U32);        
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
         if (csrIsProfile11r( pProfile ) )
         {
@@ -11237,7 +10752,6 @@
             pBuf += sizeof(tAniBool);        
         }
 #endif
-
 #ifdef FEATURE_WLAN_CCX
         /* A profile can not be both CCX and 11R. But an 802.11R AP
          * may be advertising support for CCX as well. So if we are 
@@ -11276,7 +10790,6 @@
             pBuf += sizeof(tCCXTspecInfo);
         }
 #endif
-
 #if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
         // Fill in isFastTransitionEnabled
         if (pMac->roam.configParam.isFastTransitionEnabled
@@ -11296,7 +10809,6 @@
             pBuf += sizeof(tAniBool);        
         }
 #endif
-
 #ifdef FEATURE_WLAN_LFR
         if(csrRoamIsFastRoamEnabled(pMac))
         {
@@ -11315,7 +10827,6 @@
         //BssDesc
         csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf, 
                 (tANI_U8)pProfile->uapsd_mask);
-
         status = palSendMBMessage(pMac->hHdd, pMsg );    
         if(!HAL_STATUS_SUCCESS(status)) 
         {
@@ -11332,7 +10843,6 @@
     return( status );
 }
 
-
 eHalStatus csrSendSmeReassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription, 
                                     tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile )
 {
@@ -11346,14 +10856,12 @@
     tSirMacRateSet ExRateSet;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN];    //RSN MAX is bigger than WPA MAX
-
     /* To satisfy klockworks */
     if (pBssDescription == NULL)
     {
         smsLog(pMac, LOGE, FL(" pBssDescription is NULL\n"));
         return eHAL_STATUS_FAILURE;
     }
-
     do {
         // There are a number of variable length fields to consider.  First, the tSirSmeJoinReq
         // includes a single bssDescription.   bssDescription includes a single tANI_U32 for the 
@@ -11400,19 +10908,20 @@
         // dot11mode
         *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
         pBuf++;
-
         //Persona
         *pBuf = (tANI_U8)pProfile->csrPersona;
         pBuf++;
+        //CBMode
+        *pBuf = (tANI_U8)pSession->bssParams.cbMode;
+        pBuf++;
 
-        VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL, FL("CSR PERSONA=%d\n"), pProfile->csrPersona);
-        
+        VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+            FL("CSR PERSONA=%d CSR CBMode=%u\n"), pProfile->csrPersona, pSession->bssParams.cbMode);
+
         // uapsdPerAcBitmask
         *pBuf = pProfile->uapsd_mask;
         pBuf++;
 
-
-
         status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode, 
                         pBssDescription, pIes, &OpRateSet, &ExRateSet);
         if (HAL_STATUS_SUCCESS(status) ) 
@@ -11439,7 +10948,6 @@
             *pBuf++ = 0;
             *pBuf++ = 0;
         }
-
                 // rsnIE
         if ( csrIsProfileWpa( pProfile ) )
                 {
@@ -11473,7 +10981,6 @@
                  smsLog(pMac, LOGE, FL(" WPA RSN IE length :%d is more than DOT11F_IE_RSN_MAX_LEN, resetting to %d\n"), ieLen, DOT11F_IE_RSN_MAX_LEN);
                  ieLen = DOT11F_IE_RSN_MAX_LEN;
              }
-
             //Check whether we need to allocate more memory
             if(ieLen > pSession->nWpaRsnReqIeLength)
             {
@@ -11506,7 +11013,6 @@
             *(pBuf + 1) = 0;
             pBuf += 2;
                 }
-
 #ifdef FEATURE_WLAN_CCX
         // cckmIE
         if( csrIsProfileCCX( pProfile ) )
@@ -11543,12 +11049,10 @@
             pBuf += 2;
         }
 #endif /* FEATURE_WLAN_CCX */
-
         // addIEScan
         if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
         {
             ieLen = pProfile->nAddIEScanLength;
-
             if(ieLen > pSession->nAddIEScanLength)
             {
                 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
@@ -11580,12 +11084,10 @@
             *(pBuf + 1) = 0;
             pBuf += 2;
         }
-
         // addIEAssoc
         if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
         {
             ieLen = pProfile->nAddIEAssocLength;
-
             if(ieLen > pSession->nAddIEAssocLength)
             {
                 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
@@ -11617,7 +11119,6 @@
             *(pBuf + 1) = 0;
             pBuf += 2;
         }
-
         //Unmask any AC in reassoc that is ACM-set
         uapsd_mask = (v_U8_t)pProfile->uapsd_mask;
         if( uapsd_mask && ( NULL != pBssDescription ) )
@@ -11642,13 +11143,11 @@
         dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
         palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
         pBuf += sizeof(tANI_U32);        
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
         // is11Rconnection;
         dwTmp = csrIsProfile11r( pProfile )?  pal_cpu_to_be32(TRUE) : 0; 
         palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
         pBuf += sizeof(tAniBool);        
-
 #ifdef FEATURE_WLAN_CCX
         //isCCXconnection;
         //CCKM profile, ccxversion ie present, not 11r and ini file has CCX enabled
@@ -11666,7 +11165,6 @@
         pBuf += sizeof(tAniBool);        
 #endif // FEATURE_WLAN_CCX
 #endif // WLAN_FEATURE_VOWIFI_11R
-
 #ifdef FEATURE_WLAN_CCX
         if ((csrIsProfileCCX(pProfile) || 
              ((pIes->CCXVersion.present) 
@@ -11679,13 +11177,11 @@
             && (pMac->roam.configParam.isCcxIniFeatureEnabled))
         {
            tCCXTspecInfo ccxTspec;
-
            // CCX Tspec information
            palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
            ccxTspec.numTspecs = sme_QosCCxRetrieveTspecInfo(pMac, sessionId, (tTspecInfo *) &ccxTspec.tspec[0]);
            *pBuf = ccxTspec.numTspecs;
            pBuf += sizeof(tANI_U8);
-
            // Copy the TSPEC information only if present
            if (ccxTspec.numTspecs) {
                palCopyMemory(pMac->hHdd, pBuf, (void*)&ccxTspec.tspec[0], (ccxTspec.numTspecs*sizeof(tTspecInfo)));
@@ -11704,7 +11200,6 @@
             }
         }
 #endif // FEATURE_WLAN_CCX
-
 #if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
         // Fill in isFastTransitionEnabled
         if (pMac->roam.configParam.isFastTransitionEnabled
@@ -11724,7 +11219,6 @@
             pBuf += sizeof(tAniBool);        
         }
 #endif
-
 #ifdef FEATURE_WLAN_LFR
         if(csrRoamIsFastRoamEnabled(pMac))
         {
@@ -11748,12 +11242,9 @@
 #endif
         status = palSendMBMessage( pMac->hHdd, pMsg );
     } while( 0 );
-
     return( status );
-
 }
 
-
 //
 eHalStatus csrSendMBDisassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
 {
@@ -11766,14 +11257,12 @@
     if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
         return eHAL_STATUS_FAILURE;
 #endif
-
     do {
         status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocReq ));
         if ( !HAL_STATUS_SUCCESS(status) ) break;
         palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocReq ));
         pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_REQ);
         pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocReq ));
-
         pBuf = &pMsg->sessionId;
         // sessionId
         *pBuf++ = (tANI_U8)sessionId;
@@ -11790,7 +11279,6 @@
             // Set the bssid address before sending the message to LIM
             status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( tSirMacAddr ) );
             pBuf = pBuf + sizeof ( tSirMacAddr );
-
             // Set the peer MAC address before sending the message to LIM
             status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) ); //perMacAddr is passed as bssId for softAP
             pBuf = pBuf + sizeof ( tSirMacAddr );
@@ -11801,7 +11289,6 @@
             // Set the peer MAC address before sending the message to LIM
             status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) );
             pBuf = pBuf + sizeof ( tSirMacAddr );
-
             status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->bssId ) );
             pBuf = pBuf + sizeof ( tSirMacAddr );
 #ifdef WLAN_SOFTAP_FEATURE
@@ -11812,7 +11299,6 @@
             palFreeMemory(pMac->hHdd, pMsg);
             break;
         }
-
         // reasonCode
         wTmp = pal_cpu_to_be16(reasonCode);
         status = palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
@@ -11822,7 +11308,6 @@
             break;
         }
         pBuf += sizeof(tANI_U16);
-
         /* The state will be DISASSOC_HANDOFF only when we are doing handoff. 
                     Here we should not send the disassoc over the air to the AP */
         if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO(pMac, sessionId)
@@ -11835,19 +11320,15 @@
         }
         pBuf += sizeof(tANI_U8);
         status = palSendMBMessage( pMac->hHdd, pMsg );
-
     } while( 0 );
-
     return( status );
 }
-
 #ifdef WLAN_SOFTAP_FEATURE
 eHalStatus csrSendMBTkipCounterMeasuresReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN bEnable, tSirMacAddr bssId )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tSirSmeTkipCntrMeasReq *pMsg;
     tANI_U8 *pBuf;
-
     do
     {
         status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
@@ -11855,7 +11336,6 @@
         palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
         pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_TKIP_CNTR_MEAS_REQ);
         pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeTkipCntrMeasReq ));
-
         pBuf = &pMsg->sessionId;
         // sessionId
         *pBuf++ = (tANI_U8)sessionId;
@@ -11873,14 +11353,10 @@
             palFreeMemory(pMac->hHdd, pMsg);
             break;
         }
-
         status = palSendMBMessage( pMac->hHdd, pMsg );
-
     } while( 0 );
-
     return( status );
 }
-
 eHalStatus
 csrSendMBGetAssociatedStasReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId,
                                     VOS_MODULE_ID modId, tSirMacAddr bssId,
@@ -11891,49 +11367,38 @@
     tSirSmeGetAssocSTAsReq *pMsg;
     tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
     tANI_U32 dwTmp;
-
     do
     {
         status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
         if (!HAL_STATUS_SUCCESS(status)) break;
         palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
         pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_ASSOC_STAS_REQ);
-
         pBuf = (tANI_U8 *)&pMsg->bssId;
         wTmpBuf = pBuf;
-
         // bssId
         palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
         pBuf += sizeof(tSirMacAddr);
-
         // modId 
         dwTmp = pal_cpu_to_be16((tANI_U16)modId);
         palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U16));
         pBuf += sizeof(tANI_U16);
-
         // pUsrContext
         dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
         palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
         pBuf += sizeof(tANI_U32);
-
         // pfnSapEventCallback
         dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
         palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
         pBuf += sizeof(tANI_U32);
-
         // pAssocStasBuf
         dwTmp = pal_cpu_to_be32((tANI_U32)pAssocStasBuf);
         palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
         pBuf += sizeof(tANI_U32);
-
         pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
-
         status = palSendMBMessage( pMac->hHdd, pMsg );
     } while( 0 );
-
     return( status );
         }
-
 eHalStatus
 csrSendMBGetWPSPBCSessions( tpAniSirGlobal pMac, tANI_U32 sessionId,
                             tSirMacAddr bssId, void *pUsrContext, void *pfnSapEventCallback,v_MACADDR_t pRemoveMac)
@@ -11942,45 +11407,34 @@
     tSirSmeGetWPSPBCSessionsReq *pMsg;
     tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
     tANI_U32 dwTmp;
-
     do
         {
         status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirSmeGetWPSPBCSessionsReq) );
         if (!HAL_STATUS_SUCCESS(status)) break;
         palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetWPSPBCSessionsReq ) );
         pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_WPSPBC_SESSION_REQ);
-
         pBuf = (tANI_U8 *)&pMsg->pUsrContext;
         wTmpBuf = pBuf;
-
         // pUsrContext
         dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
         palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
         pBuf += sizeof(tANI_U32);
-
         // pSapEventCallback
         dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
         palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
         pBuf += sizeof(tANI_U32);
-
         // bssId
         palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
         pBuf += sizeof(tSirMacAddr);
-
         // MAC Address of STA in WPS session
         palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pRemoveMac.bytes, sizeof(v_MACADDR_t));
         pBuf += sizeof(v_MACADDR_t);
-
         pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
-
         status = palSendMBMessage( pMac->hHdd, pMsg );
-
     } while( 0 );
-
     return( status );
 }
 #endif
-
 eHalStatus csrSendMBDeauthReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -11990,7 +11444,6 @@
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
         return eHAL_STATUS_FAILURE;
-
     do {
         status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthReq ));
         if ( !HAL_STATUS_SUCCESS(status) ) break;
@@ -12005,7 +11458,6 @@
         *pBuf = 0;
         *(pBuf + 1 ) = 0;
         pBuf += sizeof(tANI_U16);
-
         if ((pSession->pCurRoamProfile != NULL)  && (
 #ifdef WLAN_SOFTAP_FEATURE
              (CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) || 
@@ -12020,7 +11472,6 @@
             // Set the BSSID before sending the message to LIM
             status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
             pBuf =  pBuf + sizeof(tSirMacAddr);
-
         }
         if(!HAL_STATUS_SUCCESS(status))
         {
@@ -12043,18 +11494,14 @@
             break;
         }
         status = palSendMBMessage( pMac->hHdd, pMsg );
-
     } while( 0 );
-
     return( status );
 }
 
-
 eHalStatus csrSendMBDisassocCnfMsg( tpAniSirGlobal pMac, tpSirSmeDisassocInd pDisassocInd )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tSirSmeDisassocCnf *pMsg;
-
     do {
         status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocCnf ));
         if ( !HAL_STATUS_SUCCESS(status) ) break;
@@ -12076,20 +11523,15 @@
             break;
         }
 //To test reconn ends
-
         status = palSendMBMessage( pMac->hHdd, pMsg );
-
     } while( 0 );
-
     return( status );
 }
 
-
 eHalStatus csrSendMBDeauthCnfMsg( tpAniSirGlobal pMac, tpSirSmeDeauthInd pDeauthInd )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tSirSmeDeauthCnf *pMsg;
-
     do {
         status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthCnf ));
         if ( !HAL_STATUS_SUCCESS(status) ) break;
@@ -12109,14 +11551,10 @@
             palFreeMemory(pMac->hHdd, pMsg);
             break;
         }
-
         status = palSendMBMessage( pMac->hHdd, pMsg );
-
     } while( 0 );
-
     return( status );
 }
-
 eHalStatus csrSendAssocCnfMsg( tpAniSirGlobal pMac, tpSirSmeAssocInd pAssocInd, eHalStatus Halstatus )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -12124,14 +11562,12 @@
     tANI_U8 *pBuf;
     tSirResultCodes statusCode;
     tANI_U16 wTmp;
-
     do {
         status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocCnf ));
         if ( !HAL_STATUS_SUCCESS(status) ) break;
         palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocCnf ));
                 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ASSOC_CNF);
                 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocCnf ));
-
         pBuf = (tANI_U8 *)&pMsg->statusCode;
         if(HAL_STATUS_SUCCESS(Halstatus))
             statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
@@ -12154,19 +11590,15 @@
         pBuf += sizeof (tSirMacAddr);
         // alternateChannelId
         *pBuf = 11;
-
         status = palSendMBMessage( pMac->hHdd, pMsg );
         if(!HAL_STATUS_SUCCESS(status))
         {
             //pMsg is freed by palSendMBMessage
             break;
         }
-
     } while( 0 );
-
     return( status );
 }
-
 #ifdef WLAN_SOFTAP_FEATURE
 eHalStatus csrSendAssocIndToUpperLayerCnfMsg(   tpAniSirGlobal pMac, 
                                                 tpSirSmeAssocInd pAssocInd, 
@@ -12179,11 +11611,11 @@
     tANI_U8 *pBuf;
     tSirResultCodes statusCode;
     tANI_U16 wTmp;
-
     do {
         status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
         if ( !HAL_STATUS_SUCCESS(status) ) break;
         palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
+
         pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPPER_LAYER_ASSOC_CNF);
         pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocIndToUpperLayerCnf ));
 
@@ -12212,37 +11644,28 @@
         // alternateChannelId
         *pBuf = 11;
         pBuf += sizeof (tANI_U8);
-
         // Instead of copying roam Info, we just copy only WmmEnabled , RsnIE information
         //Wmm
         *pBuf = pAssocInd->wmmEnabledSta;
         pBuf += sizeof (tANI_U8);
-
         //RSN IE
         status = palCopyMemory(pMac->hHdd, (tSirRSNie *)pBuf, &pAssocInd->rsnIE, sizeof(tSirRSNie));
         pBuf += sizeof (tSirRSNie);
-
         //Additional IE
         status = palCopyMemory(pMac->hHdd, (void *)pBuf, &pAssocInd->addIE, sizeof(tSirAddie));
         pBuf += sizeof (tSirAddie);
-
         //reassocReq
         *pBuf = pAssocInd->reassocReq;
         pBuf += sizeof (tANI_U8);
-
         msgQ.type = eWNI_SME_UPPER_LAYER_ASSOC_CNF;
         msgQ.bodyptr = pMsg;
         msgQ.bodyval = 0;
-
         SysProcessMmhMsg(pMac, &msgQ);
-
     } while( 0 );
-
     return( status );
 }
 #endif
 
-
 eHalStatus csrSendMBSetContextReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId ,
             tSirMacAddr peerMacAddr, tANI_U8 numKeys, tAniEdType edType, 
             tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
@@ -12257,11 +11680,8 @@
     tANI_U8 *pBuf;
     tANI_U8 *p;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     do {
-
         if( ( 1 != numKeys ) && ( 0 != numKeys ) ) break;
-
         // all of these fields appear in every SET_CONTEXT message.  Below we'll add in the size for each 
         // key set. Since we only support upto one key, we always allocate memory for 1 key
         msgLen  = sizeof( tANI_U16) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) +
@@ -12274,7 +11694,6 @@
         palZeroMemory(pMac->hHdd, pMsg, msgLen);
                 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SETCONTEXT_REQ);
                 pMsg->length = pal_cpu_to_be16(msgLen);
-
         //sessionId
         pBuf = &pMsg->sessionId;
         *pBuf = (tANI_U8)sessionId;
@@ -12296,31 +11715,25 @@
         pBuf += sizeof(tSirMacAddr);
 
         p = pBuf;
-
                 // Set the pMsg->keyMaterial.length field (this length is defined as all data that follows the edType field
                 // in the tSirKeyMaterial keyMaterial; field).
                 //
                 // !!NOTE:  This keyMaterial.length contains the length of a MAX size key, though the keyLength can be 
                 // shorter than this max size.  Is LIM interpreting this ok ?
                 p = pal_set_U16( p, pal_cpu_to_be16((tANI_U16)( sizeof( pMsg->keyMaterial.numKeys ) + ( numKeys * sizeof( pMsg->keyMaterial.key ) ) )) );
-
                 // set pMsg->keyMaterial.edType
         tmpEdType = (tAniEdType)pal_cpu_to_be32(edType);
         palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpEdType, sizeof(tAniEdType) );
         p += sizeof( pMsg->keyMaterial.edType );
-
         // set the pMsg->keyMaterial.numKeys field
         *p = numKeys;
         p += sizeof( pMsg->keyMaterial.numKeys );   
-
         // set pSirKey->keyId = keyId;
         *p = keyId;
         p += sizeof( pMsg->keyMaterial.key[ 0 ].keyId );
-
         // set pSirKey->unicast = (tANI_U8)fUnicast;
         *p = (tANI_U8)fUnicast;
         p += sizeof( pMsg->keyMaterial.key[ 0 ].unicast );
-
                 // set pSirKey->keyDirection = aniKeyDirection;
         tmpDirection = (tAniKeyDirection)pal_cpu_to_be32(aniKeyDirection);
         palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpDirection, sizeof(tAniKeyDirection) );
@@ -12328,14 +11741,11 @@
         //    pSirKey->keyRsc = ;;
         palCopyMemory( pMac->hHdd, p, pKeyRsc, CSR_MAX_RSC_LEN );
         p += sizeof( pMsg->keyMaterial.key[ 0 ].keyRsc );
-
                 // set pSirKey->paeRole
                 *p = paeRole;   // 0 is Supplicant
                 p++;
-
                 // set pSirKey->keyLength = keyLength;
                 p = pal_set_U16( p, pal_cpu_to_be16(keyLength) );
-
         if ( keyLength && pKey ) 
         {   
             palCopyMemory( pMac->hHdd, p, pKey, keyLength ); 
@@ -12347,16 +11757,11 @@
                 pKey[9], pKey[10], pKey[11], pKey[12], pKey[13], pKey[14], pKey[15]);
             }
         }
-
         status = palSendMBMessage(pMac->hHdd, pMsg);
-
     } while( 0 );
-
     return( status );
 }
 
-
-
 eHalStatus csrSendMBStartBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamBssType bssType, 
                                     tCsrRoamStartBssParams *pParam, tSirBssDescription *pBssDesc )
 {
@@ -12367,11 +11772,10 @@
     tANI_U16 msgLen, wTmp;
     tANI_U32 dwTmp;
     tSirNwType nwType;
-    tAniCBSecondaryMode cbMode;
+    ePhyChanBondState cbMode;
 #ifdef WLAN_SOFTAP_FEATURE
     tANI_U32 authType;
 #endif
-
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     do {
         pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
@@ -12379,14 +11783,10 @@
         msgLen = sizeof(tSirSmeStartBssReq);
         status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
         if ( !HAL_STATUS_SUCCESS(status) ) break;
-
         palZeroMemory(pMac->hHdd, pMsg, msgLen);
         pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_START_BSS_REQ);
-
         pBuf = &pMsg->sessionId;
-
         wTmpBuf = pBuf;
-
         //sessionId
         *pBuf = (tANI_U8)sessionId;
         pBuf++;
@@ -12394,7 +11794,6 @@
         *pBuf = 0;
         *(pBuf + 1) = 0;
         pBuf += sizeof(tANI_U16);
-
         // bssid 
         palCopyMemory( pMac->hHdd, pBuf, pParam->bssid, sizeof(tSirMacAddr) );
         pBuf += sizeof(tSirMacAddr);
@@ -12416,6 +11815,22 @@
         {
             wTmp = pal_cpu_to_be16( WNI_CFG_BEACON_INTERVAL_STADEF );
         }
+        if(csrIsconcurrentsessionValid (pMac, sessionId, 
+                                   pParam->bssPersona) 
+                                   == eHAL_STATUS_SUCCESS )
+        {    
+           csrValidateBeaconInterval(pMac, pParam->operationChn, &wTmp, sessionId,
+                                      pParam->bssPersona);
+           //Update the beacon Interval 
+           pParam->beaconInterval = wTmp;
+        }
+        else
+        {
+            smsLog( pMac,LOGE, FL("****Start BSS failed persona already exists***\n"));
+            status = eHAL_STATUS_FAILURE;
+            return status;
+        }
+
         palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) ); 
         pBuf += sizeof(tANI_U16);
         // dot11mode
@@ -12439,14 +11854,13 @@
             *pBuf = 0;
             pBuf++;        
         }
-
         // set the channel Id
         *pBuf = pParam->operationChn;
         pBuf++;
         //What should we really do for the cbmode.
-        cbMode = (tAniCBSecondaryMode)pal_cpu_to_be32(pParam->cbMode);
-        palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&cbMode, sizeof(tAniCBSecondaryMode) );
-        pBuf += sizeof(tAniCBSecondaryMode);
+        cbMode = (ePhyChanBondState)pal_cpu_to_be32(pParam->cbMode);
+        palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&cbMode, sizeof(ePhyChanBondState) );
+        pBuf += sizeof(ePhyChanBondState);
 
 #ifdef WLAN_SOFTAP_FEATURE
         // Set privacy
@@ -12456,47 +11870,39 @@
         //Set Uapsd 
         *pBuf = pParam->ApUapsdEnable;
         pBuf++;
-
         //Set SSID hidden
         *pBuf = pParam->ssidHidden;
         pBuf++;
-
         *pBuf = (tANI_U8)pParam->fwdWPSPBCProbeReq;
         pBuf++;
         
         //Ht protection Enable/Disable
         *pBuf = (tANI_U8)pParam->protEnabled;
         pBuf++;
-
         //Enable Beacons to Receive for OBSS protection Enable/Disable
         *pBuf = (tANI_U8)pParam->obssProtEnabled;
         pBuf++;
-
         //set cfg related to protection
         wTmp = pal_cpu_to_be16( pParam->ht_protection );
         palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) ); 
         pBuf += sizeof(tANI_U16);
-
         // Set Auth type
         authType = pal_cpu_to_be32(pParam->authType);
         palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&authType, sizeof(tANI_U32));
         pBuf += sizeof(tANI_U32);
-
         // Set DTIM
         dwTmp = pal_cpu_to_be32(pParam->dtimPeriod);
         palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
         pBuf += sizeof(tANI_U32);
-
         // Set wps_state
         *pBuf = pParam->wps_state;
         pBuf++;
-
 #endif
         //Persona
         *pBuf = (tANI_U8)pParam->bssPersona;
         pBuf++;
         
-
+        
         
         // set RSN IE 
         if( pParam->nRSNIELength > sizeof(pMsg->rsnIE.rsnIEdata) )
@@ -12517,10 +11923,8 @@
         nwType = (tSirNwType)pal_cpu_to_be32(pParam->sirNwType);
         palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&nwType, sizeof(tSirNwType) );
         pBuf += sizeof(tSirNwType);
-
         *pBuf = pParam->operationalRateSet.numRates; //tSirMacRateSet->numRates
         pBuf++;
-
         palCopyMemory( pMac->hHdd, pBuf, pParam->operationalRateSet.rate, pParam->operationalRateSet.numRates );
         pBuf += pParam->operationalRateSet.numRates ;
         *pBuf++ = pParam->extendedRateSet.numRates;
@@ -12529,18 +11933,14 @@
             palCopyMemory( pMac->hHdd, pBuf, pParam->extendedRateSet.rate, pParam->extendedRateSet.numRates );
             pBuf += pParam->extendedRateSet.numRates;
         }
-
         msgLen = (tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)); //msg_header + msg
         pMsg->length = pal_cpu_to_be16(msgLen);
         
         status = palSendMBMessage(pMac->hHdd, pMsg);
-
     } while( 0 );
-
   return( status );
 }
 
-
 eHalStatus csrSendMBStopBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId )
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
@@ -12548,7 +11948,6 @@
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     tANI_U8 *pBuf;
     tANI_U16 msgLen;
-
     do {
         status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
         if ( !HAL_STATUS_SUCCESS(status) ) break;
@@ -12577,7 +11976,6 @@
        pBuf += sizeof(tSirMacAddr);
        msgLen = sizeof(tANI_U16) + sizeof(tANI_U16) + 1 + sizeof(tANI_U16) + sizeof(tSirResultCodes) + sizeof(tSirMacAddr);
        pMsg->length =  pal_cpu_to_be16(msgLen);
-
        status =  palSendMBMessage( pMac->hHdd, pMsg );
 #if 0            
         status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
@@ -12602,20 +12000,16 @@
                 status = palSendMBMessage( pMac->hHdd, pMsg );
 #endif                
         } while( 0 );
-
     return( status );
 }
 
-
 eHalStatus csrReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, 
                       tCsrRoamModifyProfileFields *pModProfileFields,
                       tANI_U32 *pRoamId, v_BOOL_t fForce)
 {
-
    eHalStatus status = eHAL_STATUS_FAILURE;
    tANI_U32 roamId = 0;
    tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
    if((csrIsConnStateConnected(pMac, sessionId)) &&
       (fForce || (!palEqualMemory(pMac->hHdd, &pModProfileFields, 
                        &pSession->connectedProfile.modifyProfileFields, 
@@ -12627,34 +12021,27 @@
          *pRoamId = roamId;
       }
 
-
       status = csrRoamIssueReassoc(pMac, sessionId, NULL, pModProfileFields, 
                                    eCsrSmeIssuedReassocToSameAP, roamId, 
                                    eANI_BOOLEAN_FALSE);
-
    }
-
    return status;
 }
-
 static eHalStatus csrRoamSessionOpened(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tCsrRoamInfo roamInfo;
-
     palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
     status = csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
                             eCSR_ROAM_SESSION_OPENED, eCSR_ROAM_RESULT_NONE);
     return (status);
 }
-
 eHalStatus csrProcessAddStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
 {
    eHalStatus                         status = eHAL_STATUS_SUCCESS;
    tListElem                          *pEntry = NULL;
    tSmeCmd                            *pCommand = NULL;
    tSirSmeAddStaSelfRsp               *pRsp;
-
    do
    {
       if(pMsg == NULL)
@@ -12663,7 +12050,6 @@
          status = eHAL_STATUS_FAILURE;
          break;
       }
-
       pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
       if(pEntry)
       {
@@ -12673,9 +12059,7 @@
             pRsp = (tSirSmeAddStaSelfRsp*)pMsg;
             smsLog( pMac, LOG1, "Add Sta rsp status = %d\n", pRsp->status );
             //Nothing to be done. May be indicate the self sta addition success by calling session callback (TODO).
-
             csrRoamSessionOpened(pMac, pCommand->sessionId);
-
             //Remove this command out of the active list
             if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
             {
@@ -12700,33 +12084,23 @@
          break;
       }
    } while(0);
-
    return status;
-
 }
-
 eHalStatus csrSendMBAddSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
 {
    tSirSmeAddStaSelfReq *pMsg;
    tANI_U16 msgLen;
    eHalStatus status = eHAL_STATUS_FAILURE;
-
    do {
-
       msgLen  = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
          sizeof( tSirBssType )*/;
-
       status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
       if ( !HAL_STATUS_SUCCESS(status) ) break;
-
       palZeroMemory(pMac->hHdd, pMsg, msgLen);
-
       pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ADD_STA_SELF_REQ);
       pMsg->mesgLen = pal_cpu_to_be16(msgLen);
-
       // self station address
       palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
-
         smsLog( pMac, LOGE, FL("selfMac=%02x, %02x, %02x, %02x, %02x, %02x\n"),       
             pMsg->selfMacAddr[0],
             pMsg->selfMacAddr[1],
@@ -12735,17 +12109,13 @@
             pMsg->selfMacAddr[4],
             pMsg->selfMacAddr[5]);
       status = palSendMBMessage(pMac->hHdd, pMsg);
-
    } while( 0 );
-
    return( status );
 }
-
 eHalStatus csrIssueAddStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr sessionMacAddr)
 {
    eHalStatus status = eHAL_STATUS_SUCCESS;
    tSmeCmd *pCommand;
-
    pCommand = csrGetCommandBuffer(pMac);
    if(NULL == pCommand)
    {
@@ -12756,7 +12126,6 @@
       pCommand->command = eSmeCommandAddStaSession;
       pCommand->sessionId = (tANI_U8)sessionId;
       palCopyMemory( pMac->hHdd, pCommand->u.addStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
-
       status = csrQueueSmeCommand(pMac, pCommand, TRUE);
       if( !HAL_STATUS_SUCCESS( status ) )
       {
@@ -12764,23 +12133,19 @@
          smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
       }
    }
-
    return (status);
 }
-
 eHalStatus csrProcessAddStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
 {
    return csrSendMBAddSelfStaReqMsg( pMac, 
          pCommand->u.addStaSessionCmd.selfMacAddr );
 }
-
 eHalStatus csrRoamOpenSession( tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext,
                           tANI_U8 *pSelfMacAddr, tANI_U8 *pbSessionId )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tANI_U32 i;
     tCsrRoamSession *pSession;
-
     *pbSessionId = CSR_SESSION_ID_INVALID;
     for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
     {
@@ -12794,7 +12159,6 @@
             pSession->pContext = pContext;
             palCopyMemory( pMac->hHdd, &pSession->selfMacAddr, pSelfMacAddr, sizeof(tCsrBssid) );
             *pbSessionId = (tANI_U8)i;
-
             status = palTimerAlloc(pMac->hHdd, &pSession->hTimerRoaming, csrRoamRoamingTimerHandler, 
                                     &pSession->roamingTimerInfo);
             if(!HAL_STATUS_SUCCESS(status))
@@ -12813,7 +12177,6 @@
 #endif
             pSession->ibssJoinTimerInfo.pMac = pMac;
             pSession->ibssJoinTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
-
             status = palTimerAlloc(pMac->hHdd, &pSession->hTimerIbssJoining, csrRoamIbssJoinTimerHandler, 
                                     &pSession->ibssJoinTimerInfo);
             if(!HAL_STATUS_SUCCESS(status))
@@ -12830,17 +12193,14 @@
         //No session is available
         status = eHAL_STATUS_RESOURCES;
     }
-
     return ( status );
 }
-
 eHalStatus csrProcessDelStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
 {
    eHalStatus                         status = eHAL_STATUS_SUCCESS;
    tListElem                          *pEntry = NULL;
    tSmeCmd                            *pCommand = NULL;
    tSirSmeDelStaSelfRsp               *pRsp;
-
    do
    {
       if(pMsg == NULL)
@@ -12849,7 +12209,6 @@
          status = eHAL_STATUS_FAILURE;
          break;
       }
-
       pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
       if(pEntry)
       {
@@ -12857,13 +12216,10 @@
          if(eSmeCommandDelStaSession == pCommand->command)
          {
             tANI_U8 sessionId = pCommand->sessionId;
-
             pRsp = (tSirSmeDelStaSelfRsp*)pMsg;
             smsLog( pMac, LOG1, "Del Sta rsp status = %d\n", pRsp->status );
-
             //This session is done.
             csrCleanupSession(pMac, sessionId);
-
             if(pCommand->u.delStaSessionCmd.callback)
             {
                  
@@ -12908,40 +12264,28 @@
          break;
       }
    } while(0);
-
    return status;
-
 }
-
 eHalStatus csrSendMBDelSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
 {
    tSirSmeDelStaSelfReq *pMsg;
    tANI_U16 msgLen;
    eHalStatus status = eHAL_STATUS_FAILURE;
-
    do {
-
       msgLen  = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
          sizeof( tSirBssType )*/;
-
       status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
       if ( !HAL_STATUS_SUCCESS(status) ) break;
    
       palZeroMemory(pMac->hHdd, pMsg, msgLen);
-
       pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEL_STA_SELF_REQ);
       pMsg->mesgLen = pal_cpu_to_be16(msgLen);
-
       // self station address
       palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
-
       status = palSendMBMessage(pMac->hHdd, pMsg);
-
    } while( 0 );
-
    return( status );
 }
-
 eHalStatus csrIssueDelStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId,
                                        tSirMacAddr sessionMacAddr,
                                        csrRoamSessionCloseCallback callback,
@@ -12949,7 +12293,6 @@
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
    tSmeCmd *pCommand;
-
    pCommand = csrGetCommandBuffer(pMac);
    if(NULL == pCommand)
    {
@@ -12962,7 +12305,6 @@
       pCommand->u.delStaSessionCmd.callback = callback;
       pCommand->u.delStaSessionCmd.pContext = pContext;
       palCopyMemory( pMac->hHdd, pCommand->u.delStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
-
       status = csrQueueSmeCommand(pMac, pCommand, TRUE);
       if( !HAL_STATUS_SUCCESS( status ) )
       {
@@ -12970,16 +12312,13 @@
          smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
       }
    }
-
    return (status);
 }
-
 eHalStatus csrProcessDelStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
 {
    return csrSendMBDelSelfStaReqMsg( pMac, 
          pCommand->u.delStaSessionCmd.selfMacAddr );
 }
-
 static void purgeCsrSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     tDblLinkList *pList = &pMac->roam.roamCmdPendingList;
@@ -12993,7 +12332,6 @@
         smsLog(pMac, LOGE, FL(" failed to open list"));
         return;
     }
-
     csrLLLock(pList);
     pEntry = csrLLPeekHead(pList, LL_ACCESS_NOLOCK);
     while(pEntry != NULL)
@@ -13019,13 +12357,11 @@
     csrLLClose(&localList);
 }
 
-
 void csrCleanupSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
     {
         tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
         csrRoamStop(pMac, sessionId);
         csrFreeConnectBssDesc(pMac, sessionId);
         csrRoamFreeConnectProfile( pMac, &pSession->connectedProfile );
@@ -13041,14 +12377,12 @@
     }
 }
 
-
 eHalStatus csrRoamCloseSession( tpAniSirGlobal pMac, tANI_U32 sessionId,
                                 tANI_BOOLEAN fSync, 
                                 csrRoamSessionCloseCallback callback,
                                 void *pContext )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
-
     if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
     {
         tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
@@ -13068,15 +12402,12 @@
     {
         status = eHAL_STATUS_INVALID_PARAMETER;
     }
-
     return ( status );
 }
 
-
 static void csrInitSession( tpAniSirGlobal pMac, tANI_U32 sessionId )
 {
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     pSession->sessionActive = eANI_BOOLEAN_FALSE;
     pSession->sessionId = CSR_SESSION_ID_INVALID;
     pSession->callback = NULL;
@@ -13116,29 +12447,24 @@
     }
     pSession->nWapiRspIeLength = 0;
 #endif /* FEATURE_WLAN_WAPI */
-
     if(pSession->pAddIEScan)
     {
         palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
         pSession->pAddIEScan = NULL;
     }
     pSession->nAddIEScanLength = 0;
-
     if(pSession->pAddIEAssoc)
     {
         palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
         pSession->pAddIEAssoc = NULL;
 }
     pSession->nAddIEAssocLength = 0;
-
 }
 
-
 eHalStatus csrRoamGetSessionIdFromBSSID( tpAniSirGlobal pMac, tCsrBssid *bssid, tANI_U32 *pSessionId )
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
     tANI_U32 i;
-
     for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
     {
         if( CSR_IS_SESSION_VALID( pMac, i ) )
@@ -13152,18 +12478,15 @@
             }
         }
     }
-
     return( status );
 }
 
-
 //This function assumes that we only support one IBSS session. We cannot use BSSID to identify 
 //session because for IBSS, the bssid changes.
 static tANI_U32 csrFindIbssSession( tpAniSirGlobal pMac )
 {
     tANI_U32 i, nRet = CSR_SESSION_ID_INVALID;
     tCsrRoamSession *pSession;
-
     for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
     {
         if( CSR_IS_SESSION_VALID( pMac, i ) )
@@ -13177,55 +12500,43 @@
             }
         }
     }
-
     return (nRet);
 }
-
 static void csrRoamLinkUp(tpAniSirGlobal pMac, tCsrBssid bssid)
 {
    /* Update the current BSS info in ho control block based on connected 
       profile info from pmac global structure                              */
    
-
    smsLog(pMac, LOGW, " csrRoamLinkUp: WLAN link UP with AP= %02x-%02x-%02x-%02x-%02x-%02x\n", 
           bssid[ 0 ], bssid[ 1 ], bssid[ 2 ],
           bssid[ 3 ], bssid[ 4 ], bssid[ 5 ] );
-
    /* Check for user misconfig of RSSI trigger threshold                  */
    pMac->roam.configParam.vccRssiThreshold =
       ( 0 == pMac->roam.configParam.vccRssiThreshold ) ? 
       CSR_VCC_RSSI_THRESHOLD : pMac->roam.configParam.vccRssiThreshold;
    pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
-
     /* Check for user misconfig of UL MAC Loss trigger threshold           */
    pMac->roam.configParam.vccUlMacLossThreshold =
       ( 0 == pMac->roam.configParam.vccUlMacLossThreshold ) ? 
       CSR_VCC_UL_MAC_LOSS_THRESHOLD : pMac->roam.configParam.vccUlMacLossThreshold;
-
 #if   defined WLAN_FEATURE_NEIGHBOR_ROAMING
     {
         tANI_U32 sessionId = 0;
-
         /* Indicate the neighbor roal algorithm about the connect indication */
         csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssid, &sessionId);
         csrNeighborRoamIndicateConnect(pMac, sessionId, VOS_STATUS_SUCCESS);
     }
 #endif
-
 }
 
-
 static void csrRoamLinkDown(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
    tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
    //Only to handle the case for Handover on infra link
    if( eCSR_BSS_TYPE_INFRASTRUCTURE != pSession->connectedProfile.BSSType )
    {
       return;
    }
-
-
    /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/
    csrRoamDeregStatisticsReq(pMac);
    pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
@@ -13234,16 +12545,23 @@
    csrNeighborRoamIndicateDisconnect(pMac, sessionId);
 #endif
    
+#ifndef BMPS_WORKAROUND_NOT_NEEDED
+   if(csrIsInfraApStarted( pMac ) &&  pMac->roam.configParam.doBMPSWorkaround)
+   {
+       pMac->roam.configParam.doBMPSWorkaround = 0;
+   }
+#endif
+   
 }
 
-
 void csrRoamTlStatsTimerHandler(void *pv)
 {
    tpAniSirGlobal pMac = PMAC_STRUCT( pv );
    eHalStatus status;
-
    pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
 
+   smsLog(pMac, LOG1, FL(" TL stat timer is no-op. It needs to support multiple stations"));
+
 #if 0
    // TODO Persession .???
    //req TL for stats
@@ -13273,7 +12591,6 @@
       }
    }
 }
-
 void csrRoamPeStatsTimerHandler(void *pv)
 {
    tCsrPeStatsReqInfo *pPeStatsReqListEntry = (tCsrPeStatsReqInfo *)pv;
@@ -13281,7 +12598,6 @@
    tpAniSirGlobal pMac = pPeStatsReqListEntry->pMac;
    VOS_STATUS vosStatus;
    tPmcPowerState powerState;
-
    pPeStatsReqListEntry->timerRunning = FALSE;
    if( pPeStatsReqListEntry->timerStopFailed == TRUE )
    {
@@ -13341,18 +12657,15 @@
             smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:cannot start hPeStatsTimer timer\n"));
             return;
          }
-
          pPeStatsReqListEntry->timerRunning = TRUE;
 
       }
 
    }
 }
-
 void csrRoamStatsClientTimerHandler(void *pv)
 {
    tCsrStatsClientReqInfo *pStaEntry = (tCsrStatsClientReqInfo *)pv;
-
    if(VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pStaEntry->timer))
    {
 #if 0
@@ -13363,7 +12676,6 @@
        if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) ) 
        {
           smsLog(pStaEntry->pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
-
        }
 #endif       
    }
@@ -13376,7 +12688,6 @@
 
 
 
-
 eHalStatus csrSendMBStatsReqMsg( tpAniSirGlobal pMac, tANI_U32 statsMask, tANI_U8 staId)
 {
    tAniGetPEStatsReq *pMsg;
@@ -13392,17 +12703,13 @@
    pMsg->msgLen = (tANI_U16)sizeof(tAniGetPEStatsReq);
    pMsg->staId = staId;
    pMsg->statsMask = statsMask;
-
    status = palSendMBMessage(pMac->hHdd, pMsg );    
-
    if(!HAL_STATUS_SUCCESS(status))
    {
       smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to send down the stats req \n");
    }
-
    return status;
 }
-
 void csrRoamStatsRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg)
 {
    tAniGetPEStatsRsp *pSmeStatsRsp;
@@ -13417,23 +12724,19 @@
    v_PVOID_t  pvosGCtx;
    v_S7_t     rssi = 0;
    tANI_U32   *pRssi = NULL;
-
    pSmeStatsRsp = (tAniGetPEStatsRsp *)pSirMsg;
    if(pSmeStatsRsp->rc)
    {
       smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:stats rsp from PE shows failure\n"));
       goto post_update;
    }
-
    tempMask = pSmeStatsRsp->statsMask;
    pStats = ((tANI_U8 *)&pSmeStatsRsp->statsMask) + sizeof(pSmeStatsRsp->statsMask);
-
    /* subtract all statistics from this length, and after processing the entire 
     * 'stat' part of the message, if the length is not zero, then rssi is piggy packed 
     * in this 'stats' message.
     */
    length = pSmeStatsRsp->msgLen - sizeof(tAniGetPEStatsRsp);
-
    //new stats info from PE, fill up the stats strucutres in PMAC
    while(tempMask)
    {
@@ -13452,7 +12755,6 @@
             pStats += sizeof(tCsrSummaryStatsInfo);
             length -= sizeof(tCsrSummaryStatsInfo);
             break;
-
          case eCsrGlobalClassAStats:
             smsLog( pMac, LOG1, FL("csrRoamStatsRspProcessor:ClassA stats\n"));
             status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classAStatsInfo, 
@@ -13464,7 +12766,6 @@
             pStats += sizeof(tCsrGlobalClassAStatsInfo);
             length -= sizeof(tCsrGlobalClassAStatsInfo);
             break;
-
          case eCsrGlobalClassBStats:
             smsLog( pMac, LOG1, FL("csrRoamStatsRspProcessor:ClassB stats\n"));
             status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classBStatsInfo, 
@@ -13476,7 +12777,6 @@
             pStats += sizeof(tCsrGlobalClassBStatsInfo);
             length -= sizeof(tCsrGlobalClassBStatsInfo);
             break;
-
          case eCsrGlobalClassCStats:
             smsLog( pMac, LOG1, FL("csrRoamStatsRspProcessor:ClassC stats\n"));
             status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classCStatsInfo, 
@@ -13488,7 +12788,6 @@
             pStats += sizeof(tCsrGlobalClassCStatsInfo);
             length -= sizeof(tCsrGlobalClassCStatsInfo);
             break;
-
          case eCsrPerStaStats:
             smsLog( pMac, LOG1, FL("csrRoamStatsRspProcessor:PerSta stats\n"));
             if( CSR_MAX_STA > pSmeStatsRsp->staId )
@@ -13509,14 +12808,11 @@
             pStats += sizeof(tCsrPerStaStatsInfo);
             length -= sizeof(tCsrPerStaStatsInfo);
             break;
-
          default:
             smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:unknown stats type\n"));
             break;
-
          }
       }
-
       tempMask >>=1;
       counter++;
    }
@@ -13532,7 +12828,6 @@
        rssi = RSSI_HACK_BMPS;
    }
    WDA_UpdateRssiBmps(pvosGCtx, pSmeStatsRsp->staId, rssi);
-
 post_update:   
    //make sure to update the pe stats req list 
    pEntry = csrRoamFindInPeStatsReqList(pMac, pSmeStatsRsp->statsMask);
@@ -13546,9 +12841,7 @@
    pEntry = csrRoamCheckClientReqList(pMac, pSmeStatsRsp->statsMask);
    if(pEntry)
    {
-
       pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
-
       if(pTempStaEntry->timerExpired)
       {
          //send up the stats report
@@ -13557,51 +12850,39 @@
          //also remove from the client list
          csrRoamRemoveStatListEntry(pMac, pEntry);
          pTempStaEntry = NULL;
-
       }
    }
-
 }
-
 tListElem * csrRoamFindInPeStatsReqList(tpAniSirGlobal pMac, tANI_U32  statsMask)
 {
    tListElem *pEntry = NULL;
    tCsrPeStatsReqInfo *pTempStaEntry = NULL;
-
    pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
-
    if(!pEntry)
    {
       //list empty
       smsLog(pMac, LOGW, "csrRoamFindInPeStatsReqList: List empty, no request to PE\n");
       return NULL;
    }
-
    while( pEntry )
    {
       pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
-
       if(pTempStaEntry->statsMask == statsMask)
       {
          smsLog(pMac, LOGW, "csrRoamFindInPeStatsReqList: match found\n");
          break;
       }
-
       pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
    }
-
    return pEntry;
 }
 
-
 tListElem * csrRoamChecknUpdateClientReqList(tpAniSirGlobal pMac, tCsrStatsClientReqInfo *pStaEntry,
                                              tANI_BOOLEAN update)
 {
    tListElem *pEntry;
    tCsrStatsClientReqInfo *pTempStaEntry;
-
    pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
-
    if(!pEntry)
    {
       //list empty
@@ -13609,37 +12890,30 @@
              "upper layer client(s)\n");
       return NULL;
    }
-
    while( pEntry )
    {
       pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
-
       if((pTempStaEntry->requesterId == pStaEntry->requesterId) && 
          (pTempStaEntry->statsMask == pStaEntry->statsMask))
       {
          smsLog(pMac, LOGW, "csrRoamChecknUpdateClientReqList: match found\n");
          if(update)
          {
-         pTempStaEntry->periodicity = pStaEntry->periodicity;
-         pTempStaEntry->callback = pStaEntry->callback;
-         pTempStaEntry->pContext = pStaEntry->pContext;
+            pTempStaEntry->periodicity = pStaEntry->periodicity;
+            pTempStaEntry->callback = pStaEntry->callback;
+            pTempStaEntry->pContext = pStaEntry->pContext;
          }
          break;
       }
-
       pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
    }
-
    return pEntry;
 }
-
 tListElem * csrRoamCheckClientReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
 {
    tListElem *pEntry;
    tCsrStatsClientReqInfo *pTempStaEntry;
-
    pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
-
    if(!pEntry)
    {
       //list empty
@@ -13647,25 +12921,18 @@
              "upper layer client(s)\n");
       return NULL;
    }
-
    while( pEntry )
    {
       pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
-
       if((pTempStaEntry->statsMask & ~(1 << eCsrGlobalClassDStats))  == statsMask)
       {
          smsLog(pMac, LOGW, "csrRoamCheckClientReqList: match found\n");
-
          break;
       }
-
       pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
    }
-
    return pEntry;
 }
-
-
 eHalStatus csrRoamRegisterLinkQualityIndCallback(tpAniSirGlobal pMac,
                                                  csrRoamLinkQualityIndCallback   callback,  
                                                  void                           *pContext)
@@ -13679,32 +12946,25 @@
    else
    {
      smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being registered");
-
      /* do we need to invoke the callback to notify client of initial value ??  */
    }
    return eHAL_STATUS_SUCCESS;
 }
-
 void csrRoamVccTrigger(tpAniSirGlobal pMac)
 {
    eCsrRoamLinkQualityInd newVccLinkQuality;
    tANI_U32 ul_mac_loss = 0;
    tANI_U32 ul_mac_loss_trigger_threshold;
-
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
    /*-------------------------------------------------------------------------
      Link quality is currently binary based on OBIWAN recommended triggers
-
      Check for a change in link quality and notify client if necessary
    -------------------------------------------------------------------------*/
    ul_mac_loss_trigger_threshold = 
       pMac->roam.configParam.vccUlMacLossThreshold;
-
    VOS_ASSERT( ul_mac_loss_trigger_threshold != 0 );
-
    smsLog(pMac, LOGW, "csrRoamVccTrigger: UL_MAC_LOSS_THRESHOLD is %d\n", 
           ul_mac_loss_trigger_threshold );
-
    if(ul_mac_loss_trigger_threshold < ul_mac_loss)
    {
       smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is POOR \n");
@@ -13715,10 +12975,8 @@
       smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is GOOD\n");
       newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
    }
-
    smsLog(pMac, LOGW, "csrRoamVccTrigger: link qual : *** UL_MAC_LOSS %d *** ",
           ul_mac_loss);
-
    if(newVccLinkQuality != pMac->roam.vccLinkQuality)
    {
       smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality changed: trigger necessary\n");
@@ -13733,12 +12991,9 @@
          //event: EVENT_WLAN_VCC
       }
    }
-
    pMac->roam.vccLinkQuality = newVccLinkQuality;
 
-
 }
-
 VOS_STATUS csrRoamVccTriggerRssiIndCallback(tHalHandle hHal, 
                                             v_U8_t  rssiNotification, 
                                             void * context)
@@ -13750,7 +13005,6 @@
    VOS_STATUS status = VOS_STATUS_SUCCESS;
    /*-------------------------------------------------------------------------
      Link quality is currently binary based on OBIWAN recommended triggers
-
      Check for a change in link quality and notify client if necessary
    -------------------------------------------------------------------------*/
    smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: RSSI trigger threshold is %d\n", 
@@ -13760,7 +13014,6 @@
       smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: ignoring the indication as we are not connected\n");
       return VOS_STATUS_SUCCESS;
    }
-
    if(WLANTL_HO_THRESHOLD_DOWN == rssiNotification)
    {
       smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is POOR\n");
@@ -13776,11 +13029,9 @@
       smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: unknown rssi notification %d\n", rssiNotification);
       //Set to this so the code below won't do anything
       newVccLinkQuality = pMac->roam.vccLinkQuality;    
-
       VOS_ASSERT(0);
    }
 
-
    if(newVccLinkQuality != pMac->roam.vccLinkQuality)
    {
       smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality changed: trigger necessary\n");
@@ -13788,28 +13039,21 @@
       {
          smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality indication %d\n",
                 newVccLinkQuality);
-
         /* we now invoke the callback once to notify client of initial value   */
         pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality, 
                                                 pMac->roam.linkQualityIndInfo.context );
          //event: EVENT_WLAN_VCC
       }
    }
-
    pMac->roam.vccLinkQuality = newVccLinkQuality;
-
    return status;
 }
-
-
 tCsrStatsClientReqInfo * csrRoamInsertEntryIntoList( tpAniSirGlobal pMac,
                                                      tDblLinkList *pStaList,
                                                      tCsrStatsClientReqInfo *pStaEntry)
 {
    tCsrStatsClientReqInfo *pNewStaEntry = NULL;
-
    eHalStatus  status;
-
    //if same entity requested for same set of stats with different periodicity & 
    // callback update it
    if(NULL == csrRoamChecknUpdateClientReqList(pMac, pStaEntry, TRUE))
@@ -13823,7 +13067,6 @@
          return NULL;
       }
    
-
       pNewStaEntry->callback = pStaEntry->callback;
       pNewStaEntry->pContext = pStaEntry->pContext;
       pNewStaEntry->periodicity = pStaEntry->periodicity;
@@ -13839,15 +13082,12 @@
    return pNewStaEntry;
 }
 
-
 tCsrPeStatsReqInfo * csrRoamInsertEntryIntoPeStatsReqList( tpAniSirGlobal pMac,
                                                            tDblLinkList *pStaList,
                                                            tCsrPeStatsReqInfo *pStaEntry)
 {
    tCsrPeStatsReqInfo *pNewStaEntry = NULL;
-
    eHalStatus  status;
-
    status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrPeStatsReqInfo));
    if (!HAL_STATUS_SUCCESS(status))
    {
@@ -13856,7 +13096,6 @@
       return NULL;
    }
    
-
    pNewStaEntry->hPeStatsTimer = pStaEntry->hPeStatsTimer;
    pNewStaEntry->numClient = pStaEntry->numClient;
    pNewStaEntry->periodicity = pStaEntry->periodicity;
@@ -13867,11 +13106,8 @@
    pNewStaEntry->rspPending = pStaEntry->rspPending;
    
    csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK  );
-
    return pNewStaEntry;
 }
-
-
 eHalStatus csrGetRssi(tpAniSirGlobal pMac, 
                             tCsrRssiCallback callback, 
                             tANI_U8 staId, tCsrBssid bssId, void *pContext, void* pVosContext)
@@ -13888,7 +13124,6 @@
       smsLog(pMac, LOGE, " csrGetRssi: failed to allocate mem for req \n");
       return status;
    }
-
    csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssId, &sessionId);
 
    pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_RSSI_REQ);
@@ -13898,11 +13133,9 @@
    pMsg->rssiCallback = callback;
    pMsg->pDevContext = pContext;
    pMsg->pVosContext = pVosContext;
-
    msg.type = eWNI_SME_GET_RSSI_REQ;
    msg.bodyptr = pMsg;
    msg.reserved = 0;
-
    if(VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, &msg))
    {
        smsLog(pMac, LOGE, " csrGetRssi failed to post msg to self \n");   
@@ -13912,7 +13145,6 @@
    smsLog(pMac, LOG2, FL("returned"));      
    return status;
 }
-
 eHalStatus csrGetStatistics(tpAniSirGlobal pMac, eCsrStatsRequesterType requesterId, 
                             tANI_U32 statsMask, 
                             tCsrStatsCallback callback, 
@@ -13927,20 +13159,19 @@
    eHalStatus status = eHAL_STATUS_SUCCESS;
    tANI_BOOLEAN insertInClientList = FALSE;
    VOS_STATUS vosStatus;
+   WLANTL_TRANSFER_STA_TYPE *pTlStats;
 
    if( csrIsAllSessionDisconnected(pMac) )
    {
       //smsLog(pMac, LOGW, "csrGetStatistics: wrong state curState(%d) not connected\n", pMac->roam.curState);
       return eHAL_STATUS_FAILURE;
    }
-
    if((!statsMask) && (!callback))
    {
       //msg
       smsLog(pMac, LOGW, "csrGetStatistics: statsMask & callback empty in the request\n");
       return eHAL_STATUS_FAILURE;
    }
-
    //for the search list method for deregister
    staEntry.requesterId = requesterId;
    staEntry.statsMask = statsMask;
@@ -13961,12 +13192,12 @@
          pStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
          if(NULL != pStaEntry->pPeStaEntry)
          {
-         pStaEntry->pPeStaEntry->numClient--;
-         //check if we need to delete the entry from peStatsReqList too
-         if(!pStaEntry->pPeStaEntry->numClient)
-         {
-            csrRoamRemoveEntryFromPeStatsReqList(pMac, pStaEntry->pPeStaEntry);
-         }
+            pStaEntry->pPeStaEntry->numClient--;
+            //check if we need to delete the entry from peStatsReqList too
+            if(!pStaEntry->pPeStaEntry->numClient)
+            {
+               csrRoamRemoveEntryFromPeStatsReqList(pMac, pStaEntry->pPeStaEntry);
+            }
          }
 
          //check if we need to stop the tl stats timer too 
@@ -13986,14 +13217,12 @@
             pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
          }
          vos_timer_stop( &pStaEntry->timer );
-
          // Destroy the vos timer...      
          vosStatus = vos_timer_destroy( &pStaEntry->timer );
          if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
          {
             smsLog(pMac, LOGE, FL("csrGetStatistics:failed to destroy Client req timer\n"));
          }
-
          csrRoamRemoveStatListEntry(pMac, pEntry);
          pStaEntry = NULL;
          return eHAL_STATUS_SUCCESS;
@@ -14017,7 +13246,6 @@
       staEntry.timerExpired = FALSE;
    
    
-
       //if periodic report requested with non cached result from PE/TL
       if(periodicity)
       {
@@ -14067,19 +13295,27 @@
                
                if(!pMac->roam.tlStatsReqInfo.timerRunning)
                {
-#if 0
-                                   // TODO Session Specific info connectedInfo
-                  //req TL for class D stats
-                  if(WLANTL_GetStatistics(pMac->roam.gVosContext, &tlStats, pMac->roam.connectedInfo.staId))
+                  pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
+                  if(NULL != pTlStats)
                   {
-                     smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
+                     //req TL for class D stats
+                     if(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId))
+                     {
+                        smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
+                     }
+                     else
+                     {
+                        //save in SME
+                        csrRoamSaveStatsFromTl(pMac, pTlStats);
+                     }
+                     vos_mem_free(pTlStats);
+                     pTlStats = NULL;
                   }
                   else
                   {
-                     //save in SME
-                     csrRoamSaveStatsFromTl(pMac, tlStats);
+                     smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
                   }
-#endif
+
                   if(pMac->roam.tlStatsReqInfo.periodicity)
                   {
                      //start timer
@@ -14114,23 +13350,29 @@
             //right away
             staEntry.timerExpired = TRUE;
             insertInClientList = TRUE;
-
          }
          if(statsMask & (1 << eCsrGlobalClassDStats))
          {
-#if 0
-                         // TODO : Per Session info connectedInfo
-            //req TL for class D stats
-            if(WLANTL_GetStatistics(pMac->roam.gVosContext, &tlStats, pMac->roam.connectedInfo.staId))
+            pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
+            if(NULL != pTlStats)
             {
-               smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
+               //req TL for class D stats
+               if(!VOS_IS_STATUS_SUCCESS(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId)))
+               {
+                  smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
+               }
+               else
+               {
+                  //save in SME
+                  csrRoamSaveStatsFromTl(pMac, pTlStats);
+               }
+               vos_mem_free(pTlStats);
+               pTlStats = NULL;
             }
             else
             {
-               //save in SME
-               csrRoamSaveStatsFromTl(pMac, tlStats);
+               smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
             }
-#endif
 
          }
          //if looking for stats from TL only 
@@ -14139,9 +13381,7 @@
             //return the stats
             csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
          }
-
       }
-
       if(insertInClientList)
       {
          pStaEntry = csrRoamInsertEntryIntoList(pMac, &pMac->roam.statsClientReqList, &staEntry); 
@@ -14151,6 +13391,7 @@
             smsLog(pMac, LOGW, "csrGetStatistics: Failed to insert req in statsClientReqList\n");
             return eHAL_STATUS_FAILURE;
          }
+         pStaEntry->periodicity = periodicity;
          //Init & start timer if needed
          if(periodicity)
          {
@@ -14167,16 +13408,12 @@
                smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
                return eHAL_STATUS_FAILURE;
             }
-
          }
-
       }
-
    }
    return eHAL_STATUS_SUCCESS;
 }
 
-
 tCsrPeStatsReqInfo * csrRoamCheckPeStatsReqList(tpAniSirGlobal pMac, tANI_U32  statsMask, 
                                                 tANI_U32 periodicity, tANI_BOOLEAN *pFound, tANI_U8 staId)
 {
@@ -14202,7 +13439,6 @@
       {
          pTempStaEntry->periodicity = periodicity;
       }
-
       pTempStaEntry->numClient++;
          found = TRUE;
    }
@@ -14224,7 +13460,6 @@
          return NULL;
       }
    }
-
    pmcQueryPowerState(pMac, &powerState, NULL, NULL);
    if(ePMC_FULL_POWER == powerState)
    {
@@ -14268,11 +13503,9 @@
                smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot init hPeStatsTimer timer\n"));
                return NULL;
             }
-
          }
          //start timer
          smsLog(pMac, LOG1, "csrRoamCheckPeStatsReqList:peStatsTimer period %d\n", pTempStaEntry->periodicity);
-
          vosStatus = vos_timer_start( &pTempStaEntry->hPeStatsTimer, pTempStaEntry->periodicity );
          if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) ) 
          {
@@ -14282,12 +13515,10 @@
          pTempStaEntry->timerRunning = TRUE;
       }
    }
-
    *pFound = found;
    return pTempStaEntry;
 }
 
-
 /*
     pStaEntry is no longer invalid upon the return of this function.
 */
@@ -14298,10 +13529,9 @@
         if(csrLLRemoveEntry(&pMac->roam.statsClientReqList, pEntry, LL_ACCESS_LOCK))
         {
             palFreeMemory(pMac->hHdd, GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link ));
+            }
         }
     }
-}
-
 
 void csrRoamRemoveEntryFromPeStatsReqList(tpAniSirGlobal pMac, tCsrPeStatsReqInfo *pPeStaEntry)
 {
@@ -14309,18 +13539,15 @@
    tCsrPeStatsReqInfo *pTempStaEntry;
    VOS_STATUS vosStatus;
    pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
-
    if(!pEntry)
    {
       //list empty
       smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: List empty, no stats req for PE\n");
       return;
    }
-
    while( pEntry )
    {
       pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
-
       if( pTempStaEntry && pTempStaEntry->statsMask == pPeStaEntry->statsMask)
       {
          smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: match found\n");
@@ -14349,7 +13576,7 @@
                // memory for the PE stat entry in the timer CB.
                pTempStaEntry->timerStopFailed = TRUE;
             }
-         }
+         } 
 
          if(csrLLRemoveEntry(&pMac->roam.peStatsReqList, pEntry, LL_ACCESS_LOCK))
          {
@@ -14365,35 +13592,33 @@
          pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
       }
    }
-
    return;
 }
 
 
-void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE tlStats)
+void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE *pTlStats)
 {
 
-   pMac->roam.classDStatsInfo.num_rx_bytes_crc_ok = tlStats.rxBcntCRCok;
-   pMac->roam.classDStatsInfo.rx_bc_byte_cnt = tlStats.rxBCBcnt;
-   pMac->roam.classDStatsInfo.rx_bc_frm_cnt = tlStats.rxBCFcnt;
-   pMac->roam.classDStatsInfo.rx_byte_cnt = tlStats.rxBcnt;
-   pMac->roam.classDStatsInfo.rx_mc_byte_cnt = tlStats.rxMCBcnt;
-   pMac->roam.classDStatsInfo.rx_mc_frm_cnt = tlStats.rxMCFcnt;
-   pMac->roam.classDStatsInfo.rx_rate = tlStats.rxRate;
+   pMac->roam.classDStatsInfo.num_rx_bytes_crc_ok = pTlStats->rxBcntCRCok;
+   pMac->roam.classDStatsInfo.rx_bc_byte_cnt = pTlStats->rxBCBcnt;
+   pMac->roam.classDStatsInfo.rx_bc_frm_cnt = pTlStats->rxBCFcnt;
+   pMac->roam.classDStatsInfo.rx_byte_cnt = pTlStats->rxBcnt;
+   pMac->roam.classDStatsInfo.rx_mc_byte_cnt = pTlStats->rxMCBcnt;
+   pMac->roam.classDStatsInfo.rx_mc_frm_cnt = pTlStats->rxMCFcnt;
+   pMac->roam.classDStatsInfo.rx_rate = pTlStats->rxRate;
    //?? need per AC
-   pMac->roam.classDStatsInfo.rx_uc_byte_cnt[0] = tlStats.rxUCBcnt;
-   pMac->roam.classDStatsInfo.rx_uc_frm_cnt = tlStats.rxUCFcnt;
-   pMac->roam.classDStatsInfo.tx_bc_byte_cnt = tlStats.txBCBcnt;
-   pMac->roam.classDStatsInfo.tx_bc_frm_cnt = tlStats.txBCFcnt;
-   pMac->roam.classDStatsInfo.tx_mc_byte_cnt = tlStats.txMCBcnt;
-   pMac->roam.classDStatsInfo.tx_mc_frm_cnt = tlStats.txMCFcnt;
+   pMac->roam.classDStatsInfo.rx_uc_byte_cnt[0] = pTlStats->rxUCBcnt;
+   pMac->roam.classDStatsInfo.rx_uc_frm_cnt = pTlStats->rxUCFcnt;
+   pMac->roam.classDStatsInfo.tx_bc_byte_cnt = pTlStats->txBCBcnt;
+   pMac->roam.classDStatsInfo.tx_bc_frm_cnt = pTlStats->txBCFcnt;
+   pMac->roam.classDStatsInfo.tx_mc_byte_cnt = pTlStats->txMCBcnt;
+   pMac->roam.classDStatsInfo.tx_mc_frm_cnt = pTlStats->txMCFcnt;
    //?? need per AC
-   pMac->roam.classDStatsInfo.tx_uc_byte_cnt[0] = tlStats.txUCBcnt;
-   pMac->roam.classDStatsInfo.tx_uc_frm_cnt = tlStats.txUCFcnt;
+   pMac->roam.classDStatsInfo.tx_uc_byte_cnt[0] = pTlStats->txUCBcnt;
+   pMac->roam.classDStatsInfo.tx_uc_frm_cnt = pTlStats->txUCFcnt;
 
 }
 
-
 void csrRoamReportStatistics(tpAniSirGlobal pMac, tANI_U32 statsMask, 
                              tCsrStatsCallback callback, tANI_U8 staId, void *pContext)
 {
@@ -14402,7 +13627,6 @@
    tANI_U32 tempMask = 0;
    tANI_U8 counter = 0;
    eHalStatus status = eHAL_STATUS_FAILURE;
-
    if(!callback)
    {
       smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report callback NULL\n"));
@@ -14413,11 +13637,8 @@
       smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report statsMask is 0\n"));
       return;
    }
-
    pStats = stats;
-
    tempMask = statsMask;
-
    while(tempMask)
    {
       if(tempMask & 1)
@@ -14435,7 +13656,6 @@
             }
             pStats += sizeof(tCsrSummaryStatsInfo);
             break;
-
          case eCsrGlobalClassAStats:
             smsLog( pMac, LOG1, FL("csrRoamReportStatistics:ClassA stats\n"));
             status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classAStatsInfo, 
@@ -14445,9 +13665,7 @@
                smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassA stats\n"));
             }
             pStats += sizeof(tCsrGlobalClassAStatsInfo);
-
             break;
-
          case eCsrGlobalClassBStats:
             smsLog( pMac, LOG1, FL("csrRoamReportStatistics:ClassB stats\n"));
             status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classBStatsInfo, 
@@ -14457,9 +13675,7 @@
                smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassB stats\n"));
             }
             pStats += sizeof(tCsrGlobalClassBStatsInfo);
-
             break;
-
          case eCsrGlobalClassCStats:
             smsLog( pMac, LOG1, FL("csrRoamReportStatistics:ClassC stats\n"));
             status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classCStatsInfo, 
@@ -14469,9 +13685,7 @@
                smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassC stats\n"));
             }
             pStats += sizeof(tCsrGlobalClassCStatsInfo);
-
             break;
-
          case eCsrGlobalClassDStats:
             smsLog( pMac, LOG1, FL("csrRoamReportStatistics:ClassD stats\n"));
             status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classDStatsInfo, 
@@ -14481,9 +13695,7 @@
                smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassD stats\n"));
             }
             pStats += sizeof(tCsrGlobalClassDStatsInfo);
-
             break;
-
          case eCsrPerStaStats:
             smsLog( pMac, LOG1, FL("csrRoamReportStatistics:PerSta stats\n"));
             status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.perStaStatsInfo[staId], 
@@ -14493,26 +13705,18 @@
                smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy PerSta stats\n"));
             }
             pStats += sizeof(tCsrPerStaStatsInfo);
-
             break;
-
          default:
             smsLog( pMac, LOG1, FL("csrRoamReportStatistics:unknown stats type\n"));
             break;
-
          }
       }
-
       tempMask >>=1;
       counter++;
    }
-
    callback(stats, pContext );
-
 }
 
-
-
 eHalStatus csrRoamDeregStatisticsReq(tpAniSirGlobal pMac)
 {
    tListElem *pEntry = NULL;
@@ -14521,7 +13725,6 @@
    eHalStatus status = eHAL_STATUS_SUCCESS;
    VOS_STATUS vosStatus;
    pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
-
    if(!pEntry)
    {
       //list empty
@@ -14529,7 +13732,6 @@
              "upper layer client(s)\n");
       return status;
    }
-
    while( pEntry )
    {
       if(pPrevEntry)
@@ -14540,19 +13742,16 @@
                                  pTempStaEntry->staId, pTempStaEntry->pContext);
          csrRoamRemoveStatListEntry(pMac, pPrevEntry);
       }
-
       pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
-
       if (pTempStaEntry->pPeStaEntry)  //pPeStaEntry can be NULL
       {
-      pTempStaEntry->pPeStaEntry->numClient--;
-      //check if we need to delete the entry from peStatsReqList too
-      if(!pTempStaEntry->pPeStaEntry->numClient)
-      {
-         csrRoamRemoveEntryFromPeStatsReqList(pMac, pTempStaEntry->pPeStaEntry);
+         pTempStaEntry->pPeStaEntry->numClient--;
+         //check if we need to delete the entry from peStatsReqList too
+         if(!pTempStaEntry->pPeStaEntry->numClient)
+         {
+            csrRoamRemoveEntryFromPeStatsReqList(pMac, pTempStaEntry->pPeStaEntry);
+         }
       }
-      }
-
       //check if we need to stop the tl stats timer too 
       pMac->roam.tlStatsReqInfo.numClient--;
       if(!pMac->roam.tlStatsReqInfo.numClient)
@@ -14569,24 +13768,21 @@
          pMac->roam.tlStatsReqInfo.periodicity = 0;
          pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
       }
-
       if (pTempStaEntry->periodicity)
       {
           //While creating StaEntry in csrGetStatistics,
           //Initializing and starting timer only when periodicity is set. 
           //So Stop and Destroy timer only when periodicity is set.
           
-
-      vos_timer_stop( &pTempStaEntry->timer );
-
-      // Destroy the vos timer...      
-      vosStatus = vos_timer_destroy( &pTempStaEntry->timer );
-      if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
-      {
-         smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:failed to destroy Client req timer\n"));
+          vos_timer_stop( &pTempStaEntry->timer );
+          // Destroy the vos timer...      
+          vosStatus = vos_timer_destroy( &pTempStaEntry->timer );
+          if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
+          {
+              smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:failed to destroy Client req timer\n"));
+          }
       }
-      }
-
+      
       
       pPrevEntry = pEntry;
       pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
@@ -14600,12 +13796,10 @@
                                  pTempStaEntry->staId, pTempStaEntry->pContext);
       csrRoamRemoveStatListEntry(pMac, pPrevEntry);
    }
-
    return status;
    
 }
 
-
 eHalStatus csrIsFullPowerNeeded( tpAniSirGlobal pMac, tSmeCmd *pCommand, 
                                    tRequestFullPowerReason *pReason,
                                    tANI_BOOLEAN *pfNeedPower )
@@ -14616,7 +13810,6 @@
     eHalStatus status = eHAL_STATUS_SUCCESS;
         // TODO : Session info unavailable
         tANI_U32 sessionId = 0;
-
     if( pfNeedPower )
     {
         *pfNeedPower = eANI_BOOLEAN_FALSE;
@@ -14626,10 +13819,8 @@
         {
                 return eHAL_STATUS_SUCCESS;
         }
-
     //Check PMC state first
     pmcState = pmcGetPmcState( pMac );
-
     switch( pmcState )
     {
     case REQUEST_IMPS:
@@ -14645,7 +13836,6 @@
                 //Internal process, no need for full power
                 fNeedFullPower = eANI_BOOLEAN_FALSE;
                 break;
-
             default:
                 //Other scans are real scan, ask for power
                 fNeedFullPower = eANI_BOOLEAN_TRUE;
@@ -14658,7 +13848,6 @@
             fNeedFullPower = eANI_BOOLEAN_TRUE;
         }
         break;
-
     case REQUEST_BMPS:
     case BMPS:
     case REQUEST_START_UAPSD:
@@ -14671,7 +13860,6 @@
             tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
             tCsrScanResult *pScanResult;
             tListElem *pEntry;
-
             switch ( pCommand->u.roamCmd.roamReason )
             {
             case eCsrForcedDisassoc:
@@ -14685,11 +13873,9 @@
             case eCsrSmeIssuedReassocToSameAP:
                 fNeedFullPower = eANI_BOOLEAN_TRUE;
                 break;
-
             case eCsrCapsChange:
                 fNeedFullPower = eANI_BOOLEAN_TRUE;
                 break;
-
             default:
                 //Check whether the profile is already connected. If so, no need for full power
                 //Note: IBSS is ignored for now because we don't support powersave in IBSS
@@ -14738,7 +13924,6 @@
             reason = eSME_LINK_DISCONNECTED_BY_OTHER;
         }
         break;
-
     case REQUEST_STOP_UAPSD:
     case REQUEST_EXIT_WOWL:
         if( eSmeCommandRoam == pCommand->command )
@@ -14755,7 +13940,6 @@
             }
                 }
         break;
-
     case STOPPED:
     case REQUEST_STANDBY:
     case STANDBY:
@@ -14764,15 +13948,12 @@
         smsLog( pMac, LOGE, FL( "  cannot process because PMC is in stopped/standby state %d\n" ), pmcState );
         status = eHAL_STATUS_FAILURE;
         break;
-
     case FULL_POWER:
     case REQUEST_FULL_POWER:
     default:
         //No need to ask for full power. This has to be FULL_POWER state
         break;
-
     } //switch
-
     if( pReason )
     {
         *pReason = reason;
@@ -14781,41 +13962,32 @@
     {
         *pfNeedPower = fNeedFullPower;
     }
-
     return ( status );
 }
 
-
 static eHalStatus csrRequestFullPower( tpAniSirGlobal pMac, tSmeCmd *pCommand )
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
     tRequestFullPowerReason reason = eSME_REASON_OTHER;
-
     status = csrIsFullPowerNeeded( pMac, pCommand, &reason, &fNeedFullPower );
-
     if( fNeedFullPower && HAL_STATUS_SUCCESS( status ) )
     {
         status = pmcRequestFullPower(pMac, csrFullPowerCallback, pMac, reason);
     }
-
     return ( status );
 }
 
-
 tSmeCmd *csrGetCommandBuffer( tpAniSirGlobal pMac )
 {
     tSmeCmd *pCmd = smeGetCommandBuffer( pMac );
-
     if( pCmd )
     {
         pMac->roam.sPendingCommands++;
     }
-
     return ( pCmd );
 }
 
-
 void csrReleaseCommand(tpAniSirGlobal pMac, tSmeCmd *pCommand)
 {
    if (pMac->roam.sPendingCommands > 0)
@@ -14832,12 +14004,10 @@
    }
 }
 
-
 //Return SUCCESS is the command is queued, failed
 eHalStatus csrQueueSmeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fHighPriority )
 {
     eHalStatus status;
-
     if( (eSmeCommandScan == pCommand->command) && pMac->scan.fDropScanCmd )
     {
         smsLog(pMac, LOGW, FL(" drop scan (scan reason %d) command"),
@@ -14851,7 +14021,6 @@
     if( HAL_STATUS_SUCCESS( status ) )
     {
         tANI_BOOLEAN fNoCmdPending;
-
         //make sure roamCmdPendingList is not empty first
         fNoCmdPending = csrLLIsListEmpty( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_FALSE );
         if( fNoCmdPending )
@@ -14890,11 +14059,8 @@
         //release the command.
         smsLog( pMac, LOGE, FL( "  cannot queue command %d\n" ), pCommand->command );
     }
-
     return ( status );
-
 }
-
 #ifdef WLAN_SOFTAP_FEATURE
 eHalStatus csrRoamUpdateAPWPSIE( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirAPWPSIEs* pAPWPSIES )
 {
@@ -14909,7 +14075,6 @@
         return eHAL_STATUS_FAILURE;
     }
 
-
     do
     {
         status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
@@ -14919,55 +14084,42 @@
 
         pBuf = (tANI_U8 *)&pMsg->transactionId;
         wTmpBuf = pBuf;
-
         // transactionId
         *pBuf = 0;
         *( pBuf + 1 ) = 0;
         pBuf += sizeof(tANI_U16);
-
         // bssId
         palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
         pBuf += sizeof(tSirMacAddr);
-
         //sessionId
         *pBuf++ = (tANI_U8)sessionId;
-
         // APWPSIEs
         palCopyMemory( pMac->hHdd, (tSirAPWPSIEs *)pBuf, pAPWPSIES, sizeof(tSirAPWPSIEs));
         pBuf += sizeof(tSirAPWPSIEs);
-
         pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32) + (pBuf - wTmpBuf))); //msg_header + msg
-
         status = palSendMBMessage(pMac->hHdd, pMsg);
-
     } while( 0 );
-
     return ( status );
 }
-
 eHalStatus csrRoamUpdateWPARSNIEs( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirRSNie * pAPSirRSNie)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tSirUpdateAPWPARSNIEsReq *pMsg;
     tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
-
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
     if (NULL == pSession)
     {
         smsLog( pMac, LOGE, FL( "  Session does not exist for session id %d" ), sessionId);
         return eHAL_STATUS_FAILURE;
     }
-
     do
     {
         status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPARSNIEsReq) );
         if (!HAL_STATUS_SUCCESS(status)) break;
         palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirUpdateAPWPARSNIEsReq ) );
         pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SET_APWPARSNIEs_REQ);
-
         pBuf = (tANI_U8 *)&pMsg->transactionId;
         wTmpBuf = pBuf;
-
         // transactionId
         *pBuf = 0;
         *( pBuf + 1 ) = 0;
@@ -14976,23 +14128,17 @@
         // bssId
         palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
         pBuf += sizeof(tSirMacAddr);
-
         // sessionId
         *pBuf++ = (tANI_U8)sessionId;
     
         // APWPARSNIEs
         palCopyMemory( pMac->hHdd, (tSirRSNie *)pBuf, pAPSirRSNie, sizeof(tSirRSNie));
         pBuf += sizeof(tSirRSNie);
-
         pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf))); //msg_header + msg
-
     status = palSendMBMessage(pMac->hHdd, pMsg);
-
     } while( 0 );
-
     return ( status );
 }
-
 #endif //#ifdef WLAN_SOFTAP_FEATURE
 
 #ifdef WLAN_FEATURE_VOWIFI_11R
@@ -15003,7 +14149,6 @@
     tpSirFTPreAuthReq pftPreAuthReq;
     tANI_U16 auth_req_len = 0;
     tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
     auth_req_len = sizeof(tSirFTPreAuthReq);
     pftPreAuthReq = (tpSirFTPreAuthReq)vos_mem_malloc(auth_req_len);
     if (pftPreAuthReq == NULL)
@@ -15011,10 +14156,8 @@
         smsLog(pMac, LOGE, FL("Memory allocation for FT Preauth request failed"));
         return eHAL_STATUS_RESOURCES;
     }
-
     // Save the SME Session ID here. We need it while processing the preauth response
     pMac->ft.ftSmeContext.smeSessionId = sessionId;
-
     vos_mem_zero(pftPreAuthReq, auth_req_len);
 
     pftPreAuthReq->pbssDescription = (tpSirBssDescription)vos_mem_malloc(
@@ -15024,12 +14167,9 @@
 
     pftPreAuthReq->preAuthchannelNum = pBssDescription->channelId;
 
-
     palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->currbssId, (void *)pSession->connectedProfile.bssid, sizeof(tSirMacAddr));
-
     palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->preAuthbssId, (void *)pBssDescription->bssId, sizeof(tSirMacAddr));  
 
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
     if (csrRoamIs11rAssoc(pMac))
     {
@@ -15042,15 +14182,11 @@
     {
         pftPreAuthReq->ft_ies_length = 0; 
     }
-
     vos_mem_copy(pftPreAuthReq->pbssDescription, pBssDescription, pBssDescription->length);
-
     pftPreAuthReq->length = pal_cpu_to_be16(sizeof(tSirFTPreAuthReq) + sizeof(pBssDescription->length) +
                                                     pBssDescription->length); 
-
     return palSendMBMessage(pMac->hHdd, pftPreAuthReq);
 }
-
 /*--------------------------------------------------------------------------
  * This will receive and process the FT Pre Auth Rsp from the current 
  * associated ap. 
@@ -15069,22 +14205,17 @@
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
     smsLog( pMac, LOGE, FL("Preauth response status code %d"), pFTPreAuthRsp->status); 
 #endif
-
 #ifdef WLAN_FEATURE_NEIGHBOR_ROAMING    
     csrNeighborRoamPreauthRspHandler(pMac, (VOS_STATUS)pFTPreAuthRsp->status);
 #endif
-
     /* The below function calls/timers should be invoked only if the pre-auth is successful */
     if (VOS_STATUS_SUCCESS != (VOS_STATUS)pFTPreAuthRsp->status)
         return;
-
     // Implies a success
     pMac->ft.ftSmeContext.FTState = eFT_AUTH_COMPLETE;
-
     // Indicate SME QoS module the completion of Preauth success. This will trigger the creation of RIC IEs
     pMac->ft.ftSmeContext.psavedFTPreAuthRsp = pFTPreAuthRsp;
     sme_QosCsrEventInd(pMac, pMac->ft.ftSmeContext.smeSessionId, SME_QOS_CSR_PREAUTH_SUCCESS_IND, NULL);
-
     /* Start the pre-auth reassoc interval timer with a period of 400ms. When this expires, 
      * actual transition from the current to handoff AP is triggered */
     status = palTimerStart(pMac->hHdd, pMac->ft.ftSmeContext.preAuthReassocIntvlTimer,
@@ -15095,7 +14226,6 @@
         smsLog(pMac, LOGE, FL("Preauth reassoc interval timer start failed to start with status %d\n"), status);
         return;
     }
-
     // Save the received response
     palCopyMemory(pMac->hHdd, (void *)&pMac->ft.ftSmeContext.preAuthbssId, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
     if (csrRoamIs11rAssoc(pMac))
@@ -15103,7 +14233,6 @@
                         eCSR_ROAM_FT_RESPONSE, eCSR_ROAM_RESULT_NONE);
 
     // Currently we dont do anything special for CCX connection.
-
 #ifdef FEATURE_WLAN_LFR
     // If Legacy Fast Roaming is enabled, signal the supplicant  
     // So he can send us a PMK-ID for this candidate AP.
@@ -15141,7 +14270,6 @@
         }
     }
 }
-
 eHalStatus csrRoamStartJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
 {
     eHalStatus status = eHAL_STATUS_FAILURE;
@@ -15167,7 +14295,6 @@
     
     return (status);
 }
-
 eHalStatus csrRoamStopJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
 {
     smsLog(pMac, LOGE, " csrRoamStopJoinRetryTimer \n ");
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index b60c0da..477e635 100644
--- a/CORE/SME/src/csr/csrApiScan.c
+++ b/CORE/SME/src/csr/csrApiScan.c
@@ -102,6 +102,7 @@
 #ifdef WLAN_AP_STA_CONCURRENCY
 static void csrStaApConcTimerHandler(void *);
 #endif
+tANI_BOOLEAN csrIsSupportedChannel(tpAniSirGlobal pMac, tANI_U8 channelId);
 eHalStatus csrScanChannels( tpAniSirGlobal pMac, tSmeCmd *pCommand );
 void csrSetCfgValidChannelList( tpAniSirGlobal pMac, tANI_U8 *pChannelList, tANI_U8 NumChannels );
 void csrSaveTxPowerToCfg( tpAniSirGlobal pMac, tDblLinkList *pList, tANI_U32 cfgId );
@@ -492,6 +493,42 @@
 }
 #endif
 
+/* ---------------------------------------------------------------------------
+    \fn csrScan2GOnyRequest
+    \brief This function will update the scan request with only 
+           2.4GHz valid cahnnel list.
+    \param pMac
+    \param pScanCmd
+    \param pScanRequest
+    \return None
+  -------------------------------------------------------------------------------*/
+static void csrScan2GOnyRequest(tpAniSirGlobal pMac,tSmeCmd *pScanCmd, 
+                                tCsrScanRequest *pScanRequest)
+{
+    tANI_U8 index, channelId, channelListSize = 0;
+    tANI_U8 channelList2G[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
+    static tANI_U8 validchannelList[CSR_MAX_2_4_GHZ_SUPPORTED_CHANNELS] = {0};
+
+    VOS_ASSERT(pScanCmd && pScanRequest);
+
+    if (pScanCmd->u.scanCmd.scanID ||
+       (eCSR_SCAN_REQUEST_FULL_SCAN != pScanRequest->requestType))
+           return;
+
+    //Contsruct valid Supported 2.4 GHz Channel List
+    for( index = 0; index < ARRAY_SIZE(channelList2G); index++ )
+    {
+        channelId = channelList2G[index];
+        if ( csrIsSupportedChannel( pMac, channelId ) )
+        {
+            validchannelList[channelListSize++] = channelId;
+        }
+    }
+
+    pScanRequest->ChannelInfo.numOfChannels = channelListSize;
+    pScanRequest->ChannelInfo.ChannelList = validchannelList;
+}
+
 eHalStatus csrScanRequest(tpAniSirGlobal pMac, tANI_U16 sessionId, 
               tCsrScanRequest *pScanRequest, tANI_U32 *pScanRequestID, 
               csrScanCompleteCallback callback, void *pContext)
@@ -623,6 +660,7 @@
                             scanReq.maxChnTime = pMac->roam.configParam.nActiveMaxChnTime;
                             scanReq.minChnTime = pMac->roam.configParam.nActiveMinChnTime;
                         }
+
                         status = csrScanCopyRequest(pMac, &p11dScanCmd->u.scanCmd.u.scanRequest, &scanReq);
                         //Free the channel list
                         palFreeMemory( pMac->hHdd, pChnInfo->ChannelList );
@@ -652,6 +690,15 @@
                         break;
                     }
                 }
+
+                //Scan only 2G Channels if set in ini file
+                //This is mainly to reduce the First Scan duration
+                //Once we turn on Wifi
+                if(pMac->scan.fFirstScanOnly2GChnl)
+                {
+                    csrScan2GOnyRequest(pMac, pScanCmd, pScanRequest);
+                }
+
                 status = csrScanCopyRequest(pMac, &pScanCmd->u.scanCmd.u.scanRequest, pScanRequest);
                 if(HAL_STATUS_SUCCESS(status))
                 {
@@ -2391,6 +2438,14 @@
             }
         }
 
+        else if( csrIs11hSupported( pMac ) && pIesLocal->Country.present && 
+                 !pMac->roam.configParam.fSupplicantCountryCodeHasPriority )
+        {
+             /* If 11h is supported, store the power information received in the Country IE */
+            csrSaveToChannelPower2G_5G( pMac, pIesLocal->Country.num_triplets * sizeof(tSirMacChanInfo), 
+                                        (tSirMacChanInfo *)(&pIesLocal->Country.triplets[0]) );
+        }
+
         // append to main list
         csrScanAddResult(pMac, pBssDescription, pIesLocal);
         if( (pBssDescription->Result.pvIes == NULL) && pIesLocal )
@@ -2513,7 +2568,7 @@
  * Save the channelList into the ultimate storage as the final stage of channel 
  * Input: pCountryInfo -- the country code (e.g. "USI"), channel list, and power limit are all stored inside this data structure
  */
-void csrSaveToChannelPower2G_5G( tpAniSirGlobal pMac, tANI_U32 tableSize, tSirMacChanInfo *channelTable )
+eHalStatus csrSaveToChannelPower2G_5G( tpAniSirGlobal pMac, tANI_U32 tableSize, tSirMacChanInfo *channelTable )
 {
     tANI_U32 i = tableSize / sizeof( tSirMacChanInfo );
     tSirMacChanInfo *pChannelInfo;
@@ -2534,16 +2589,27 @@
             pChannelSet->numChannels = pChannelInfo->numChannels;
 
             // Now set the inter-channel offset based on the frequency band the channel set lies in
-            if( CSR_IS_CHANNEL_24GHZ(pChannelSet->firstChannel) )
+            if( (CSR_IS_CHANNEL_24GHZ(pChannelSet->firstChannel)) &&
+                    ((pChannelSet->firstChannel + pChannelSet->numChannels) <= CSR_MAX_24GHz_CHANNEL_NUMBER) )
+
             {
                 pChannelSet->interChannelOffset = 1;
                 f2GHzInfoFound = TRUE;
             }
-            else
+            else if ( (CSR_IS_CHANNEL_5GHZ(pChannelSet->firstChannel)) &&
+                ((pChannelSet->firstChannel + (pChannelSet->numChannels * 4)) <= CSR_MAX_5GHz_CHANNEL_NUMBER) )
             {
                 pChannelSet->interChannelOffset = 4;
                 f2GHzInfoFound = FALSE;
             }
+            else
+            {
+                smsLog( pMac, LOGW, FL("Invalid Channel Present in Country IE"),
+                        pChannelSet->firstChannel);
+                palFreeMemory(pMac->hHdd, pChannelSet);
+                return eHAL_STATUS_FAILURE;
+            }
+
             pChannelSet->txPower = CSR_ROAM_MIN( pChannelInfo->maxTxPower, pMac->roam.configParam.nTxPowerCap );
 
             if( f2GHzInfoFound )
@@ -2592,7 +2658,7 @@
         pChannelInfo++;                // move to next entry
     }
 
-    return;
+    return eHAL_STATUS_SUCCESS;
 }
 
 
@@ -3256,8 +3322,13 @@
         smsLog(pMac, LOGE, FL("  %d sets each one is %d\n"), pIesLocal->Country.num_triplets, sizeof(tSirMacChanInfo));
         // save the channel/power information from the Channel IE.
         //sizeof(tSirMacChanInfo) has to be 3
-        csrSaveToChannelPower2G_5G( pMac, pIesLocal->Country.num_triplets * sizeof(tSirMacChanInfo), 
-                                        (tSirMacChanInfo *)(&pIesLocal->Country.triplets[0]) );
+        if (eHAL_STATUS_SUCCESS != csrSaveToChannelPower2G_5G( pMac, pIesLocal->Country.num_triplets * sizeof(tSirMacChanInfo),
+                    (tSirMacChanInfo *)(&pIesLocal->Country.triplets[0]) ))
+        {
+            fRet = eANI_BOOLEAN_FALSE;
+            return fRet;
+        }
+
         // set the indicator of the channel where the country IE was found...
         pMac->scan.channelOf11dInfo = pSirBssDesc->channelId;
         // Populate both band channel lists based on what we found in the country information...
@@ -3305,7 +3376,15 @@
 
     // Now check if we gathered any domain/country specific information
     // If so, we should update channel list and apply Tx power settings
-    csrApplyCountryInformation( pMac, FALSE );
+    if( csrIs11dSupported(pMac) )
+    {
+        csrApplyCountryInformation( pMac, FALSE );
+    }
+    else if( csrIs11hSupported(pMac) && !pMac->roam.configParam.fSupplicantCountryCodeHasPriority) 
+    {
+        // If llh is enabled, store the channel + power information gathered  in the cfg
+        csrApplyPower2Current( pMac );
+    }     
 }
 
 
@@ -3759,19 +3838,41 @@
     tANI_BOOLEAN fMatch = FALSE;
     tSirMacCapabilityInfo *pCap1, *pCap2;
     tDot11fBeaconIEs *pIes1 = NULL;
+    tDot11fBeaconIEs *pIesTemp = pIes2;
 
     pCap1 = (tSirMacCapabilityInfo *)&pSirBssDesc1->capabilityInfo;
     pCap2 = (tSirMacCapabilityInfo *)&pSirBssDesc2->capabilityInfo;
     if(pCap1->ess == pCap2->ess)
     {
         if (pCap1->ess && 
-                csrIsMacAddressEqual( pMac, (tCsrBssid *)pSirBssDesc1->bssId, (tCsrBssid *)pSirBssDesc2->bssId))
+                csrIsMacAddressEqual( pMac, (tCsrBssid *)pSirBssDesc1->bssId, (tCsrBssid *)pSirBssDesc2->bssId)&&
+                (pSirBssDesc1->channelId == pSirBssDesc2->channelId))
         {
             fMatch = TRUE;
+            // Check for SSID match, if exists
+            do
+            {
+                if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc1, &pIes1)))
+                {
+                    break;
+                }
+                if( NULL == pIesTemp )
+                {
+                    if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc2, &pIesTemp)))
+                    {
+                        break;
+                    }
+                }
+                if(pIes1->SSID.present && pIesTemp->SSID.present)
+                {
+                    fMatch = csrIsSsidMatch(pMac, pIes1->SSID.ssid, pIes1->SSID.num_ssid, 
+                                            pIesTemp->SSID.ssid, pIesTemp->SSID.num_ssid, eANI_BOOLEAN_TRUE);
+                } 
+            }while(0);
+
         }
         else if (pCap1->ibss && (pSirBssDesc1->channelId == pSirBssDesc2->channelId))
         {
-            tDot11fBeaconIEs *pIesTemp = pIes2;
 
             do
             {
@@ -3793,11 +3894,6 @@
                                             pIesTemp->SSID.ssid, pIesTemp->SSID.num_ssid, eANI_BOOLEAN_TRUE);
                 }
             }while(0);
-            if( (NULL == pIes2) && pIesTemp )
-            {
-                //locally allocated
-                palFreeMemory(pMac->hHdd, pIesTemp);
-            }
         }
 #if defined WLAN_FEATURE_P2P
         /* In case of P2P devices, ess and ibss will be set to zero */
@@ -3813,6 +3909,12 @@
     {
         palFreeMemory(pMac->hHdd, pIes1);
     }
+    
+    if( (NULL == pIes2) && pIesTemp )
+    {
+        //locally allocated
+        palFreeMemory(pMac->hHdd, pIesTemp);
+    }
 
     return( fMatch );
 }
@@ -3850,6 +3952,12 @@
         case eCSR_DOT11_MODE_11n_ONLY:
             fAllowed = (tANI_BOOLEAN)((eCSR_DOT11_MODE_11n == phyMode) || (eCSR_DOT11_MODE_TAURUS == phyMode));
             break;
+
+#ifdef WLAN_FEATURE_11AC
+         case eCSR_DOT11_MODE_11ac_ONLY:
+             fAllowed = (tANI_BOOLEAN)((eCSR_DOT11_MODE_11ac == phyMode) || (eCSR_DOT11_MODE_TAURUS == phyMode));
+             break;
+#endif
         case eCSR_DOT11_MODE_11b_ONLY:
             fAllowed = (tANI_BOOLEAN)(eCSR_DOT11_MODE_11b == phyMode);
             break;
@@ -3857,6 +3965,9 @@
             fAllowed = (tANI_BOOLEAN)(eCSR_DOT11_MODE_11a == phyMode);
             break;
         case eCSR_DOT11_MODE_11n:
+#ifdef WLAN_FEATURE_11AC
+        case eCSR_DOT11_MODE_11ac:
+#endif
         case eCSR_DOT11_MODE_TAURUS:
         default:
             fAllowed = eANI_BOOLEAN_TRUE;
@@ -4479,6 +4590,7 @@
             }
 #ifdef WLAN_FEATURE_P2P
             pMsg->p2pSearch = pScanReq->p2pSearch;
+            pMsg->skipDfsChnlInP2pSearch = pScanReq->skipDfsChnlInP2pSearch;
 #endif
 
         }while(0);
@@ -4965,6 +5077,7 @@
             }//Allocate memory for SSID List
 #ifdef WLAN_FEATURE_P2P
             pDstReq->p2pSearch = pSrcReq->p2pSearch;
+            pDstReq->skipDfsChnlInP2pSearch = pSrcReq->skipDfsChnlInP2pSearch;
 #endif
 
         }
@@ -5807,7 +5920,7 @@
                 break;
             pScanCmd->u.scanCmd.roamId = roamId;
             pScanCmd->command = eSmeCommandScan;
-            pScanCmd->sessionId = (tANI_U8)sessionId; 
+            pScanCmd->sessionId = (tANI_U8)sessionId;
             pScanCmd->u.scanCmd.callback = NULL;
             pScanCmd->u.scanCmd.pContext = NULL;
             pScanCmd->u.scanCmd.reason = eCsrScanForSsid;
@@ -5817,7 +5930,31 @@
             pScanCmd->u.scanCmd.u.scanRequest.maxChnTime = pMac->roam.configParam.nActiveMaxChnTime;
             pScanCmd->u.scanCmd.u.scanRequest.minChnTime = pMac->roam.configParam.nActiveMinChnTime;
             pScanCmd->u.scanCmd.u.scanRequest.BSSType = pProfile->BSSType;
-            pScanCmd->u.scanCmd.u.scanRequest.uIEFieldLen = 0;
+            // To avoid 11b rate in probe request Set p2pSearch flag as 1 for P2P Client Mode
+            if(VOS_P2P_CLIENT_MODE == pProfile->csrPersona)
+            {
+                pScanCmd->u.scanCmd.u.scanRequest.p2pSearch = 1;
+            }
+            if(pProfile->pAddIEScan)
+            {
+                status = palAllocateMemory(pMac->hHdd,
+                                (void **)&pScanCmd->u.scanCmd.u.scanRequest.pIEField,
+                                pProfile->nAddIEScanLength);
+                palZeroMemory(pMac->hHdd, pScanCmd->u.scanCmd.u.scanRequest.pIEField, pProfile->nAddIEScanLength);
+                if(HAL_STATUS_SUCCESS(status))
+                {
+                    palCopyMemory(pMac->hHdd, pScanCmd->u.scanCmd.u.scanRequest.pIEField, pProfile->pAddIEScan, pProfile->nAddIEScanLength);
+                    pScanCmd->u.scanCmd.u.scanRequest.uIEFieldLen = pProfile->nAddIEScanLength;
+                }
+                else
+                {
+                    smsLog(pMac, LOGE, "No memory for scanning IE fields\n");
+                }
+            } //Allocate memory for IE field
+            else
+            {
+                pScanCmd->u.scanCmd.u.scanRequest.uIEFieldLen = 0;
+            }
             if(pProfile->BSSIDs.numOfBSSIDs == 1)
             {
                 palCopyMemory(pMac->hHdd, pScanCmd->u.scanCmd.u.scanRequest.bssid, pProfile->BSSIDs.bssid, sizeof(tCsrBssid));
@@ -6480,3 +6617,4 @@
 
 
 
+
diff --git a/CORE/SME/src/csr/csrInsideApi.h b/CORE/SME/src/csr/csrInsideApi.h
index b4e3437..90d6b22 100644
--- a/CORE/SME/src/csr/csrInsideApi.h
+++ b/CORE/SME/src/csr/csrInsideApi.h
@@ -51,6 +51,8 @@
 
 #define CSR_MAX_NUM_SUPPORTED_CHANNELS 55
 
+#define CSR_MAX_2_4_GHZ_SUPPORTED_CHANNELS 14
+
 #define CSR_MAX_BSS_SUPPORT            100
 
 //This number minus 1 means the number of times a channel is scanned before a BSS is remvoed from
@@ -76,7 +78,7 @@
 #define CSR_SCAN_AGING_TIME_CONNECT_NO_PS 150        //150 seconds
 #define CSR_SCAN_AGING_TIME_CONNECT_W_PS 600         //600 seconds
 #define CSR_JOIN_FAILURE_TIMEOUT_DEFAULT ( 3000 )
-#define CSR_JOIN_FAILURE_TIMEOUT_MIN   (300)  //minimal value
+#define CSR_JOIN_FAILURE_TIMEOUT_MIN   (1000)  //minimal value
 //These are going against the signed RSSI (tANI_S8) so it is between -+127
 #define CSR_BEST_RSSI_VALUE         (-30)   //RSSI >= this is in CAT4
 #define CSR_DEFAULT_RSSI_DB_GAP     30 //every 30 dbm for one category
@@ -126,6 +128,7 @@
     eCsrSilentlyStopRoaming,
     eCsrSilentlyStopRoamingSaveState,
     eCsrJoinWdsFailure,
+    eCsrJoinFailureDueToConcurrency,
     
 }eCsrRoamCompleteResult;
 
@@ -351,6 +354,7 @@
 tANI_U32 csrTranslateToWNICfgDot11Mode(tpAniSirGlobal pMac, eCsrCfgDot11Mode csrDot11Mode);
 void csrSaveChannelPowerForBand( tpAniSirGlobal pMac, tANI_BOOLEAN fPopulate5GBand );
 void csrApplyChannelPowerCountryInfo( tpAniSirGlobal pMac, tCsrChannel *pChannelList, tANI_U8 *countryCode);
+void csrApplyPower2Current( tpAniSirGlobal pMac );
 void csrAssignRssiForCategory(tpAniSirGlobal pMac, tANI_U8 catOffset);
 tANI_BOOLEAN csrIsMacAddressZero( tpAniSirGlobal pMac, tCsrBssid *pMacAddr );
 tANI_BOOLEAN csrIsMacAddressBroadcast( tpAniSirGlobal pMac, tCsrBssid *pMacAddr );
@@ -366,7 +370,7 @@
 #ifdef FEATURE_WLAN_WAPI
 void csrResetBKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId );
 #endif /* FEATURE_WLAN_WAPI */
-void csrSaveToChannelPower2G_5G( tpAniSirGlobal pMac, tANI_U32 tableSize, tSirMacChanInfo *channelTable );
+eHalStatus csrSaveToChannelPower2G_5G( tpAniSirGlobal pMac, tANI_U32 tableSize, tSirMacChanInfo *channelTable );
 //Get the list of the base channels to scan for passively 11d info
 eHalStatus csrScanGetSupportedChannels( tpAniSirGlobal pMac );
 //To check whether a country code matches the one in the IE
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index c1d710e..e2919d1 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -375,7 +375,15 @@
 
     /* Abort any ongoing BG scans */
     if (eANI_BOOLEAN_TRUE == pNeighborRoamInfo->scanRspPending)
+    {
+        if( pMac->roam.neighborRoamInfo.neighborRoamState != eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)
+        {
+            smsLog(pMac, LOGE, FL("Connected during scan state and we didn't"
+                                    "transition to state"));
+            VOS_ASSERT(0);
+        }
         csrScanAbortMacScan(pMac);
+    }
 
     pNeighborRoamInfo->scanRspPending = eANI_BOOLEAN_FALSE;
     
@@ -1133,11 +1141,13 @@
     vos_mem_zero(&pNeighborRoamInfo->FTRoamInfo.neighboReportBssInfo, sizeof(tCsrNeighborReportBssInfo) * MAX_BSS_IN_NEIGHBOR_RPT);
 #endif
 
+    /* Transition to CONNECTED state */
+    CSR_NEIGHBOR_ROAM_STATE_TRANSITION(eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)
+
     /* Reset all the necessary variables before transitioning to the CONNECTED state */
     csrNeighborRoamResetConnectedStateControlInfo(pMac);
 
-    /* Transition to CONNECTED state */
-    CSR_NEIGHBOR_ROAM_STATE_TRANSITION(eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)
+   
     /* Re-register Neighbor Lookup threshold callback with TL */
     NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("Registering DOWN event neighbor lookup callback with TL for RSSI = %d"), pNeighborRoamInfo->currentNeighborLookupThreshold * (-1)); 
     vosStatus = WLANTL_RegRSSIIndicationCB(pMac->roam.gVosContext, (v_S7_t)pNeighborRoamInfo->currentNeighborLookupThreshold * (-1),
@@ -1722,25 +1732,11 @@
         {
             if (pNeighborBssDesc->pNeighborBssDescription->channel)
             {
-                // Make sure to add only if its the same band
-                if ((pNeighborRoamInfo->currAPoperationChannel <= (RF_CHAN_14+1)) &&
-                    (pNeighborBssDesc->pNeighborBssDescription->channel <= (RF_CHAN_14+1)))
-                {
                         VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, 
                                 "%s: [INFOLOG] Adding %d to Neighbor channel list\n", __func__,
                                 pNeighborBssDesc->pNeighborBssDescription->channel);
                         channelList[numChannels] = pNeighborBssDesc->pNeighborBssDescription->channel;
                         numChannels++;
-                }
-                else if ((pNeighborRoamInfo->currAPoperationChannel >= RF_CHAN_128) &&
-                    (pNeighborBssDesc->pNeighborBssDescription->channel >= RF_CHAN_128))
-                {
-                        VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, 
-                                "%s: [INFOLOG] Adding %d to Neighbor channel list\n", __func__,
-                                pNeighborBssDesc->pNeighborBssDescription->channel);
-                        channelList[numChannels] = pNeighborBssDesc->pNeighborBssDescription->channel;
-                        numChannels++;
-                }
             }
         }
             
@@ -1762,27 +1758,12 @@
             {
                 if (pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList[i])
                 {
-                    // Make sure to add only if its the same band
-                    if ((pNeighborRoamInfo->currAPoperationChannel <= (RF_CHAN_14+1)) &&
-                        (pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList[i] <= (RF_CHAN_14+1)))
-                    {
                             VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, 
                                     "%s: [INFOLOG] Adding extra %d to Neighbor channel list\n", __func__,
                             pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList[i]);
                             channelList[numChannels] = 
                             pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList[i];
                             numChannels++;
-                    }
-                    if ((pNeighborRoamInfo->currAPoperationChannel >= RF_CHAN_128) &&
-                         (pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList[i] >= RF_CHAN_128))
-                    {
-                            VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, 
-                                    "%s: [INFOLOG] Adding extra %d to Neighbor channel list\n", __func__,
-                                pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList[i]);
-                            channelList[numChannels] = 
-                                pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList[i];
-                            numChannels++;
-                    }
                 }
             }
         }
@@ -1961,25 +1942,11 @@
         {
             if (pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i])
             {
-                // Make sure to add only if its the same band
-                if ((pNeighborRoamInfo->currAPoperationChannel <= (RF_CHAN_14+1)) &&
-                    (pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i] <= (RF_CHAN_14+1)))
-                {
                         VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, 
                                 "%s: [INFOLOG] Adding %d to Neighbor channel list\n", __func__,
                                 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i]);
                         channelList[numOfChannels] = pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
                         numOfChannels++;
-                }
-                if ((pNeighborRoamInfo->currAPoperationChannel >= RF_CHAN_128) &&
-                    (pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i] >= RF_CHAN_128))
-                {
-                        VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, 
-                                "%s: [INFOLOG] Adding %d to Neighbor channel list\n", __func__,
-                                pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i]);
-                        channelList[numOfChannels] = pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
-                        numOfChannels++;
-                }
             }
         }
 
@@ -2096,12 +2063,13 @@
 
     pNeighborRoamInfo->currentNeighborLookupThreshold = pNeighborRoamInfo->cfgParams.neighborLookupThreshold;
     
-    /* Reset all the neighbor roam info control variables. Free all the allocated memory. It is like we are just associated now */
-    csrNeighborRoamResetConnectedStateControlInfo(pMac);
-
     /* Recheck whether the below check is needed. */
     if (pNeighborRoamInfo->neighborRoamState != eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)
         CSR_NEIGHBOR_ROAM_STATE_TRANSITION(eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)
+
+    /* Reset all the neighbor roam info control variables. Free all the allocated memory. It is like we are just associated now */
+    csrNeighborRoamResetConnectedStateControlInfo(pMac);
+
     
     NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("Registering DOWN event neighbor lookup callback with TL. RSSI = %d,"), pNeighborRoamInfo->currentNeighborLookupThreshold * (-1));
     /* Register Neighbor Lookup threshold callback with TL for DOWN event now */
diff --git a/CORE/SME/src/csr/csrUtil.c b/CORE/SME/src/csr/csrUtil.c
index 37f3780..079becc 100644
--- a/CORE/SME/src/csr/csrUtil.c
+++ b/CORE/SME/src/csr/csrUtil.c
@@ -44,6 +44,8 @@
 #include "csrInsideApi.h"
 #include "smsDebug.h"
 #include "smeQosInternal.h"
+#include "wlan_qct_wda.h"
+
 #ifdef FEATURE_WLAN_CCX
 #include "vos_utils.h"
 #include "csrCcx.h"
@@ -1166,7 +1168,6 @@
 
 extern const tRfChannelProps rfChannels[NUM_RF_CHANNELS];
 
-
 ////////////////////////////////////////////////////////////////////////
 
 /**
@@ -1374,6 +1375,19 @@
         csrIsConnStateDisconnectedWds( pMac, sessionId ) );
 }
 
+tANI_BOOLEAN csrIsConnStateAp( tpAniSirGlobal pMac,  tANI_U32 sessionId )
+{
+    tCsrRoamSession *pSession;
+    pSession = CSR_GET_SESSION(pMac, sessionId);
+    if (!pSession)
+        return eANI_BOOLEAN_FALSE;
+    if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
+    {
+        return eANI_BOOLEAN_TRUE;
+    }
+    return eANI_BOOLEAN_FALSE;
+}
+
 tANI_BOOLEAN csrIsAnySessionInConnectState( tpAniSirGlobal pMac )
 {
     tANI_U32 i;
@@ -1381,8 +1395,10 @@
 
     for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
     {
-        if( CSR_IS_SESSION_VALID( pMac, i ) && 
-            ( csrIsConnStateInfra( pMac, i ) || csrIsConnStateIbss( pMac, i ) ) )
+        if( CSR_IS_SESSION_VALID( pMac, i ) &&
+            ( csrIsConnStateInfra( pMac, i )
+            || csrIsConnStateIbss( pMac, i )
+            || csrIsConnStateAp( pMac, i) ) )
         {
             fRc = eANI_BOOLEAN_TRUE;
             break;
@@ -1550,6 +1566,56 @@
     return ( fRc );
 }
 
+tANI_BOOLEAN csrIsConcurrentSessionRunning( tpAniSirGlobal pMac )
+{
+    tANI_U32 sessionId, noOfCocurrentSession = 0;
+    eCsrConnectState connectState;
+
+    tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
+
+    for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
+    {
+        if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
+        {
+           connectState =  pMac->roam.roamSession[sessionId].connectState;
+           if( (eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED == connectState) ||
+               (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED == connectState) ||
+               (eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED == connectState) )
+           {
+              ++noOfCocurrentSession;
+           }
+        }
+    }
+
+    // More than one session is Up and Running
+    if(noOfCocurrentSession > 1)
+    {
+        fRc = eANI_BOOLEAN_TRUE;
+    }
+
+    return ( fRc );
+}
+
+#ifndef BMPS_WORKAROUND_NOT_NEEDED
+tANI_BOOLEAN csrIsInfraApStarted( tpAniSirGlobal pMac )
+{
+    tANI_U32 sessionId;
+    tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
+
+    for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
+    {
+        if( CSR_IS_SESSION_VALID( pMac, sessionId ) && (csrIsConnStateConnectedInfraAp(pMac, sessionId)) )
+        {
+            fRc = eANI_BOOLEAN_TRUE;
+            break;
+        }
+    }
+
+    return ( fRc );
+
+}
+#endif
+
 tANI_BOOLEAN csrIsBTAMP( tpAniSirGlobal pMac, tANI_U32 sessionId )
 {
     return ( csrIsConnStateConnectedWds( pMac, sessionId ) );
@@ -1561,23 +1627,24 @@
     return (eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED == pMac->roam.roamSession[sessionId].connectState);
 }
 
-tANI_BOOLEAN csrIsValidMcConcurrentSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
+tANI_BOOLEAN csrIsValidMcConcurrentSession(tpAniSirGlobal pMac, tANI_U32 sessionId,
+                                                  tSirBssDescription *pBssDesc)
 {
     tCsrRoamSession *pSession = NULL;
     tANI_U8 Index = 0, ConnId = 0;
+    eAniBoolean status = eANI_BOOLEAN_FALSE;
+
     tVOS_CON_MODE Mode[CSR_ROAM_SESSION_MAX];
 
     //Check for MCC support
     if (!pMac->roam.configParam.fenableMCCMode)
     {
-        return eANI_BOOLEAN_FALSE;
+        return status;
     }
 
-    for( Index = 0; Index < CSR_ROAM_SESSION_MAX; Index++ ) 
-        Mode[Index] = VOS_MAX_NO_OF_MODE;
- 
     for( Index = 0; Index < CSR_ROAM_SESSION_MAX; Index++ )
     {
+        Mode[Index] = VOS_MAX_NO_OF_MODE;
         if( CSR_IS_SESSION_VALID( pMac, Index ) )
         {
             pSession = CSR_GET_SESSION( pMac, Index );
@@ -1596,7 +1663,8 @@
         switch (Mode[Index+1])
         {
             case VOS_P2P_CLIENT_MODE :
-              return eANI_BOOLEAN_TRUE;
+                status = eANI_BOOLEAN_TRUE;
+                break;
             case VOS_MAX_NO_OF_MODE :
             default :
                  break;
@@ -1607,14 +1675,44 @@
         switch (Mode[Index +1])
         {
             case VOS_STA_MODE :
-                return eANI_BOOLEAN_TRUE;
+                status = eANI_BOOLEAN_TRUE;
+                break;
+
             case VOS_MAX_NO_OF_MODE :
             default :
                 break;
          }
     }
 
-    return eANI_BOOLEAN_FALSE;
+    //Validate BeaconInterval
+    if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
+    {
+        pSession = CSR_GET_SESSION( pMac, sessionId );
+        if (NULL != pSession->pCurRoamProfile)
+        {
+            if(csrIsconcurrentsessionValid (pMac, sessionId, 
+                                       pSession->pCurRoamProfile->csrPersona) 
+                                       == eHAL_STATUS_SUCCESS )
+            {
+                if(csrValidateBeaconInterval( pMac, pBssDesc->channelId, 
+                               &pBssDesc->beaconInterval, sessionId, 
+                               pSession->pCurRoamProfile->csrPersona) 
+                               != eHAL_STATUS_SUCCESS)
+                {
+                    status = eANI_BOOLEAN_FALSE;
+                }
+                else
+                {
+                    status = eANI_BOOLEAN_TRUE;
+                }
+            }
+            else
+            {
+                status = eANI_BOOLEAN_FALSE;
+            }
+         }
+     }
+    return status;
 }
 
 static tSirMacCapabilityInfo csrGetBssCapabilities( tSirBssDescription *pSirBssDesc )
@@ -1985,11 +2083,18 @@
             break;
 
         case eSIR_11N_NW_TYPE:
-        default:
             phyMode = eCSR_DOT11_MODE_11n;
             break;
+#ifdef WLAN_FEATURE_11AC
+        case eSIR_11AC_NW_TYPE:
+        default:
+            phyMode = eCSR_DOT11_MODE_11ac;
+#else
+        default:
+            phyMode = eCSR_DOT11_MODE_11n;
+#endif
+            break;
     }
-
     return( phyMode );
 }
 
@@ -2041,6 +2146,15 @@
        ret = WNI_CFG_DOT11_MODE_11N_ONLY;
        break;
 #endif
+
+#ifdef WLAN_FEATURE_11AC
+     case eCSR_CFG_DOT11_MODE_11AC_ONLY:
+        ret = WNI_CFG_DOT11_MODE_11AC_ONLY;
+        break;
+     case eCSR_CFG_DOT11_MODE_11AC:
+        ret = WNI_CFG_DOT11_MODE_11AC;
+       break;
+#endif
     default:
         smsLog(pMac, LOGW, FL("doesn't expect %d as csrDo11Mode\n"), csrDot11Mode);
         if(eCSR_BAND_24 == pMac->roam.configParam.eBand)
@@ -2081,6 +2195,13 @@
         {
             phyMode = eCSR_DOT11_MODE_11n;
         }
+
+#ifdef WLAN_FEATURE_11AC
+        if ( pIes->VHTCaps.present && (eCSR_DOT11_MODE_TAURUS != phyMode))
+        {
+             phyMode = eCSR_DOT11_MODE_11ac;
+        }
+#endif
         *pPhyMode = phyMode;
     }
 
@@ -2190,9 +2311,19 @@
                 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
                 break;
             case eCSR_DOT11_MODE_11n:
+#ifdef WLAN_FEATURE_11AC
+            case eCSR_DOT11_MODE_11ac:
+#endif
+                cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
+                break;
+
             case eCSR_DOT11_MODE_TAURUS:
             default:
+#ifdef WLAN_FEATURE_11AC
+                cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
+#else
                 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
+#endif
                 break;
             }
             break;
@@ -2202,9 +2333,44 @@
             {
                 fMatch = TRUE;
                 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
+
+            }
+
+            break;
+#ifdef WLAN_FEATURE_11AC
+        case eCSR_DOT11_MODE_11ac:
+            fMatch = TRUE;
+            switch(bssPhyMode)
+            {
+            case eCSR_DOT11_MODE_11g:
+                cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
+                break;
+            case eCSR_DOT11_MODE_11b:
+                cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
+                break;
+            case eCSR_DOT11_MODE_11a:
+                cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
+                break;
+            case eCSR_DOT11_MODE_11n:
+                cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
+                break;
+            case eCSR_DOT11_MODE_11ac:
+            case eCSR_DOT11_MODE_TAURUS:
+            default:
+                cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
+                break;
             }
             break;
 
+        case eCSR_DOT11_MODE_11ac_ONLY:
+            if((eCSR_DOT11_MODE_11ac == bssPhyMode) || (eCSR_DOT11_MODE_TAURUS == bssPhyMode))
+            {
+                fMatch = TRUE;
+                cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
+            }
+            break;
+#endif
+
         case eCSR_DOT11_MODE_TAURUS:
         default:
             fMatch = TRUE;
@@ -2222,20 +2388,32 @@
             case eCSR_DOT11_MODE_11n:
                 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
                 break;
+#ifdef WLAN_FEATURE_11AC
+            case eCSR_DOT11_MODE_11ac:
+                cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
+                break;
+#endif
             case eCSR_DOT11_MODE_TAURUS:
             default:
                 cfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
                 break;
             }
             break;
-
     }
 
     if ( fMatch && pCfgDot11ModeToUse )
     {
-        *pCfgDot11ModeToUse = cfgDot11Mode;
+#ifdef WLAN_FEATURE_11AC
+        if(cfgDot11Mode == eCSR_CFG_DOT11_MODE_11AC && !WDA_getFwWlanFeatCaps(DOT11AC))
+        {
+            *pCfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
+        }
+        else
+#endif
+        {
+            *pCfgDot11ModeToUse = cfgDot11Mode;
+        }
     }
-
     return( fMatch );
 }
 
@@ -2270,7 +2448,13 @@
                 }
                 else
                 {
+
+#ifdef WLAN_FEATURE_11AC
+                    phyMode = eCSR_DOT11_MODE_11ac;
+#else
                     phyMode = eCSR_DOT11_MODE_11n;
+#endif
+
                 }
             }
             else
@@ -2324,6 +2508,9 @@
                  */
                 if( (!CSR_IS_11n_ALLOWED( pProfile->negotiatedUCEncryptionType )) &&
                     ((eCSR_CFG_DOT11_MODE_11N == cfgDot11ModeToUse) ||
+#ifdef WLAN_FEATURE_11AC
+                     (eCSR_CFG_DOT11_MODE_11AC == cfgDot11ModeToUse) ||
+#endif
                      (eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11ModeToUse)) )
                 {
                     //We cannot do 11n here
@@ -2350,6 +2537,16 @@
     eCsrCfgDot11Mode cfgDot11ModeToUse;
     eCsrBand eBand = pMac->roam.configParam.eBand;
 
+
+#ifdef WLAN_FEATURE_11AC
+    if ( (0 == phyMode) || (eCSR_DOT11_MODE_AUTO & phyMode) || (eCSR_DOT11_MODE_TAURUS & phyMode)
+       ||(eCSR_DOT11_MODE_11ac & phyMode))
+    {
+        cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11AC;
+    }
+    else
+#endif
+
     if ( (0 == phyMode) || (eCSR_DOT11_MODE_AUTO & phyMode) || (eCSR_DOT11_MODE_TAURUS & phyMode))
     {
         cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
@@ -2490,6 +2687,214 @@
     return( fRSNProfile );
 }
 
+eHalStatus
+csrIsconcurrentsessionValid(tpAniSirGlobal pMac,tANI_U32 cursessionId,
+                                 tVOS_CON_MODE currBssPersona)
+{
+    tANI_U32 sessionId = 0;
+
+    for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
+    {
+        if (cursessionId != sessionId )
+        {
+            if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
+            {
+                continue;
+            }
+
+            switch (currBssPersona)
+            {
+                case VOS_STA_MODE:
+                    if(pMac->roam.roamSession[sessionId].pCurRoamProfile &&
+                      (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona 
+                                      == VOS_STA_MODE)) //check for P2P client mode
+                    {
+                        smsLog(pMac, LOGE, FL(" ****STA mode already exists ****\n"));
+                        return eHAL_STATUS_FAILURE;
+                    }
+                    break;
+
+                case VOS_STA_SAP_MODE:
+                    if(pMac->roam.roamSession[sessionId].bssParams.bssPersona
+                                      == VOS_STA_SAP_MODE)
+                    {
+                        smsLog(pMac, LOGE, FL(" ****SoftAP mode already exists ****\n"));
+                        return eHAL_STATUS_FAILURE;
+                    }
+                    
+                    else if(pMac->roam.roamSession[sessionId].bssParams.bssPersona
+                                      == VOS_P2P_GO_MODE)
+                    {
+                        smsLog(pMac, LOGE, FL(" ****Cannot start Multiple Beaconing Role ****\n"));
+                        return eHAL_STATUS_FAILURE;
+                    }
+                    break;
+
+                case VOS_P2P_CLIENT_MODE:
+                    if(pMac->roam.roamSession[sessionId].pCurRoamProfile &&
+                      (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona 
+                                                  == VOS_P2P_CLIENT_MODE)) //check for P2P client mode
+                    {
+                        smsLog(pMac, LOGE, FL(" ****CLIENT mode already exists ****\n"));
+                        return eHAL_STATUS_FAILURE;
+                    }
+                    break;
+
+                case VOS_P2P_GO_MODE:
+                    if(pMac->roam.roamSession[sessionId].bssParams.bssPersona
+                                      == VOS_P2P_GO_MODE)
+                    {
+                        smsLog(pMac, LOGE, FL(" ****P2P GO mode already exists ****\n"));
+                        return eHAL_STATUS_FAILURE;
+                    }
+                    else if(pMac->roam.roamSession[sessionId].bssParams.bssPersona
+                                      == VOS_STA_SAP_MODE)
+                    {
+                        smsLog(pMac, LOGE, FL(" ****Cannot start Multiple Beaconing Role ****\n"));
+                        return eHAL_STATUS_FAILURE;
+                    }
+                    break;
+
+                default :
+                    smsLog(pMac, LOGE, FL("***Persona not handled = %d*****\n"),currBssPersona);
+                    break;
+            }
+        }
+    }
+    return eHAL_STATUS_SUCCESS;
+
+}
+
+eHalStatus csrValidateBeaconInterval(tpAniSirGlobal pMac, tANI_U8 channelId, 
+                                     tANI_U16 *beaconInterval, tANI_U32 cursessionId,
+                                     tVOS_CON_MODE currBssPersona)
+{
+    tANI_U32 sessionId = 0;
+
+    //If MCC is not supported just break and return SUCCESS
+    if ( !IS_MCC_SUPPORTED && !pMac->roam.configParam.fenableMCCMode){
+        return eHAL_STATUS_FAILURE;
+    }
+
+    for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
+    {
+        if (cursessionId != sessionId )
+        {
+            if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
+            {
+                continue;
+            }
+
+            switch (currBssPersona)
+            {
+                case VOS_STA_MODE:
+                    if(pMac->roam.roamSession[sessionId].pCurRoamProfile &&
+                      (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona 
+                                      == VOS_P2P_CLIENT_MODE)) //check for P2P client mode
+                    {
+                        smsLog(pMac, LOG1, FL(" Beacon Interval Validation not required for STA/CLIENT\n"));
+                    }
+                    //IF SAP has started and STA wants to connect on different channel MCC should
+                    //MCC should not be enabled so making it false to enforce on same channel
+                    else if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
+                                      == VOS_STA_SAP_MODE)
+                    {
+                        if (pMac->roam.roamSession[sessionId].bssParams.operationChn 
+                                                        != channelId )
+                        {
+                            smsLog(pMac, LOGE, FL("***MCC is not enabled for SAP +STA****\n"));
+                            return eHAL_STATUS_FAILURE;
+                        }
+                    }
+                    else if(pMac->roam.roamSession[sessionId].bssParams.bssPersona
+                                      == VOS_P2P_GO_MODE) //Check for P2P go scenario
+                    {
+                        if ((pMac->roam.roamSession[sessionId].bssParams.operationChn 
+                                != channelId ) &&
+                            (pMac->roam.roamSession[sessionId].bssParams.beaconInterval 
+                                != *beaconInterval))
+                        {
+                            smsLog(pMac, LOGE, FL("BeaconInteval is different cannot connect to prefered AP...\n"));
+                            return eHAL_STATUS_FAILURE;
+                        }
+                    }
+                    break;
+
+                case VOS_P2P_CLIENT_MODE:
+                    if(pMac->roam.roamSession[sessionId].pCurRoamProfile &&
+                      (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona 
+                                                                == VOS_STA_MODE)) //check for P2P client mode
+                    {
+                        smsLog(pMac, LOG1, FL(" Ignore Beacon Interval Validation...\n"));
+                    }
+                    //IF SAP has started and STA wants to connect on different channel MCC should
+                    //MCC should not be enabled so making it false to enforce on same channel
+                    else if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
+                                      == VOS_STA_SAP_MODE)
+                    {
+                        if (pMac->roam.roamSession[sessionId].bssParams.operationChn 
+                                                        != channelId )
+                        {
+                            smsLog(pMac, LOGE, FL("***MCC is not enabled for SAP + CLIENT****\n"));
+                            return eHAL_STATUS_FAILURE;
+                        }
+                    }
+                    else if(pMac->roam.roamSession[sessionId].bssParams.bssPersona
+                                    == VOS_P2P_GO_MODE) //Check for P2P go scenario
+                    {
+                        if ((pMac->roam.roamSession[sessionId].bssParams.operationChn 
+                                != channelId ) &&
+                            (pMac->roam.roamSession[sessionId].bssParams.beaconInterval 
+                                != *beaconInterval))
+                        {
+                            smsLog(pMac, LOGE, FL("BeaconInteval is different cannot connect to P2P_GO network ...\n"));
+                            return eHAL_STATUS_FAILURE;
+                        }
+                    }
+                    break;
+
+                case VOS_P2P_GO_MODE :
+                    if(pMac->roam.roamSession[sessionId].pCurRoamProfile  && 
+                      ((pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona 
+                            == VOS_P2P_CLIENT_MODE)
+                     || (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona 
+                            == VOS_STA_MODE))) //check for P2P_client scenario
+                    {
+                        if ((pMac->roam.roamSession[sessionId].connectedProfile.operationChannel 
+                               == 0 )&&
+                           (pMac->roam.roamSession[sessionId].connectedProfile.beaconInterval
+                               == 0))
+                        {
+                            continue;
+                        }
+
+                            
+                        if (csrIsConnStateConnectedInfra(pMac, sessionId) &&
+                           (pMac->roam.roamSession[sessionId].connectedProfile.operationChannel 
+                                != channelId ) &&
+                           (pMac->roam.roamSession[sessionId].connectedProfile.beaconInterval 
+                                != *beaconInterval))
+                        {
+                            /*
+                             * Updated beaconInterval should be used only when we are starting a new BSS 
+                             * not incase of client or STA case
+                             */
+                            *beaconInterval = 
+                                pMac->roam.roamSession[sessionId].connectedProfile.beaconInterval;
+                            return eHAL_STATUS_SUCCESS;
+                         }
+                    }
+                    break;
+
+                default :
+                    smsLog(pMac, LOG1, FL(" Persona not supported : %d\n"),currBssPersona);
+                    return eHAL_STATUS_FAILURE;
+            }
+        }
+    }
+
+    return eHAL_STATUS_SUCCESS;
+}
 
 #ifdef WLAN_FEATURE_VOWIFI_11R
 /* Function to return TRUE if the authtype is 11r */
@@ -5361,6 +5766,22 @@
     case eCSR_DOT11_MODE_AUTO:
         cfgDot11Mode = eCSR_CFG_DOT11_MODE_AUTO;
         break;
+
+#ifdef WLAN_FEATURE_11AC
+    case eCSR_DOT11_MODE_11ac:
+	if (!WDA_getFwWlanFeatCaps(DOT11AC))
+	{
+		cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
+	}
+	else
+	{
+		cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
+	}
+        break;
+    case eCSR_DOT11_MODE_11ac_ONLY:
+        cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC_ONLY;
+        break;
+#endif
     default:
         //No need to assign anything here
         break;
@@ -5808,6 +6229,7 @@
    return (0);
 }
 
+#ifndef BMPS_WORKAROUND_NOT_NEEDED
 /* Disconnect all active sessions by sending disassoc. This is mainly used to disconnect the remaining session when we 
  * transition from concurrent sessions to a single session. The use case is Infra STA and wifi direct multiple sessions are up and 
  * P2P session is removed. The Infra STA session remains and should resume BMPS if BMPS is enabled by default. However, there
@@ -5827,3 +6249,4 @@
         }
     }
 }
+#endif
diff --git a/CORE/SME/src/meas/measApi.c b/CORE/SME/src/meas/measApi.c
deleted file mode 100644
index 1e9b029..0000000
--- a/CORE/SME/src/meas/measApi.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2012, Code Aurora Forum. 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.
- */
-
diff --git a/CORE/SME/src/oemData/oemDataApi.c b/CORE/SME/src/oemData/oemDataApi.c
new file mode 100644
index 0000000..1020373
--- /dev/null
+++ b/CORE/SME/src/oemData/oemDataApi.c
@@ -0,0 +1,398 @@
+/*
+ * Copyright (c) 2012, Code Aurora Forum. 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.
+ */
+
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/** ------------------------------------------------------------------------- * 
+    ------------------------------------------------------------------------- *  
+
+  
+    \file oemDataApi.c
+  
+    Implementation for the OEM DATA REQ/RSP interfaces.
+  
+    Copyright (C) 2010 Qualcomm Incorporated.
+  
+ 
+   ========================================================================== */
+#include "aniGlobal.h"
+#include "oemDataApi.h"
+#include "palApi.h"
+#include "smeInside.h"
+#include "smsDebug.h"
+
+#include "csrSupport.h"
+#include "wlan_qct_tl.h"
+
+#include "vos_diag_core_log.h"
+#include "vos_diag_core_event.h"
+
+/* ---------------------------------------------------------------------------
+    \fn oemData_OemDataReqOpen
+    \brief This function must be called before any API call to (OEM DATA REQ/RSP module)
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+
+eHalStatus oemData_OemDataReqOpen(tHalHandle hHal)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+
+    do
+    {
+        //initialize all the variables to null
+        vos_mem_set(&(pMac->oemData), sizeof(tOemDataStruct), 0);
+        if(!HAL_STATUS_SUCCESS(status))
+        {
+            smsLog(pMac, LOGE, "oemData_OemDataReqOpen: Cannot allocate memory for the timer function\n");
+            break;
+        }
+    } while(0);
+
+    return status;
+}
+
+/* ---------------------------------------------------------------------------
+    \fn oemData_OemDataReqClose
+    \brief This function must be called before closing the csr module
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+
+eHalStatus oemData_OemDataReqClose(tHalHandle hHal)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+
+    do
+    {
+        if(!HAL_STATUS_SUCCESS(status))
+        {
+            smsLog(pMac, LOGE, "oemData_OemDataReqClose: Failed in oemData_OemDataReqClose at StopTimers\n");
+            break;
+        }
+
+        if(pMac->oemData.pOemDataRsp != NULL)
+        {
+            vos_mem_free(pMac->oemData.pOemDataRsp);
+        }
+        
+        //initialize all the variables to null
+        vos_mem_set(&(pMac->oemData), sizeof(tOemDataStruct), 0);
+    } while(0);
+
+    return eHAL_STATUS_SUCCESS;
+}
+
+/* ---------------------------------------------------------------------------
+    \fn oemData_ReleaseOemDataReqCommand
+    \brief This function removes the oemDataCommand from the active list and 
+           and frees up any memory occupied by this
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+void oemData_ReleaseOemDataReqCommand(tpAniSirGlobal pMac, tSmeCmd *pOemDataCmd, eOemDataReqStatus oemDataReqStatus)
+{
+    //Do the callback
+    pOemDataCmd->u.oemDataCmd.callback(pMac, pOemDataCmd->u.oemDataCmd.pContext, pOemDataCmd->u.oemDataCmd.oemDataReqID, oemDataReqStatus);
+
+    //First take this command out of the active list
+    if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, &pOemDataCmd->Link, LL_ACCESS_LOCK))
+    {
+        vos_mem_set(&(pOemDataCmd->u.oemDataCmd), sizeof(tOemDataCmd), 0);
+
+        //Now put this command back on the avilable command list
+        smeReleaseCommand(pMac, pOemDataCmd);
+    }
+    else
+    {
+        smsLog(pMac, LOGE, "OEM_DATA: **************** oemData_ReleaseOemDataReqCommand cannot release the command\n");
+    }
+}
+
+/* ---------------------------------------------------------------------------
+    \fn oemData_OemDataReq
+    \brief Request an OEM DATA RSP
+    \param sessionId - Id of session to be used
+    \param pOemDataReqID - pointer to an object to get back the request ID
+    \param callback - a callback function that is called upon finish
+    \param pContext - a pointer passed in for the callback
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+eHalStatus oemData_OemDataReq(tHalHandle hHal, 
+                                tANI_U8 sessionId,
+                                tOemDataReqConfig *oemDataReqConfig, 
+                                tANI_U32 *pOemDataReqID, 
+                                oemData_OemDataReqCompleteCallback callback, 
+                                void *pContext)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+    tSmeCmd *pOemDataCmd = NULL;
+
+    do 
+    {
+        if( !CSR_IS_SESSION_VALID( pMac, sessionId ) )
+        {
+           status = eHAL_STATUS_FAILURE;
+           break;
+        }
+
+        pMac->oemData.oemDataReqConfig.sessionId = sessionId;
+        pMac->oemData.callback = callback;
+        pMac->oemData.pContext = pContext;
+        pMac->oemData.oemDataReqID = *(pOemDataReqID);
+    
+        vos_mem_copy((v_VOID_t*)(pMac->oemData.oemDataReqConfig.oemDataReq), (v_VOID_t*)(oemDataReqConfig->oemDataReq), OEM_DATA_REQ_SIZE);
+    
+        pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
+    
+        pOemDataCmd = smeGetCommandBuffer(pMac);
+    
+        //fill up the command before posting it.
+        if(pOemDataCmd)
+        {
+            pOemDataCmd->command = eSmeCommandOemDataReq;
+            pOemDataCmd->u.oemDataCmd.callback = callback;
+            pOemDataCmd->u.oemDataCmd.pContext = pContext;
+            pOemDataCmd->u.oemDataCmd.oemDataReqID = pMac->oemData.oemDataReqID;
+    
+            //set the oem data request
+            pOemDataCmd->u.oemDataCmd.oemDataReq.sessionId = pMac->oemData.oemDataReqConfig.sessionId;
+            vos_mem_copy((v_VOID_t*)(pOemDataCmd->u.oemDataCmd.oemDataReq.oemDataReq), 
+                                    (v_VOID_t*)(pMac->oemData.oemDataReqConfig.oemDataReq), OEM_DATA_REQ_SIZE);
+        }
+        else
+        {
+            status = eHAL_STATUS_FAILURE;
+            break;
+        }
+    
+        //now queue this command in the sme command queue
+        //Here since this is not interacting with the csr just push the command
+        //into the sme queue. Also push this command with the normal priority
+        smePushCommand(pMac, pOemDataCmd, eANI_BOOLEAN_FALSE);
+
+    } while(0);
+
+    if(!HAL_STATUS_SUCCESS(status) && pOemDataCmd)
+    {
+        oemData_ReleaseOemDataReqCommand(pMac, pOemDataCmd, eOEM_DATA_REQ_FAILURE);
+        pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
+    }
+
+    return status;
+}
+
+/* ---------------------------------------------------------------------------
+    \fn oemData_SendMBOemDataReq
+    \brief Request an OEM DATA REQ to be passed down to PE
+    \param pMac:
+    \param pOemDataReq: Pointer to the oem data request
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+eHalStatus oemData_SendMBOemDataReq(tpAniSirGlobal pMac, tOemDataReq *pOemDataReq)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    tSirOemDataReq* pMsg;
+    tANI_U16 msgLen;
+    tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pOemDataReq->sessionId );
+
+    smsLog(pMac, LOGW, "OEM_DATA: entering Function %s\n", __FUNCTION__);
+    
+    msgLen = (tANI_U16)(sizeof(tSirOemDataReq));
+
+    status = palAllocateMemory(pMac->hHdd, (void**)&pMsg, msgLen);
+    if(HAL_STATUS_SUCCESS(status))
+    {
+        palZeroMemory(pMac->hHdd, pMsg, msgLen);
+        pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_OEM_DATA_REQ);
+        palCopyMemory(pMac->hHdd, pMsg->selfMacAddr, pSession->selfMacAddr, sizeof(tSirMacAddr) );
+        status = palCopyMemory(pMac->hHdd, pMsg->oemDataReq, pOemDataReq->oemDataReq, OEM_DATA_REQ_SIZE);
+        if(HAL_STATUS_SUCCESS(status))
+        {
+            smsLog(pMac, LOGW, "OEM_DATA: sending message to pe%s\n", __FUNCTION__);
+            status = palSendMBMessage(pMac->hHdd, pMsg);
+        }
+        else
+        {
+            palFreeMemory(pMac->hHdd, pMsg);
+        }
+    }
+
+    smsLog(pMac, LOGW, "OEM_DATA: exiting Function %s\n", __FUNCTION__);
+
+    return status;
+}
+
+/* ---------------------------------------------------------------------------
+    \fn oemData_ProcessOemDataReqCommand
+    \brief This function is called by the smeProcessCommand when the case hits
+           eSmeCommandOemDataReq
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+eHalStatus oemData_ProcessOemDataReqCommand(tpAniSirGlobal pMac, tSmeCmd *pOemDataReqCmd)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+
+    //check if the system is in proper mode of operation for 
+    //oem data req/rsp to be functional. Currently, concurrency is not
+    //supported and the driver must be operational only as 
+    //STA for oem data req/rsp to be functional. We return an invalid 
+    //mode flag if it is operational as any one of the following
+    //in any of the active sessions
+    //1. AP Mode
+    //2. IBSS Mode
+    //3. BTAMP Mode ...
+
+    if(eHAL_STATUS_SUCCESS == oemData_IsOemDataReqAllowed(pMac))
+    {
+        smsLog(pMac, LOG1, "%s: OEM_DATA REQ allowed in the current mode\n", __FUNCTION__);
+        pMac->oemData.oemDataReqActive = eANI_BOOLEAN_TRUE;
+        status = oemData_SendMBOemDataReq(pMac, &(pOemDataReqCmd->u.oemDataCmd.oemDataReq));
+    }
+    else
+    {
+        smsLog(pMac, LOG1, "%s: OEM_DATA REQ not allowed in the current mode\n", __FUNCTION__);
+        oemData_ReleaseOemDataReqCommand(pMac, pOemDataReqCmd, eOEM_DATA_REQ_INVALID_MODE);
+        pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
+    }
+
+    return status;
+}
+
+/* ---------------------------------------------------------------------------
+    \fn sme_HandleOemDataRsp
+    \brief This function processes the oem data response obtained from the PE
+    \param pMsg - Pointer to the pSirOemDataRsp
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+eHalStatus sme_HandleOemDataRsp(tHalHandle hHal, tANI_U8* pMsg)
+{
+    eHalStatus                         status = eHAL_STATUS_SUCCESS;
+    tpAniSirGlobal                     pMac;
+    tListElem                          *pEntry = NULL;
+    tSmeCmd                            *pCommand = NULL;
+    tSirOemDataRsp*                    pOemDataRsp = NULL;
+    pMac = PMAC_STRUCT(hHal);
+
+    smsLog(pMac, LOG1, "%s: OEM_DATA Entering\n", __FUNCTION__);
+
+    do
+    {
+        if(pMsg == NULL)
+        {
+            smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __FUNCTION__);
+            status = eHAL_STATUS_FAILURE;
+            break;
+        }
+    
+        pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
+        if(pEntry)
+        {
+            pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
+            if(eSmeCommandOemDataReq == pCommand->command)
+            {
+                pOemDataRsp = (tSirOemDataRsp*)pMsg;
+
+                //make sure to acquire the lock before modifying the data
+                status = sme_AcquireGlobalLock(&pMac->sme);
+                if(!HAL_STATUS_SUCCESS(status))
+                {
+                    break;
+                }
+
+                if(pMac->oemData.pOemDataRsp != NULL)
+                {
+                    vos_mem_free(pMac->oemData.pOemDataRsp);
+                }
+                pMac->oemData.pOemDataRsp = (tOemDataRsp*)vos_mem_malloc(sizeof(tOemDataRsp));
+
+                if(pMac->oemData.pOemDataRsp == NULL)
+                {
+                    sme_ReleaseGlobalLock(&pMac->sme);
+                    smsLog(pMac, LOGE, "in %s vos_mem_malloc failed for pMac->oemData.pOemDataRsp\n", __FUNCTION__);
+                    status = eHAL_STATUS_FAILURE;
+                    break;
+                }
+
+                smsLog(pMac, LOGE, "Before memory copy\n"); 
+                vos_mem_copy((v_VOID_t*)(pMac->oemData.pOemDataRsp), (v_VOID_t*)(&pOemDataRsp->oemDataRsp), sizeof(tOemDataRsp));
+                smsLog(pMac, LOGE, "after memory copy\n");
+                sme_ReleaseGlobalLock(&pMac->sme);
+            }
+            else
+            {
+                smsLog(pMac, LOGE, "in %s eWNI_SME_OEM_DATA_RSP Received but NO REQs are ACTIVE ...\n",
+                    __FUNCTION__);
+                status = eHAL_STATUS_FAILURE;
+                break;
+            }
+        }
+        else
+        {
+            smsLog(pMac, LOGE, "in %s eWNI_SME_OEM_DATA_RSP Received but NO commands are ACTIVE ...\n", __FUNCTION__);
+            status = eHAL_STATUS_FAILURE;
+            break;
+        }
+
+        oemData_ReleaseOemDataReqCommand(pMac, pCommand, eHAL_STATUS_SUCCESS);
+        pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
+
+    } while(0);
+
+    return status;
+}
+
+/* ---------------------------------------------------------------------------
+    \fn oemData_IsOemDataReqAllowed
+    \brief This function checks if OEM DATA REQs can be performed in the 
+           current driver state
+    \return eHalStatus     
+  -------------------------------------------------------------------------------*/
+eHalStatus oemData_IsOemDataReqAllowed(tHalHandle hHal)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    tANI_U32 sessionId;
+
+    tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+
+    for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
+    {
+        if(CSR_IS_SESSION_VALID(pMac, sessionId))
+        {
+            if(csrIsConnStateIbss(pMac, sessionId) || csrIsBTAMP(pMac, sessionId) 
+#ifdef WLAN_SOFTAP_FEATURE
+               || csrIsConnStateConnectedInfraAp(pMac, sessionId)
+#endif
+               )
+            {
+                //co-exist with IBSS or BT-AMP or Soft-AP mode is not supported
+                smsLog(pMac, LOGW, "OEM DATA REQ is not allowed due to IBSS|BTAMP|SAP exist in session %d\n", sessionId);
+                status = eHAL_STATUS_CSR_WRONG_STATE;
+                break;
+            }
+        }
+    }
+
+    smsLog(pMac, LOG1, "Exiting oemData_IsOemDataReqAllowed with status %d\n", status);
+
+    return (status);
+}
+
+#endif /*FEATURE_OEM_DATA_SUPPORT*/
diff --git a/CORE/SME/src/p2p/p2p_Api.c b/CORE/SME/src/p2p/p2p_Api.c
index 057f013..c0948d1 100644
--- a/CORE/SME/src/p2p/p2p_Api.c
+++ b/CORE/SME/src/p2p/p2p_Api.c
@@ -766,7 +766,7 @@
 }
 
 eHalStatus p2pSendAction(tHalHandle hHal, tANI_U8 sessionId,
-         const tANI_U8 *pBuf, tANI_U32 len)
+         const tANI_U8 *pBuf, tANI_U32 len, tANI_U16 wait, tANI_BOOLEAN noack)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
@@ -783,9 +783,11 @@
         pMsg->type = pal_cpu_to_be16((tANI_U16)eWNI_SME_SEND_ACTION_FRAME_IND);
         pMsg->msgLen = pal_cpu_to_be16(msgLen);
         pMsg->sessionId = sessionId;
-        palCopyMemory( pMac->hHdd, pMsg->data, pBuf, len ); 
+        pMsg->noack = noack;
+        pMsg->wait = (tANI_U16)wait;
+        palCopyMemory( pMac->hHdd, pMsg->data, pBuf, len );
         status = palSendMBMessage(pMac->hHdd, pMsg);
-    }                             
+    }
 
     return( status );
 }
diff --git a/CORE/SME/src/pmc/pmc.c b/CORE/SME/src/pmc/pmc.c
index 36b2ad9..56e2d11 100644
--- a/CORE/SME/src/pmc/pmc.c
+++ b/CORE/SME/src/pmc/pmc.c
@@ -23,7 +23,7 @@
 *
 * Name:  pmc.c
 *
-* Description: 
+* Description:
       Power Management Control (PMC) processing routines.
 *
 * Copyright 2008 (c) Qualcomm, Incorporated. All Rights Reserved.
@@ -329,7 +329,7 @@
             "eWNI_PMC_EXIT_IMPS_REQ\n");
             return eHAL_STATUS_FAILURE;
         }
-        
+
         return eHAL_STATUS_SUCCESS;
 
     /* Tell MAC to have device exit UAPSD mode first */
@@ -478,7 +478,7 @@
         }
     }
 
-    //Vote off RF supplies. Note RF supllies are not voted off if there is a 
+    //Vote off RF supplies. Note RF supllies are not voted off if there is a
     //pending request for full power already
     status = vos_chipVoteOffRFSupply(&callType, NULL, NULL);
     VOS_ASSERT( VOS_IS_STATUS_SUCCESS( status ) );
@@ -510,7 +510,7 @@
 eHalStatus pmcEnterRequestBmpsState (tHalHandle hHal)
 {
     tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
-    
+
     smsLog(pMac, LOG2, FL("Entering pmcEnterRequestBmpsState\n"));
 
     /* Can enter Request BMPS State only from Full Power State. */
@@ -691,7 +691,7 @@
             if (!checkRoutine(pPowerSaveCheckEntry->checkContext))
             {
                 smsLog(pMac, LOGE, FL("pmcPowerSaveCheck fail!\n"));
-                bResult = FALSE; 
+                bResult = FALSE;
                 break;
             }
             else
@@ -727,7 +727,7 @@
     tSirPowerSaveCfg powerSaveConfig;
 
     smsLog(pMac, LOG2, FL("Entering pmcSendPowerSaveConfigMessage\n"));
-    
+
     palZeroMemory(pMac->hHdd, &(powerSaveConfig), sizeof(tSirPowerSaveCfg));
 
     switch (pMac->pmc.bmpsConfig.forwardBeacons)
@@ -752,27 +752,27 @@
     }
     powerSaveConfig.fEnablePwrSaveImmediately = pMac->pmc.bmpsConfig.setPmOnLastFrame;
     powerSaveConfig.fPSPoll = pMac->pmc.bmpsConfig.usePsPoll;
-    powerSaveConfig.fEnableBeaconEarlyTermination = 
+    powerSaveConfig.fEnableBeaconEarlyTermination =
         pMac->pmc.bmpsConfig.enableBeaconEarlyTermination;
-    powerSaveConfig.bcnEarlyTermWakeInterval = 
+    powerSaveConfig.bcnEarlyTermWakeInterval =
         pMac->pmc.bmpsConfig.bcnEarlyTermWakeInterval;
 
-    /* setcfg for listenInterval. Make sure CFG is updated because PE reads this 
+    /* setcfg for listenInterval. Make sure CFG is updated because PE reads this
        from CFG at the time of assoc or reassoc */
-    ccmCfgSetInt(pMac, WNI_CFG_LISTEN_INTERVAL, pMac->pmc.bmpsConfig.bmpsPeriod, 
+    ccmCfgSetInt(pMac, WNI_CFG_LISTEN_INTERVAL, pMac->pmc.bmpsConfig.bmpsPeriod,
         NULL, eANI_BOOLEAN_FALSE);
 
     if( pMac->pmc.pmcState == IMPS || pMac->pmc.pmcState == REQUEST_IMPS )
     {
         //Wake up the chip first
-        eHalStatus status = pmcDeferMsg( pMac, eWNI_PMC_PWR_SAVE_CFG, 
+        eHalStatus status = pmcDeferMsg( pMac, eWNI_PMC_PWR_SAVE_CFG,
                                     &powerSaveConfig, sizeof(tSirPowerSaveCfg) );
 
         if( eHAL_STATUS_PMC_PENDING == status )
         {
             return eHAL_STATUS_SUCCESS;
         }
-        else 
+        else
         {
             //either fail or already in full power
             if( !HAL_STATUS_SUCCESS( status ) )
@@ -784,13 +784,13 @@
     }
     /* Send a message so that FW System config is also updated and is in sync with
        the CFG.*/
-    if (pmcSendMessage(hHal, eWNI_PMC_PWR_SAVE_CFG, &powerSaveConfig, sizeof(tSirPowerSaveCfg)) 
+    if (pmcSendMessage(hHal, eWNI_PMC_PWR_SAVE_CFG, &powerSaveConfig, sizeof(tSirPowerSaveCfg))
         != eHAL_STATUS_SUCCESS)
     {
         smsLog(pMac, LOGE, FL("Send of eWNI_PMC_PWR_SAVE_CFG to PE failed\n"));
         return eHAL_STATUS_FAILURE;
     }
-   
+
     return eHAL_STATUS_SUCCESS;
 }
 
@@ -1053,12 +1053,12 @@
         return;
     }
 
-    if (pmcPowerSaveCheck(hHal)) 
+    if (pmcPowerSaveCheck(hHal))
     {
         smsLog(pMac, LOGW, FL("BMPS entry criteria satisfied. Requesting BMPS state"));
-        (void)pmcEnterRequestBmpsState(hHal);    
-    } 
-    else 
+        (void)pmcEnterRequestBmpsState(hHal);
+    }
+    else
     {
         /*Some module voted against Power Save. So timer should be restarted again to retry BMPS */
         smsLog(pMac, LOGE, FL("Power Save check failed. Retry BMPS again later"));
@@ -1150,7 +1150,7 @@
 *
 * Parameters:
 *    hHal - HAL handle for device
-*    callbackStatus - Success or Failure. 
+*    callbackStatus - Success or Failure.
 *
 * Returns:
 *    nothing
@@ -1261,9 +1261,9 @@
             //Not ready for UAPSD at this time, save it first and wake up the chip
             smsLog(pMac, LOGE, " PMC state = %d\n",pMac->pmc.pmcState);
             pMac->pmc.uapsdSessionRequired = TRUE;
-            /* While BTC traffic is going on, STA can be in BMPS 
+            /* While BTC traffic is going on, STA can be in BMPS
              * and need not go to Full Power */
-            //fFullPower = VOS_TRUE; 
+            //fFullPower = VOS_TRUE;
          }
 #endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
          break;
@@ -1344,7 +1344,7 @@
       only way to inform modules if PMC resumed UAPSD power save mode
       on its own after full power mode */
    pmcDoDeviceStateUpdateCallbacks(hHal, UAPSD);
-   
+
    /* If we have a reqeust for full power pending then we have to go
    directly into full power. */
    if (pMac->pmc.requestFullPowerPending)
@@ -1449,7 +1449,7 @@
           (void)pmcStartTrafficTimer(hHal, pMac->pmc.bmpsConfig.trafficMeasurePeriod);
       return eHAL_STATUS_FAILURE;
    }
-   
+
    return eHAL_STATUS_SUCCESS;
 }
 
@@ -1513,7 +1513,7 @@
 * Name:  pmcDoStandbyCallbacks
 *
 * Description:
-*    Call the registered Standby callback routines 
+*    Call the registered Standby callback routines
 *
 * Parameters:
 *    hHal - HAL handle for device
@@ -1526,7 +1526,7 @@
 void pmcDoStandbyCallbacks (tHalHandle hHal, eHalStatus callbackStatus)
 {
    tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
- 
+
    smsLog(pMac, LOG2, "PMC: entering pmcDoStandbyCallbacks\n");
 
    /* Call Standby callback routine. */
@@ -1553,7 +1553,7 @@
 tPmcState pmcGetPmcState (tHalHandle hHal)
 {
     tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
-    return pMac->pmc.pmcState; 
+    return pMac->pmc.pmcState;
 }
 
 const char* pmcGetPmcStateStr(tPmcState state)
@@ -1654,7 +1654,7 @@
 
       case REQUEST_BMPS:
          smsLog(pMac, LOGW, "PMC: BMPS transaction going on. WOWL request "
-                    "will be buffered\n");         
+                    "will be buffered\n");
          break;
 
       case BMPS:
@@ -1678,7 +1678,7 @@
 
       case REQUEST_EXIT_WOWL:
          smsLog(pMac, LOGW, "PMC: Exit WOWL transaction going on. New WOWL request "
-                   "will be buffered\n");         
+                   "will be buffered\n");
          break;
 
       default:
@@ -1771,7 +1771,7 @@
 
         case REQUEST_ENTER_WOWL:
             smsLog(pMac, LOGP, "PMC: Rcvd exit WOWL even before enter WOWL was completed\n");
-            return eHAL_STATUS_FAILURE;   
+            return eHAL_STATUS_FAILURE;
 
         default:
             smsLog(pMac, LOGW, "PMC: Got exit WOWL in state %s. Nothing to do as already out of WOWL\n",
@@ -1798,7 +1798,7 @@
 void pmcDoEnterWowlCallbacks (tHalHandle hHal, eHalStatus callbackStatus)
 {
    tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
- 
+
    smsLog(pMac, LOG2, "PMC: entering pmcDoWowlCallbacks\n");
 
    /* Call Wowl callback routine. */
@@ -1822,7 +1822,7 @@
         {
         case eWNI_PMC_WOWL_ADD_BCAST_PTRN:
             VOS_ASSERT( pDeferredMsg->size == sizeof(tSirWowlAddBcastPtrn) );
-            if (pmcSendMessage(pMac, eWNI_PMC_WOWL_ADD_BCAST_PTRN, 
+            if (pmcSendMessage(pMac, eWNI_PMC_WOWL_ADD_BCAST_PTRN,
                     &pDeferredMsg->u.wowlAddPattern, sizeof(tSirWowlAddBcastPtrn))
                     != eHAL_STATUS_SUCCESS)
             {
@@ -1832,7 +1832,7 @@
 
         case eWNI_PMC_WOWL_DEL_BCAST_PTRN:
             VOS_ASSERT( pDeferredMsg->size == sizeof(tSirWowlDelBcastPtrn) );
-            if (pmcSendMessage(pMac, eWNI_PMC_WOWL_DEL_BCAST_PTRN, 
+            if (pmcSendMessage(pMac, eWNI_PMC_WOWL_DEL_BCAST_PTRN,
                     &pDeferredMsg->u.wowlDelPattern, sizeof(tSirWowlDelBcastPtrn))
                     != eHAL_STATUS_SUCCESS)
             {
@@ -1842,8 +1842,8 @@
 
         case eWNI_PMC_PWR_SAVE_CFG:
             VOS_ASSERT( pDeferredMsg->size == sizeof(tSirPowerSaveCfg) );
-            if (pmcSendMessage(pMac, eWNI_PMC_PWR_SAVE_CFG, 
-                    &pDeferredMsg->u.powerSaveConfig, sizeof(tSirPowerSaveCfg)) 
+            if (pmcSendMessage(pMac, eWNI_PMC_PWR_SAVE_CFG,
+                    &pDeferredMsg->u.powerSaveConfig, sizeof(tSirPowerSaveCfg))
                 != eHAL_STATUS_SUCCESS)
             {
                 smsLog(pMac, LOGE, FL("Send of eWNI_PMC_PWR_SAVE_CFG to PE failed\n"));
@@ -1875,7 +1875,7 @@
     pDeferredMsg->size = (tANI_U16)size;
     if( pData )
     {
-        if( !HAL_STATUS_SUCCESS( palCopyMemory( pMac->hHdd, &pDeferredMsg->u.data, 
+        if( !HAL_STATUS_SUCCESS( palCopyMemory( pMac->hHdd, &pDeferredMsg->u.data,
                                     pData, size ) ) )
         {
             smsLog(pMac, LOGE, FL("Cannot copy pattern for callback context\n"));
@@ -1884,7 +1884,7 @@
         }
     }
     csrLLInsertTail( &pMac->pmc.deferredMsgList, &pDeferredMsg->link, eANI_BOOLEAN_TRUE );
-    //No callback is needed. The messages are put into deferred queue and be processed first 
+    //No callback is needed. The messages are put into deferred queue and be processed first
     //when enter full power is complete.
     status = pmcRequestFullPower( pMac, NULL, NULL, eSME_REASON_OTHER );
     if( eHAL_STATUS_PMC_PENDING != status )
@@ -1989,7 +1989,7 @@
 
 
 //These commands are not supposed to fail due to out of command buffer,
-//otherwise other commands are not executed and no command is released. It will be deadlock. 
+//otherwise other commands are not executed and no command is released. It will be deadlock.
 #define PMC_IS_COMMAND_CANNOT_FAIL(cmdType)\
     ( (eSmeCommandEnterStandby == (cmdType )) ||\
       (eSmeCommandExitImps == (cmdType )) ||\
@@ -1997,7 +1997,7 @@
       (eSmeCommandExitUapsd == (cmdType )) ||\
       (eSmeCommandExitWowl == (cmdType )) )
 
-eHalStatus pmcPrepareCommand( tpAniSirGlobal pMac, eSmeCommandType cmdType, void *pvParam, 
+eHalStatus pmcPrepareCommand( tpAniSirGlobal pMac, eSmeCommandType cmdType, void *pvParam,
                             tANI_U32 size, tSmeCmd **ppCmd )
 {
     eHalStatus status = eHAL_STATUS_RESOURCES;
@@ -2022,7 +2022,7 @@
                 status = palAllocateMemory(pMac->hHdd, (void **)&pCommand, sizeof(tSmeCmd));
                 if(!HAL_STATUS_SUCCESS(status))
                 {
-                    VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL, "%s fail to allocate memory for command (0x%X)", 
+                    VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL, "%s fail to allocate memory for command (0x%X)",
                         __FUNCTION__, cmdType);
                     pCommand = NULL;
                     break;
@@ -2102,7 +2102,7 @@
 }
 
 
-eHalStatus pmcIssueCommand( tpAniSirGlobal pMac, eSmeCommandType cmdType, void *pvParam, 
+eHalStatus pmcIssueCommand( tpAniSirGlobal pMac, eSmeCommandType cmdType, void *pvParam,
                             tANI_U32 size, tANI_BOOLEAN fPutToListHead )
 {
     eHalStatus status = eHAL_STATUS_RESOURCES;
@@ -2173,12 +2173,12 @@
                 if ( HAL_STATUS_SUCCESS( status ) )
                 {
                     pMac->pmc.pmcState = REQUEST_FULL_POWER;
-                    smsLog(pMac, LOGW, FL("eWNI_PMC_EXIT_IMPS_REQ sent to PE\n")); 
+                    smsLog(pMac, LOGW, FL("eWNI_PMC_EXIT_IMPS_REQ sent to PE\n"));
                     fRemoveCmd = eANI_BOOLEAN_FALSE;
                 }
                 else
                 {
-                    smsLog(pMac, LOGE, FL("eWNI_PMC_EXIT_IMPS_REQ fail to be sent to PE status %d\n"), status); 
+                    smsLog(pMac, LOGE, FL("eWNI_PMC_EXIT_IMPS_REQ fail to be sent to PE status %d\n"), status);
                     //Callbacks are called with success srarus, do we need to pass in real status??
                     pmcEnterFullPowerState(pMac);
                 }
@@ -2195,7 +2195,7 @@
                     /* Change PMC state */
                     pMac->pmc.pmcState = REQUEST_BMPS;
                     smsLog(pMac, LOGW, "PMC: Enter BMPS req done: Force XO Core ON\n");
-                    vstatus = vos_chipVoteXOCore(NULL, NULL, NULL, VOS_TRUE); 
+                    vstatus = vos_chipVoteXOCore(NULL, NULL, NULL, VOS_TRUE);
                     if ( !VOS_IS_STATUS_SUCCESS(vstatus) )
                     {
                         smsLog(pMac, LOGE, "Could not turn XO Core ON. Can't go to BMPS\n");
@@ -2219,8 +2219,8 @@
                                 smsLog(pMac, LOGE, "Could not cancel XO Core ON vote."
                                                    "Not returning failure."
                                                    "Power consumed will be high\n");
-                            }  
-                            
+                            }
+
                         }
                     }
                 }
@@ -2242,7 +2242,7 @@
             {
                 pMac->pmc.requestFullPowerPending = FALSE;
 
-                status = pmcSendMessage( pMac, eWNI_PMC_EXIT_BMPS_REQ, 
+                status = pmcSendMessage( pMac, eWNI_PMC_EXIT_BMPS_REQ,
                             &pCommand->u.pmcCmd.u.exitBmpsInfo, sizeof(tExitBmpsInfo) );
                 if ( HAL_STATUS_SUCCESS( status ) )
                 {
@@ -2314,7 +2314,7 @@
         case eSmeCommandEnterWowl:
             if( ( BMPS == pMac->pmc.pmcState ) || ( WOWL == pMac->pmc.pmcState ) )
             {
-                status = pmcSendMessage(pMac, eWNI_PMC_ENTER_WOWL_REQ, 
+                status = pmcSendMessage(pMac, eWNI_PMC_ENTER_WOWL_REQ,
                         &pCommand->u.pmcCmd.u.enterWowlInfo, sizeof(tSirSmeWowlEnterParams));
                 if ( HAL_STATUS_SUCCESS( status ) )
                 {
@@ -2357,14 +2357,14 @@
             if( FULL_POWER == pMac->pmc.pmcState )
             {
                //Disallow standby if concurrent sessions are present. Note that CSR would have
-               //caused the STA to disconnect the Infra session (if not already disconnected) because of 
+               //caused the STA to disconnect the Infra session (if not already disconnected) because of
                //standby request. But we are now failing the standby request because of concurrent session.
-               //So was the tearing of infra session wasteful if we were going to fail the standby request ? 
+               //So was the tearing of infra session wasteful if we were going to fail the standby request ?
                //Not really. This is beacuse if and when BT-AMP etc sessions are torn down we will transition
                //to IMPS/standby and still save power.
                if (csrIsIBSSStarted(pMac) || csrIsBTAMPStarted(pMac))
                {
-                  VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL, 
+                  VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL,
                       "WLAN: IBSS or BT-AMP session present. Cannot honor standby request");
 
                   pmcDoStandbyCallbacks(pMac, eHAL_STATUS_PMC_NOT_NOW);
@@ -2372,7 +2372,7 @@
                       (void)pmcStartTrafficTimer(pMac, pMac->pmc.bmpsConfig.trafficMeasurePeriod);
                   break;
                }
- 
+
                 // Stop traffic timer. Just making sure timer is not running
                 pmcStopTrafficTimer(pMac);
 
@@ -2418,7 +2418,7 @@
     if( !PMC_IS_READY(pMac) )
     {
         smsLog(pMac, LOGE, FL("Requesting IMPS when PMC not ready\n"));
-        smsLog(pMac, LOGE, FL("pmcReady = %d pmcState = %s\n"), 
+        smsLog(pMac, LOGE, FL("pmcReady = %d pmcState = %s\n"),
             pMac->pmc.pmcReady, pmcGetPmcStateStr(pMac->pmc.pmcState));
         return eHAL_STATUS_FAILURE;
     }
@@ -2451,7 +2451,7 @@
         smsLog(pMac, LOG2, FL("IMPS cannot be entered now\n"));
         return eHAL_STATUS_PMC_NOT_NOW;
     }
-    
+
     /* Check if already in IMPS. */
     if ((pMac->pmc.pmcState == REQUEST_IMPS) || (pMac->pmc.pmcState == IMPS) ||
         (pMac->pmc.pmcState == REQUEST_FULL_POWER))
@@ -2479,7 +2479,7 @@
    if( !PMC_IS_READY(pMac) )
    {
        smsLog(pMac, LOGE, FL("Requesting BMPS when PMC not ready\n"));
-       smsLog(pMac, LOGE, FL("pmcReady = %d pmcState = %s\n"), 
+       smsLog(pMac, LOGE, FL("pmcReady = %d pmcState = %s\n"),
            pMac->pmc.pmcReady, pmcGetPmcStateStr(pMac->pmc.pmcState));
        return eHAL_STATUS_FAILURE;
    }
@@ -2504,24 +2504,28 @@
       return eHAL_STATUS_PMC_NOT_NOW;
    }
 
-   smsLog(pMac, LOG1, FL("concurrency enabled %u\n"), pMac->roam.configParam.concurrencyEnabled);
-   if (pMac->roam.configParam.concurrencyEnabled)
+#ifndef BMPS_WORKAROUND_NOT_NEEDED
+   smsLog(pMac, LOG1, FL("doBMPSWorkaround %u\n"), pMac->roam.configParam.doBMPSWorkaround);
+   if (pMac->roam.configParam.doBMPSWorkaround)
    {
-      pMac->roam.configParam.concurrencyEnabled = 0;
-      smsLog(pMac, LOG1, FL("reset concurrency to disabled %u\n"), pMac->roam.configParam.concurrencyEnabled);
+      pMac->roam.configParam.doBMPSWorkaround = 0;
+      smsLog(pMac, LOG1, FL("reset doBMPSWorkaround to disabled %u\n"), pMac->roam.configParam.doBMPSWorkaround);
       csrDisconnectAllActiveSessions(pMac);
+      smsLog(pMac, LOGE, "PMC: doBMPSWorkaround was enabled. First Disconnect all sessions. pmcState %d\n", pMac->pmc.pmcState);
+      return eHAL_STATUS_FAILURE;
    }
+#endif
    return ( eHAL_STATUS_SUCCESS );
 }
 
 tANI_BOOLEAN pmcShouldBmpsTimerRun( tpAniSirGlobal pMac )
 {
-    /* Check if BMPS is enabled and if Auto BMPS Feature is still enabled 
+    /* Check if BMPS is enabled and if Auto BMPS Feature is still enabled
      * or there is a pending Uapsd request or HDD requested BMPS or there
-     * is a pending request for WoWL. In all these cases BMPS is required. 
+     * is a pending request for WoWL. In all these cases BMPS is required.
      * Otherwise just stop the timer and return.
      */
-    if (!(pMac->pmc.bmpsEnabled && (pMac->pmc.autoBmpsEntryEnabled || 
+    if (!(pMac->pmc.bmpsEnabled && (pMac->pmc.autoBmpsEntryEnabled ||
           pMac->pmc.uapsdSessionRequired || pMac->pmc.bmpsRequestedByHdd ||
           pMac->pmc.wowlModeRequired )))
     {
@@ -2529,7 +2533,16 @@
         return eANI_BOOLEAN_FALSE;
     }
 
-    /* Check if there is an Infra session. BMPS is possible only if there is 
+    if ((vos_concurrent_sessions_running()) &&
+        ((csrIsConcurrentInfraConnected( pMac ) ||
+        (vos_get_concurrency_mode()& VOS_SAP) ||
+        (vos_get_concurrency_mode()& VOS_P2P_GO))))
+    {
+        smsLog(pMac, LOG1, FL("Multiple Sessions/GO/SAP sessions . BMPS should not be started"));
+        return eANI_BOOLEAN_FALSE;
+    }
+
+    /* Check if there is an Infra session. BMPS is possible only if there is
      * an Infra session */
     if (!csrIsInfraConnected(pMac))
     {
@@ -2540,7 +2553,7 @@
 }
 
 
-#ifdef FEATURE_WLAN_DIAG_SUPPORT 
+#ifdef FEATURE_WLAN_DIAG_SUPPORT
 
 #define PMC_DIAG_EVT_TIMER_INTERVAL ( 5000 )
 
diff --git a/CORE/SME/src/pmc/pmcApi.c b/CORE/SME/src/pmc/pmcApi.c
index ac4a73e..a8fe6f6 100644
--- a/CORE/SME/src/pmc/pmcApi.c
+++ b/CORE/SME/src/pmc/pmcApi.c
@@ -1624,8 +1624,10 @@
       smsLog(pMac, LOGW, "PMC: BT-AMP exists. BMPS cannot be entered\n");
       return eANI_BOOLEAN_FALSE;
    }
-   if ((vos_concurrent_sessions_running()) && 
-        csrIsConcurrentInfraConnected( pMac ))
+   if ((vos_concurrent_sessions_running()) &&
+       (csrIsConcurrentInfraConnected( pMac ) ||
+       (vos_get_concurrency_mode()& VOS_SAP) ||
+       (vos_get_concurrency_mode()& VOS_P2P_GO)))
    {
       smsLog(pMac, LOGW, "PMC: Multiple active sessions exists. BMPS cannot be entered\n");
       return eANI_BOOLEAN_FALSE;
@@ -2426,10 +2428,21 @@
             eHAL_STATUS_FAILURE  Cannot set the offload.
             eHAL_STATUS_SUCCESS  Request accepted. 
   ---------------------------------------------------------------------------*/
-eHalStatus pmcSetHostOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest)
+eHalStatus pmcSetHostOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest, tANI_U8 *bssId)
 {
     tpSirHostOffloadReq pRequestBuf;
     vos_msg_t msg;
+    tpPESession     psessionEntry;
+    tANI_U8   sessionId;
+    tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+
+    if((psessionEntry = peFindSessionByBssid( pMac, bssId,&sessionId)) == NULL )
+    {
+        VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, "%s: Unable to find"
+        "the psessionEntry for bssid : 0x%x:0x%x:0x%x:0x%x:0x%x:0x%x", 
+        __FUNCTION__,bssId[5],bssId[4],bssId[3],bssId[2],bssId[1],bssId[0]);
+        return eHAL_STATUS_FAILURE;
+    }
 
     VOS_TRACE( VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, "%s: IP address = %d.%d.%d.%d", __FUNCTION__,
         pRequest->params.hostIpv4Addr[0], pRequest->params.hostIpv4Addr[1],
@@ -2443,6 +2456,8 @@
     }
     vos_mem_copy(pRequestBuf, pRequest, sizeof(tSirHostOffloadReq));
 
+    pRequestBuf->bssIdx = psessionEntry->bssIdx;
+
     msg.type = WDA_SET_HOST_OFFLOAD;
     msg.reserved = 0;
     msg.bodyptr = pRequestBuf;
@@ -2465,10 +2480,20 @@
             eHAL_STATUS_FAILURE  Cannot set the keepalive.
             eHAL_STATUS_SUCCESS  Request accepted. 
   ---------------------------------------------------------------------------*/
-eHalStatus pmcSetKeepAlive (tHalHandle hHal, tpSirKeepAliveReq pRequest)
+eHalStatus pmcSetKeepAlive (tHalHandle hHal, tpSirKeepAliveReq pRequest, tANI_U8 *bssId)
 {
     tpSirKeepAliveReq pRequestBuf;
     vos_msg_t msg;
+    tpPESession     psessionEntry;
+    tANI_U8   sessionId;
+    tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+    if((psessionEntry = peFindSessionByBssid( pMac, bssId,&sessionId)) == NULL )
+    {
+        VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, "%s: Unable to find"
+        "the psessionEntry for bssid : 0x%x:0x%x:0x%x:0x%x:0x%x:0x%x", 
+        __FUNCTION__,bssId[5],bssId[4],bssId[3],bssId[2],bssId[1],bssId[0]);
+        return eHAL_STATUS_FAILURE;
+    }
 
     VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_LOW, "%s: "
                   "WDA_SET_KEEP_ALIVE message", __FUNCTION__);
@@ -2482,7 +2507,9 @@
         return eHAL_STATUS_FAILED_ALLOC;
     }
     vos_mem_copy(pRequestBuf, pRequest, sizeof(tSirKeepAliveReq));
-    
+
+    pRequestBuf->bssIdx = psessionEntry->bssIdx;
+
     VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_LOW, "buff TP %d "
               "input TP %d ", pRequestBuf->timePeriod, pRequest->timePeriod);
 
@@ -2513,11 +2540,21 @@
             eHAL_STATUS_FAILURE  Cannot set the offload.
             eHAL_STATUS_SUCCESS  Request accepted. 
   ---------------------------------------------------------------------------*/
-eHalStatus pmcSetNSOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest)
+eHalStatus pmcSetNSOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest, tANI_U8 *bssId)
 {
     tpSirHostOffloadReq pRequestBuf;
     vos_msg_t msg;
     int i;
+    tpPESession     psessionEntry;
+    tANI_U8   sessionId;
+    tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+    if((psessionEntry = peFindSessionByBssid( pMac, bssId,&sessionId)) == NULL )
+    {
+        VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, "%s: Unable to find"
+        "the psessionEntry for bssid : 0x%x:0x%x:0x%x:0x%x:0x%x:0x%x", 
+        __FUNCTION__,bssId[5],bssId[4],bssId[3],bssId[2],bssId[1],bssId[0]);
+        return eHAL_STATUS_FAILURE;
+    }
 
     pRequestBuf = vos_mem_malloc(sizeof(tSirHostOffloadReq));
     if (NULL == pRequestBuf)
@@ -2527,6 +2564,8 @@
     }
     vos_mem_copy(pRequestBuf, pRequest, sizeof(tSirHostOffloadReq));
 
+    pRequestBuf->bssIdx = psessionEntry->bssIdx;
+
     msg.type = WDA_SET_NS_OFFLOAD;
     msg.reserved = 0;
     msg.bodyptr = pRequestBuf;
@@ -2737,7 +2776,7 @@
     
     if (IS_DOT11_MODE_HT(dot11mode))
     {
-       PopulateDot11fHTCaps( pMac, &pr.HTCaps );
+       PopulateDot11fHTCaps( pMac, NULL, &pr.HTCaps );
     }
     
     // That's it-- now we pack it.  First, how much space are we going to
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index e34b4e1..2dac130 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -398,6 +398,11 @@
         fFullPowerNeeded = ( ( eSmeCommandAddTs == pCommand->command ) ||
                     ( eSmeCommandDelTs ==  pCommand->command ) );
         if( fFullPowerNeeded ) break;
+#ifdef FEATURE_OEM_DATA_SUPPORT
+        fFullPowerNeeded = (pmcState == IMPS && 
+                                       eSmeCommandOemDataReq == pCommand->command);
+        if(fFullPowerNeeded) break;
+#endif
 #ifdef WLAN_FEATURE_P2P
         fFullPowerNeeded = (pmcState == IMPS && 
                             eSmeCommandRemainOnChannel == pCommand->command);
@@ -619,6 +624,12 @@
                             csrProcessDelStaSessionCommand( pMac, pCommand );
                             break;
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+                        case eSmeCommandOemDataReq:
+                            csrLLUnlock(&pMac->sme.smeCmdActiveList);
+                            oemData_ProcessOemDataReqCommand(pMac, pCommand);
+                            break;
+#endif
 #if defined WLAN_FEATURE_P2P
                         case eSmeCommandRemainOnChannel:
                             csrLLUnlock(&pMac->sme.smeCmdActiveList);
@@ -871,6 +882,14 @@
          break;
       }
 #endif
+#ifdef FEATURE_OEM_DATA_SUPPORT
+      status = oemData_OemDataReqOpen(pMac);
+      if ( ! HAL_STATUS_SUCCESS( status ) ) {
+         smsLog(pMac, LOGE,
+                "oemData_OemDataReqOpen failed during initialization with status=%d", status );
+         break;
+      }
+#endif
 
       if(!HAL_STATUS_SUCCESS((status = initSmeCmdList(pMac))))
           break;
@@ -1447,6 +1466,21 @@
              break;
 #endif
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+          //Handle the eWNI_SME_OEM_DATA_RSP:
+          case eWNI_SME_OEM_DATA_RSP:
+                if(pMsg->bodyptr)
+                {
+                        status = sme_HandleOemDataRsp(pMac, pMsg->bodyptr);
+                        vos_mem_free(pMsg->bodyptr);
+                }
+                else
+                {
+                        smsLog( pMac, LOGE, "Empty rsp message for oemData_ (eWNI_SME_OEM_DATA_RSP), nothing to process\n");
+                }
+                smeProcessPendingQueue( pMac );
+                break;
+#endif
 
           case eWNI_SME_ADD_STA_SELF_RSP:
                 if(pMsg->bodyptr)
@@ -1471,7 +1505,6 @@
                 }
                 break;
 #ifdef WLAN_FEATURE_P2P
-          //Handle the eWNI_SME_INNAV_MEAS_RSP:
           case eWNI_SME_REMAIN_ON_CHN_RSP:
                 if(pMsg->bodyptr)
                 {
@@ -1787,6 +1820,14 @@
       fail_status = status;
    }
 #endif
+#ifdef FEATURE_OEM_DATA_SUPPORT
+   status = oemData_OemDataReqClose(hHal);
+   if ( ! HAL_STATUS_SUCCESS( status ) ) {
+       smsLog( pMac, LOGE, "OEM DATA REQ close failed during sme close with status=%d\n", 
+              status );
+      fail_status = status;
+   }
+#endif
 
    status = ccmClose(hHal);
          if ( ! HAL_STATUS_SUCCESS( status ) ) {
@@ -4698,6 +4739,99 @@
 }
 #endif /* FEATURE_WLAN_WAPI */
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+/*****************************************************************************
+ OEM DATA related modifications and function additions
+ *****************************************************************************/
+
+/* ---------------------------------------------------------------------------
+    \fn sme_getOemDataRsp
+    \brief a wrapper function to obtain the OEM DATA RSP
+    \param pOemDataRsp - A pointer to the response object
+    \param pContext - a pointer passed in for the callback
+    \return eHalStatus     
+  ---------------------------------------------------------------------------*/
+eHalStatus sme_getOemDataRsp(tHalHandle hHal, 
+        tOemDataRsp **pOemDataRsp)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+
+    do
+    {
+        //acquire the lock for the sme object
+        status = sme_AcquireGlobalLock(&pMac->sme);
+
+        if(!HAL_STATUS_SUCCESS(status))
+        {
+            break;
+        }
+
+        if(pMac->oemData.pOemDataRsp != NULL)
+        {
+            *pOemDataRsp = pMac->oemData.pOemDataRsp;
+        }
+        else
+        {
+            status = eHAL_STATUS_FAILURE;
+        }
+
+        //release the lock for the sme object
+        sme_ReleaseGlobalLock( &pMac->sme );
+
+    } while(0);
+
+    return status;
+}
+
+/* ---------------------------------------------------------------------------
+    \fn sme_OemDataReq
+    \brief a wrapper function for OEM DATA REQ
+    \param sessionId - session id to be used.
+    \param pOemDataReqId - pointer to an object to get back the request ID
+    \param callback - a callback function that is called upon finish
+    \param pContext - a pointer passed in for the callback
+    \return eHalStatus     
+  ---------------------------------------------------------------------------*/
+eHalStatus sme_OemDataReq(tHalHandle hHal, 
+        tANI_U8 sessionId,
+        tOemDataReqConfig *pOemDataReqConfig, 
+        tANI_U32 *pOemDataReqID, 
+        oemData_OemDataReqCompleteCallback callback, 
+        void *pContext)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+
+    do
+    {
+        //acquire the lock for the sme object
+        status = sme_AcquireGlobalLock(&pMac->sme);
+        if(HAL_STATUS_SUCCESS(status))
+        {
+            tANI_U32 lOemDataReqId = pMac->oemData.oemDataReqID++; //let it wrap around
+
+            if(pOemDataReqID)
+            {
+               *pOemDataReqID = lOemDataReqId;
+            }
+            else
+               return eHAL_STATUS_FAILURE;
+
+            status = oemData_OemDataReq(hHal, sessionId, pOemDataReqConfig, pOemDataReqID, callback, pContext);
+
+            //release the lock for the sme object
+            sme_ReleaseGlobalLock( &pMac->sme );
+        }
+    } while(0);
+
+    smsLog(pMac, LOGW, "exiting function %s\n", __FUNCTION__);
+
+    return(status);
+}
+
+#endif /*FEATURE_OEM_DATA_SUPPORT*/
 
 /*--------------------------------------------------------------------------
 
@@ -4901,22 +5035,31 @@
     \param  pRequest -  Pointer to the offload request.
     \return eHalStatus
   ---------------------------------------------------------------------------*/
-eHalStatus sme_SetHostOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest)
+eHalStatus sme_SetHostOffload (tHalHandle hHal, tANI_U8 sessionId, 
+                                    tpSirHostOffloadReq pRequest)
 {
     tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
-    eHalStatus status;
+    eHalStatus status = eHAL_STATUS_FAILURE;
+    tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
+
+    if(pSession == NULL )
+    {
+        VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, "%s: "
+           "Unable to find the csrSession", __FUNCTION__);
+        return status;
+    }
 
     if ( eHAL_STATUS_SUCCESS == ( status = sme_AcquireGlobalLock( &pMac->sme ) ) )
     {
 #ifdef WLAN_NS_OFFLOAD
         if(SIR_IPV6_NS_OFFLOAD == pRequest->offloadType)
         {
-            status = pmcSetNSOffload( hHal, pRequest );
+            status = pmcSetNSOffload( hHal, pRequest ,pSession->connectedProfile.bssid);
         }
         else
 #endif //WLAN_NS_OFFLOAD
         {
-            status = pmcSetHostOffload (hHal, pRequest);
+            status = pmcSetHostOffload (hHal, pRequest, pSession->connectedProfile.bssid);
         }
         sme_ReleaseGlobalLock( &pMac->sme );
     }
@@ -4975,18 +5118,26 @@
     \param  pRequest -  Pointer to the Keep Alive request.
     \return eHalStatus
   ---------------------------------------------------------------------------*/
-eHalStatus sme_SetKeepAlive (tHalHandle hHal, tpSirKeepAliveReq pRequest)
+eHalStatus sme_SetKeepAlive (tHalHandle hHal, tANI_U8 sessionId, 
+                                 tpSirKeepAliveReq pRequest)
 {
     tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
     eHalStatus status;
+    tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
 
     VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, "%s: "
            "setting Keep alive in SME TP %d", __FUNCTION__,pRequest->timePeriod);
 
+    if(pSession == NULL )
+    {
+		VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, "%s: "
+           " Session not Found", __FUNCTION__);
+        return eHAL_STATUS_FAILURE;
+    }
 
     if ( eHAL_STATUS_SUCCESS == ( status = sme_AcquireGlobalLock( &pMac->sme ) ) )
     {
-        status = pmcSetKeepAlive (hHal, pRequest);
+        status = pmcSetKeepAlive (hHal, pRequest, pSession->connectedProfile.bssid);
         sme_ReleaseGlobalLock( &pMac->sme );
     }
 
@@ -5324,7 +5475,8 @@
   ---------------------------------------------------------------------------*/
 
 eHalStatus sme_sendAction(tHalHandle hHal, tANI_U8 sessionId,
-                          const tANI_U8 *pBuf, tANI_U32 len)
+                          const tANI_U8 *pBuf, tANI_U32 len,
+                          tANI_U16 wait, tANI_BOOLEAN noack)
 {
     eHalStatus status = eHAL_STATUS_SUCCESS;
     tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
@@ -5333,7 +5485,7 @@
     status = sme_AcquireGlobalLock(&pMac->sme);
     if(HAL_STATUS_SUCCESS(status))
     {
-        p2pSendAction(hHal, sessionId, pBuf, len);
+        p2pSendAction(hHal, sessionId, pBuf, len, wait, noack);
         //release the lock for the sme object
         sme_ReleaseGlobalLock( &pMac->sme );
     }
@@ -5850,12 +6002,34 @@
 {
     tpSirRcvFltMcAddrList   pRequestBuf;
     vos_msg_t               msg;
+    tpAniSirGlobal          pMac = PMAC_STRUCT(hHal);
+    tANI_U8                 sessionId = 0;
+    tCsrRoamSession         *pSession = NULL;
 
     VOS_TRACE( VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, "%s: "
                "ulMulticastAddrCnt=%d, multicastAddr[0]=%d", __FUNCTION__,
                pMulticastAddrs->ulMulticastAddrCnt,
                pMulticastAddrs->multicastAddr[0]);
-  
+
+    /*
+     *Find the connected Infra / P2P_client connected session
+     */
+     for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
+     {
+         if( CSR_IS_SESSION_VALID( pMac, sessionId ) && 
+           ( csrIsConnStateInfra( pMac, sessionId )) )
+         {
+            pSession = CSR_GET_SESSION( pMac, sessionId );
+         }
+     }
+
+    if(pSession == NULL )
+    {
+        VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, "%s: Unable to find "
+            "the right session", __FUNCTION__);
+        return eHAL_STATUS_FAILURE;
+    }
+    
     pRequestBuf = vos_mem_malloc(sizeof(tSirRcvFltMcAddrList));
     if (NULL == pRequestBuf)
     {
@@ -5865,6 +6039,10 @@
     }
     vos_mem_copy(pRequestBuf, pMulticastAddrs, sizeof(tSirRcvFltMcAddrList));
 
+    vos_mem_copy(pRequestBuf->selfMacAddr, pSession->selfMacAddr, sizeof(tSirMacAddr));
+    vos_mem_copy(pRequestBuf->bssId, pSession->connectedProfile.bssid, 
+                 sizeof(tSirMacAddr));
+
     msg.type = WDA_8023_MULTICAST_LIST_REQ;
     msg.reserved = 0;
     msg.bodyptr = pRequestBuf;
@@ -5879,12 +6057,14 @@
     return eHAL_STATUS_SUCCESS;
 }
 
-eHalStatus sme_ReceiveFilterSetFilter(tHalHandle hHal, tpSirRcvPktFilterCfgType pRcvPktFilterCfg)
+eHalStatus sme_ReceiveFilterSetFilter(tHalHandle hHal, tpSirRcvPktFilterCfgType pRcvPktFilterCfg, 
+                                           tANI_U8 sessionId)
 {
     tpSirRcvPktFilterCfgType    pRequestBuf;
     v_SINT_t                allocSize;
     vos_msg_t               msg;
-    /*tpAniSirGlobal          pMac = PMAC_STRUCT(hHal);*/
+    tpAniSirGlobal          pMac = PMAC_STRUCT(hHal);
+    tCsrRoamSession         *pSession = CSR_GET_SESSION( pMac, sessionId );
     v_U8_t   idx=0;
 
     VOS_TRACE( VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, "%s: filterType=%d, "
@@ -5895,7 +6075,7 @@
                       ((pRcvPktFilterCfg->numFieldParams - 1) * 
                       sizeof(tSirRcvPktFilterFieldParams));
     pRequestBuf = vos_mem_malloc(allocSize);
-    if (NULL == pRequestBuf)
+    if ((NULL == pRequestBuf) || (NULL == pSession))
     {
         VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, "%s: Not able to "
             "allocate memory for Receive Filter Set Filter request", __FUNCTION__);
@@ -5903,6 +6083,10 @@
     }
     vos_mem_copy(pRequestBuf, pRcvPktFilterCfg, allocSize);
 
+    vos_mem_copy( pRequestBuf->selfMacAddr, pSession->selfMacAddr, sizeof(tSirMacAddr));
+    vos_mem_copy( pRequestBuf->bssId, pSession->connectedProfile.bssid, 
+                          sizeof(tSirMacAddr));
+
     msg.type = WDA_RECEIVE_FILTER_SET_FILTER_REQ;
     msg.reserved = 0;
     msg.bodyptr = pRequestBuf;
@@ -5979,16 +6163,19 @@
     return (status);
 }
 
-eHalStatus sme_ReceiveFilterClearFilter(tHalHandle hHal, tpSirRcvFltPktClearParam pRcvFltPktClearParam)
+eHalStatus sme_ReceiveFilterClearFilter(tHalHandle hHal, tpSirRcvFltPktClearParam pRcvFltPktClearParam, 
+                                             tANI_U8 sessionId)
 {
     tpSirRcvFltPktClearParam pRequestBuf;
     vos_msg_t               msg;
+    tpAniSirGlobal          pMac = PMAC_STRUCT(hHal);
+    tCsrRoamSession         *pSession = CSR_GET_SESSION( pMac, sessionId );
 
     VOS_TRACE( VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, "%s: filterId = %d", __FUNCTION__,
                pRcvFltPktClearParam->filterId);
   
     pRequestBuf = vos_mem_malloc(sizeof(tSirRcvFltPktClearParam));
-    if (NULL == pRequestBuf)
+    if ((NULL == pRequestBuf) || (NULL == pSession))
     {
         VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
             "%s: Not able to allocate memory for Receive Filter "
@@ -5997,6 +6184,10 @@
     }
     vos_mem_copy(pRequestBuf, pRcvFltPktClearParam, sizeof(tSirRcvFltPktClearParam));
 
+    vos_mem_copy( pRequestBuf->selfMacAddr, pSession->selfMacAddr, sizeof(tSirMacAddr));
+    vos_mem_copy( pRequestBuf->bssId, pSession->connectedProfile.bssid, 
+                          sizeof(tSirMacAddr));
+
     msg.type = WDA_RECEIVE_FILTER_CLEAR_FILTER_REQ;
     msg.reserved = 0;
     msg.bodyptr = pRequestBuf;
diff --git a/CORE/SYS/legacy/src/system/src/sysEntryFunc.c b/CORE/SYS/legacy/src/system/src/sysEntryFunc.c
index 7e215e2..bb64322 100644
--- a/CORE/SYS/legacy/src/system/src/sysEntryFunc.c
+++ b/CORE/SYS/legacy/src/system/src/sysEntryFunc.c
@@ -186,7 +186,7 @@
             if( (dropReason = limIsPktCandidateForDrop(pMac, pBd, subType)) != eMGMT_DROP_NO_DROP)
             {
                 PELOG1(sysLog(pMac, LOG1, FL("Mgmt Frame %d being dropped, reason: %d\n"), subType, dropReason);)
-                MTRACE(macTrace(pMac,   TRACE_CODE_RX_MGMT_DROP, 0, dropReason);)
+                MTRACE(macTrace(pMac,   TRACE_CODE_RX_MGMT_DROP, NO_SESSION, dropReason);)
                 goto fail;
             }
             //Post the message to PE Queue
diff --git a/CORE/SYS/legacy/src/utils/inc/utilsParser.h b/CORE/SYS/legacy/src/utils/inc/utilsParser.h
index c9c29d6..556d9eb 100644
--- a/CORE/SYS/legacy/src/utils/inc/utilsParser.h
+++ b/CORE/SYS/legacy/src/utils/inc/utilsParser.h
@@ -67,6 +67,9 @@
 #ifdef WLAN_FEATURE_P2P
 tSirRetStatus ConvertP2POpaque      (tpAniSirGlobal, tSirAddie*,                 tDot11fIEP2PIEOpaque*);
 #endif
+#ifdef WLAN_FEATURE_WFD
+tSirRetStatus ConvertWFDOpaque      (tpAniSirGlobal, tSirAddie*,                 tDot11fIEWFDIEOpaque*);
+#endif
 
 
 #endif
diff --git a/CORE/SYS/legacy/src/utils/src/dot11f.c b/CORE/SYS/legacy/src/utils/src/dot11f.c
index 9d18626..b2df4bd 100644
--- a/CORE/SYS/legacy/src/utils/src/dot11f.c
+++ b/CORE/SYS/legacy/src/utils/src/dot11f.c
@@ -33,7 +33,7 @@
   *
   *
   * This file was automatically generated by 'framesc'
-  * Tue May 15 13:12:01 2012 from the following file(s):
+  * Fri Aug 17 13:25:06 2012 from the following file(s):
   *
   * dot11f.frms
   * 
@@ -4528,10 +4528,112 @@
 #define SigIeTPCRequest ( 0x006c )
 
 
+tANI_U32 dot11fUnpackIeVHTCaps(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEVHTCaps *pDst)
+{
+    tANI_U32 status = DOT11F_PARSE_SUCCESS;
+    tANI_U32 tmp60__;
+    tANI_U16 tmp61__;
+    tANI_U16 tmp62__;
+    (void) pBuf; (void)ielen; /* Shutup the compiler */
+    if (pDst->present) status = DOT11F_DUPLICATE_IE;
+    pDst->present = 1;
+    framesntohl(pCtx, &tmp60__, pBuf, 0);
+    pBuf += 4;
+    ielen -= 4;
+    pDst->maxMPDULen = tmp60__ >> 0 & 0x3;
+    pDst->supportedChannelWidthSet = tmp60__ >> 2 & 0x3;
+    pDst->ldpcCodingCap = tmp60__ >> 4 & 0x1;
+    pDst->shortGI80MHz = tmp60__ >> 5 & 0x1;
+    pDst->shortGI160and80plus80MHz = tmp60__ >> 6 & 0x1;
+    pDst->txSTBC = tmp60__ >> 7 & 0x1;
+    pDst->rxSTBC = tmp60__ >> 8 & 0x7;
+    pDst->suBeamFormerCap = tmp60__ >> 11 & 0x1;
+    pDst->suBeamformeeCap = tmp60__ >> 12 & 0x1;
+    pDst->csnofBeamformerAntSup = tmp60__ >> 13 & 0x7;
+    pDst->numSoundingDim = tmp60__ >> 16 & 0x7;
+    pDst->muBeamformerCap = tmp60__ >> 19 & 0x1;
+    pDst->muBeamformeeCap = tmp60__ >> 20 & 0x1;
+    pDst->vhtTXOPPS = tmp60__ >> 21 & 0x1;
+    pDst->htcVHTCap = tmp60__ >> 22 & 0x1;
+    pDst->maxAMPDULenExp = tmp60__ >> 23 & 0x7;
+    pDst->vhtLinkAdaptCap = tmp60__ >> 26 & 0x3;
+    pDst->rxAntPattern = tmp60__ >> 28 & 0x1;
+    pDst->txAntPattern = tmp60__ >> 29 & 0x1;
+    pDst->reserved1 = tmp60__ >> 30 & 0x3;
+    framesntohs(pCtx, &pDst->rxMCSMap, pBuf, 0);
+    pBuf += 2;
+    ielen -= (tANI_U8)2;
+    framesntohs(pCtx, &tmp61__, pBuf, 0);
+    pBuf += 2;
+    ielen -= 2;
+    pDst->rxHighSupDataRate = tmp61__ >> 0 & 0x1fff;
+    pDst->reserved2 = tmp61__ >> 13 & 0x7;
+    framesntohs(pCtx, &pDst->txMCSMap, pBuf, 0);
+    pBuf += 2;
+    ielen -= (tANI_U8)2;
+    framesntohs(pCtx, &tmp62__, pBuf, 0);
+    pDst->txSupDataRate = tmp62__ >> 0 & 0x1fff;
+    pDst->reserved3 = tmp62__ >> 13 & 0x7;
+    (void)pCtx;
+    return status;
+} /* End dot11fUnpackIeVHTCaps. */
+
+#define SigIeVHTCaps ( 0x006d )
+
+
+tANI_U32 dot11fUnpackIeVHTExtBssLoad(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEVHTExtBssLoad *pDst)
+{
+    tANI_U32 status = DOT11F_PARSE_SUCCESS;
+    (void) pBuf; (void)ielen; /* Shutup the compiler */
+    if (pDst->present) status = DOT11F_DUPLICATE_IE;
+    pDst->present = 1;
+    pDst->muMIMOCapStaCount = *pBuf;
+    pBuf += 1;
+    ielen -= (tANI_U8)1;
+    pDst->ssUnderUtil = *pBuf;
+    pBuf += 1;
+    ielen -= (tANI_U8)1;
+    pDst->FortyMHzUtil = *pBuf;
+    pBuf += 1;
+    ielen -= (tANI_U8)1;
+    pDst->EightyMHzUtil = *pBuf;
+    pBuf += 1;
+    ielen -= (tANI_U8)1;
+    pDst->OneSixtyMHzUtil = *pBuf;
+    (void)pCtx;
+    return status;
+} /* End dot11fUnpackIeVHTExtBssLoad. */
+
+#define SigIeVHTExtBssLoad ( 0x006e )
+
+
+tANI_U32 dot11fUnpackIeVHTOperation(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEVHTOperation *pDst)
+{
+    tANI_U32 status = DOT11F_PARSE_SUCCESS;
+    (void) pBuf; (void)ielen; /* Shutup the compiler */
+    if (pDst->present) status = DOT11F_DUPLICATE_IE;
+    pDst->present = 1;
+    pDst->chanWidth = *pBuf;
+    pBuf += 1;
+    ielen -= (tANI_U8)1;
+    pDst->chanCenterFreqSeg1 = *pBuf;
+    pBuf += 1;
+    ielen -= (tANI_U8)1;
+    pDst->chanCenterFreqSeg2 = *pBuf;
+    pBuf += 1;
+    ielen -= (tANI_U8)1;
+    framesntohs(pCtx, &pDst->basicMCSSet, pBuf, 0);
+    (void)pCtx;
+    return status;
+} /* End dot11fUnpackIeVHTOperation. */
+
+#define SigIeVHTOperation ( 0x006f )
+
+
 tANI_U32 dot11fUnpackIeWAPI(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEWAPI *pDst)
 {
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
-    tANI_U16 tmp60__;
+    tANI_U16 tmp63__;
     (void) pBuf; (void)ielen; /* Shutup the compiler */
     if (pDst->present) status = DOT11F_DUPLICATE_IE;
     pDst->present = 1;
@@ -4568,11 +4670,11 @@
     DOT11F_MEMCPY(pCtx, pDst->multicast_cipher_suite, pBuf, 4);
     pBuf += 4;
     ielen -= (tANI_U8)4;
-    framesntohs(pCtx, &tmp60__, pBuf, 0);
+    framesntohs(pCtx, &tmp63__, pBuf, 0);
     pBuf += 2;
     ielen -= 2;
-    pDst->preauth = tmp60__ >> 0 & 0x1;
-    pDst->reserved = tmp60__ >> 1 & 0x7fff;
+    pDst->preauth = tmp63__ >> 0 & 0x1;
+    pDst->reserved = tmp63__ >> 1 & 0x7fff;
     if ( ! ielen )
     {
         pDst->bkid_count = 0U;
@@ -4594,7 +4696,7 @@
     return status;
 } /* End dot11fUnpackIeWAPI. */
 
-#define SigIeWAPI ( 0x006d )
+#define SigIeWAPI ( 0x0070 )
 
 
 tANI_U32 dot11fUnpackIeWAPIOpaque(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEWAPIOpaque *pDst)
@@ -4614,7 +4716,7 @@
     return status;
 } /* End dot11fUnpackIeWAPIOpaque. */
 
-#define SigIeWAPIOpaque ( 0x006e )
+#define SigIeWAPIOpaque ( 0x0071 )
 
 
 tANI_U32 dot11fUnpackIeWFATPC(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEWFATPC *pDst)
@@ -4631,13 +4733,33 @@
     return status;
 } /* End dot11fUnpackIeWFATPC. */
 
-#define SigIeWFATPC ( 0x006f )
+#define SigIeWFATPC ( 0x0072 )
+
+
+tANI_U32 dot11fUnpackIeWFDIEOpaque(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEWFDIEOpaque *pDst)
+{
+    tANI_U32 status = DOT11F_PARSE_SUCCESS;
+    (void) pBuf; (void)ielen; /* Shutup the compiler */
+    if (pDst->present) status = DOT11F_DUPLICATE_IE;
+    pDst->present = 1;
+    pDst->num_data = (tANI_U8)( ielen );
+    if (ielen > 249){
+        pDst->present = 0;
+        return DOT11F_SKIPPED_BAD_IE;
+    }
+
+    DOT11F_MEMCPY(pCtx, pDst->data, pBuf, ( ielen ) );
+    (void)pCtx;
+    return status;
+} /* End dot11fUnpackIeWFDIEOpaque. */
+
+#define SigIeWFDIEOpaque ( 0x0073 )
 
 
 tANI_U32 dot11fUnpackIeWMMCaps(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEWMMCaps *pDst)
 {
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
-    tANI_U8 tmp61__;
+    tANI_U8 tmp64__;
     (void) pBuf; (void)ielen; /* Shutup the compiler */
     if (pDst->present) status = DOT11F_DUPLICATE_IE;
     pDst->present = 1;
@@ -4649,76 +4771,76 @@
             pDst->present = 0;
             return ( status | DOT11F_BAD_FIXED_VALUE );
     }
-    tmp61__ = *pBuf;
-    pDst->reserved = tmp61__ >> 0 & 0xf;
-    pDst->qack = tmp61__ >> 4 & 0x1;
-    pDst->queue_request = tmp61__ >> 5 & 0x1;
-    pDst->txop_request = tmp61__ >> 6 & 0x1;
-    pDst->more_ack = tmp61__ >> 7 & 0x1;
+    tmp64__ = *pBuf;
+    pDst->reserved = tmp64__ >> 0 & 0xf;
+    pDst->qack = tmp64__ >> 4 & 0x1;
+    pDst->queue_request = tmp64__ >> 5 & 0x1;
+    pDst->txop_request = tmp64__ >> 6 & 0x1;
+    pDst->more_ack = tmp64__ >> 7 & 0x1;
     (void)pCtx;
     return status;
 } /* End dot11fUnpackIeWMMCaps. */
 
-#define SigIeWMMCaps ( 0x0070 )
+#define SigIeWMMCaps ( 0x0074 )
 
 
 tANI_U32 dot11fUnpackIeWMMInfoAp(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEWMMInfoAp *pDst)
 {
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
-    tANI_U8 tmp62__;
+    tANI_U8 tmp65__;
     (void) pBuf; (void)ielen; /* Shutup the compiler */
     if (pDst->present) status = DOT11F_DUPLICATE_IE;
     pDst->present = 1;
     pDst->version = *pBuf;
     pBuf += 1;
     ielen -= (tANI_U8)1;
-    tmp62__ = *pBuf;
-    pDst->param_set_count = tmp62__ >> 0 & 0xf;
-    pDst->reserved = tmp62__ >> 4 & 0x7;
-    pDst->uapsd = tmp62__ >> 7 & 0x1;
+    tmp65__ = *pBuf;
+    pDst->param_set_count = tmp65__ >> 0 & 0xf;
+    pDst->reserved = tmp65__ >> 4 & 0x7;
+    pDst->uapsd = tmp65__ >> 7 & 0x1;
     (void)pCtx;
     return status;
 } /* End dot11fUnpackIeWMMInfoAp. */
 
-#define SigIeWMMInfoAp ( 0x0071 )
+#define SigIeWMMInfoAp ( 0x0075 )
 
 
 tANI_U32 dot11fUnpackIeWMMInfoStation(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEWMMInfoStation *pDst)
 {
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
-    tANI_U8 tmp63__;
+    tANI_U8 tmp66__;
     (void) pBuf; (void)ielen; /* Shutup the compiler */
     if (pDst->present) status = DOT11F_DUPLICATE_IE;
     pDst->present = 1;
     pDst->version = *pBuf;
     pBuf += 1;
     ielen -= (tANI_U8)1;
-    tmp63__ = *pBuf;
-    pDst->acvo_uapsd = tmp63__ >> 0 & 0x1;
-    pDst->acvi_uapsd = tmp63__ >> 1 & 0x1;
-    pDst->acbk_uapsd = tmp63__ >> 2 & 0x1;
-    pDst->acbe_uapsd = tmp63__ >> 3 & 0x1;
-    pDst->reserved1 = tmp63__ >> 4 & 0x1;
-    pDst->max_sp_length = tmp63__ >> 5 & 0x3;
-    pDst->reserved2 = tmp63__ >> 7 & 0x1;
+    tmp66__ = *pBuf;
+    pDst->acvo_uapsd = tmp66__ >> 0 & 0x1;
+    pDst->acvi_uapsd = tmp66__ >> 1 & 0x1;
+    pDst->acbk_uapsd = tmp66__ >> 2 & 0x1;
+    pDst->acbe_uapsd = tmp66__ >> 3 & 0x1;
+    pDst->reserved1 = tmp66__ >> 4 & 0x1;
+    pDst->max_sp_length = tmp66__ >> 5 & 0x3;
+    pDst->reserved2 = tmp66__ >> 7 & 0x1;
     (void)pCtx;
     return status;
 } /* End dot11fUnpackIeWMMInfoStation. */
 
-#define SigIeWMMInfoStation ( 0x0072 )
+#define SigIeWMMInfoStation ( 0x0076 )
 
 
 tANI_U32 dot11fUnpackIeWMMParams(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEWMMParams *pDst)
 {
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
-    tANI_U8 tmp64__;
-    tANI_U8 tmp65__;
-    tANI_U8 tmp66__;
     tANI_U8 tmp67__;
     tANI_U8 tmp68__;
     tANI_U8 tmp69__;
     tANI_U8 tmp70__;
     tANI_U8 tmp71__;
+    tANI_U8 tmp72__;
+    tANI_U8 tmp73__;
+    tANI_U8 tmp74__;
     (void) pBuf; (void)ielen; /* Shutup the compiler */
     if (pDst->present) status = DOT11F_DUPLICATE_IE;
     pDst->present = 1;
@@ -4736,69 +4858,69 @@
     pDst->reserved2 = *pBuf;
     pBuf += 1;
     ielen -= (tANI_U8)1;
-    tmp64__ = *pBuf;
-    pBuf += 1;
-    ielen -= 1;
-    pDst->acbe_aifsn = tmp64__ >> 0 & 0xf;
-    pDst->acbe_acm = tmp64__ >> 4 & 0x1;
-    pDst->acbe_aci = tmp64__ >> 5 & 0x3;
-    pDst->unused1 = tmp64__ >> 7 & 0x1;
-    tmp65__ = *pBuf;
-    pBuf += 1;
-    ielen -= 1;
-    pDst->acbe_acwmin = tmp65__ >> 0 & 0xf;
-    pDst->acbe_acwmax = tmp65__ >> 4 & 0xf;
-    framesntohs(pCtx, &pDst->acbe_txoplimit, pBuf, 0);
-    pBuf += 2;
-    ielen -= (tANI_U8)2;
-    tmp66__ = *pBuf;
-    pBuf += 1;
-    ielen -= 1;
-    pDst->acbk_aifsn = tmp66__ >> 0 & 0xf;
-    pDst->acbk_acm = tmp66__ >> 4 & 0x1;
-    pDst->acbk_aci = tmp66__ >> 5 & 0x3;
-    pDst->unused2 = tmp66__ >> 7 & 0x1;
     tmp67__ = *pBuf;
     pBuf += 1;
     ielen -= 1;
-    pDst->acbk_acwmin = tmp67__ >> 0 & 0xf;
-    pDst->acbk_acwmax = tmp67__ >> 4 & 0xf;
-    framesntohs(pCtx, &pDst->acbk_txoplimit, pBuf, 0);
-    pBuf += 2;
-    ielen -= (tANI_U8)2;
+    pDst->acbe_aifsn = tmp67__ >> 0 & 0xf;
+    pDst->acbe_acm = tmp67__ >> 4 & 0x1;
+    pDst->acbe_aci = tmp67__ >> 5 & 0x3;
+    pDst->unused1 = tmp67__ >> 7 & 0x1;
     tmp68__ = *pBuf;
     pBuf += 1;
     ielen -= 1;
-    pDst->acvi_aifsn = tmp68__ >> 0 & 0xf;
-    pDst->acvi_acm = tmp68__ >> 4 & 0x1;
-    pDst->acvi_aci = tmp68__ >> 5 & 0x3;
-    pDst->unused3 = tmp68__ >> 7 & 0x1;
+    pDst->acbe_acwmin = tmp68__ >> 0 & 0xf;
+    pDst->acbe_acwmax = tmp68__ >> 4 & 0xf;
+    framesntohs(pCtx, &pDst->acbe_txoplimit, pBuf, 0);
+    pBuf += 2;
+    ielen -= (tANI_U8)2;
     tmp69__ = *pBuf;
     pBuf += 1;
     ielen -= 1;
-    pDst->acvi_acwmin = tmp69__ >> 0 & 0xf;
-    pDst->acvi_acwmax = tmp69__ >> 4 & 0xf;
-    framesntohs(pCtx, &pDst->acvi_txoplimit, pBuf, 0);
-    pBuf += 2;
-    ielen -= (tANI_U8)2;
+    pDst->acbk_aifsn = tmp69__ >> 0 & 0xf;
+    pDst->acbk_acm = tmp69__ >> 4 & 0x1;
+    pDst->acbk_aci = tmp69__ >> 5 & 0x3;
+    pDst->unused2 = tmp69__ >> 7 & 0x1;
     tmp70__ = *pBuf;
     pBuf += 1;
     ielen -= 1;
-    pDst->acvo_aifsn = tmp70__ >> 0 & 0xf;
-    pDst->acvo_acm = tmp70__ >> 4 & 0x1;
-    pDst->acvo_aci = tmp70__ >> 5 & 0x3;
-    pDst->unused4 = tmp70__ >> 7 & 0x1;
+    pDst->acbk_acwmin = tmp70__ >> 0 & 0xf;
+    pDst->acbk_acwmax = tmp70__ >> 4 & 0xf;
+    framesntohs(pCtx, &pDst->acbk_txoplimit, pBuf, 0);
+    pBuf += 2;
+    ielen -= (tANI_U8)2;
     tmp71__ = *pBuf;
     pBuf += 1;
     ielen -= 1;
-    pDst->acvo_acwmin = tmp71__ >> 0 & 0xf;
-    pDst->acvo_acwmax = tmp71__ >> 4 & 0xf;
+    pDst->acvi_aifsn = tmp71__ >> 0 & 0xf;
+    pDst->acvi_acm = tmp71__ >> 4 & 0x1;
+    pDst->acvi_aci = tmp71__ >> 5 & 0x3;
+    pDst->unused3 = tmp71__ >> 7 & 0x1;
+    tmp72__ = *pBuf;
+    pBuf += 1;
+    ielen -= 1;
+    pDst->acvi_acwmin = tmp72__ >> 0 & 0xf;
+    pDst->acvi_acwmax = tmp72__ >> 4 & 0xf;
+    framesntohs(pCtx, &pDst->acvi_txoplimit, pBuf, 0);
+    pBuf += 2;
+    ielen -= (tANI_U8)2;
+    tmp73__ = *pBuf;
+    pBuf += 1;
+    ielen -= 1;
+    pDst->acvo_aifsn = tmp73__ >> 0 & 0xf;
+    pDst->acvo_acm = tmp73__ >> 4 & 0x1;
+    pDst->acvo_aci = tmp73__ >> 5 & 0x3;
+    pDst->unused4 = tmp73__ >> 7 & 0x1;
+    tmp74__ = *pBuf;
+    pBuf += 1;
+    ielen -= 1;
+    pDst->acvo_acwmin = tmp74__ >> 0 & 0xf;
+    pDst->acvo_acwmax = tmp74__ >> 4 & 0xf;
     framesntohs(pCtx, &pDst->acvo_txoplimit, pBuf, 0);
     (void)pCtx;
     return status;
 } /* End dot11fUnpackIeWMMParams. */
 
-#define SigIeWMMParams ( 0x0073 )
+#define SigIeWMMParams ( 0x0077 )
 
 
 tANI_U32 dot11fUnpackIeWPA(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEWPA *pDst)
@@ -4880,7 +5002,7 @@
     return status;
 } /* End dot11fUnpackIeWPA. */
 
-#define SigIeWPA ( 0x0074 )
+#define SigIeWPA ( 0x0078 )
 
 
 tANI_U32 dot11fUnpackIeWPAOpaque(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEWPAOpaque *pDst)
@@ -4900,7 +5022,7 @@
     return status;
 } /* End dot11fUnpackIeWPAOpaque. */
 
-#define SigIeWPAOpaque ( 0x0075 )
+#define SigIeWPAOpaque ( 0x0079 )
 
 
     static const tTLVDefn TLVS_WSC[ ] = {
@@ -4938,7 +5060,7 @@
     return status;
 } /* End dot11fUnpackIeWSC. */
 
-#define SigIeWSC ( 0x0076 )
+#define SigIeWSC ( 0x007a )
 
 
     static const tTLVDefn TLVS_WscAssocReq[ ] = {
@@ -4957,7 +5079,7 @@
     return status;
 } /* End dot11fUnpackIeWscAssocReq. */
 
-#define SigIeWscAssocReq ( 0x0077 )
+#define SigIeWscAssocReq ( 0x007b )
 
 
     static const tTLVDefn TLVS_WscAssocRes[ ] = {
@@ -4976,7 +5098,7 @@
     return status;
 } /* End dot11fUnpackIeWscAssocRes. */
 
-#define SigIeWscAssocRes ( 0x0078 )
+#define SigIeWscAssocRes ( 0x007c )
 
 
     static const tTLVDefn TLVS_WscBeacon[ ] = {
@@ -5001,7 +5123,7 @@
     return status;
 } /* End dot11fUnpackIeWscBeacon. */
 
-#define SigIeWscBeacon ( 0x0079 )
+#define SigIeWscBeacon ( 0x007d )
 
 
     static const tTLVDefn TLVS_WscBeaconProbeRes[ ] = {
@@ -5034,7 +5156,7 @@
     return status;
 } /* End dot11fUnpackIeWscBeaconProbeRes. */
 
-#define SigIeWscBeaconProbeRes ( 0x007a )
+#define SigIeWscBeaconProbeRes ( 0x007e )
 
 
 tANI_U32 dot11fUnpackIeWscIEOpaque(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEWscIEOpaque *pDst)
@@ -5054,7 +5176,7 @@
     return status;
 } /* End dot11fUnpackIeWscIEOpaque. */
 
-#define SigIeWscIEOpaque ( 0x007b )
+#define SigIeWscIEOpaque ( 0x007f )
 
 
     static const tTLVDefn TLVS_WscProbeReq[ ] = {
@@ -5085,7 +5207,7 @@
     return status;
 } /* End dot11fUnpackIeWscProbeReq. */
 
-#define SigIeWscProbeReq ( 0x007c )
+#define SigIeWscProbeReq ( 0x0080 )
 
 
     static const tTLVDefn TLVS_WscProbeRes[ ] = {
@@ -5118,7 +5240,7 @@
     return status;
 } /* End dot11fUnpackIeWscProbeRes. */
 
-#define SigIeWscProbeRes ( 0x007d )
+#define SigIeWscProbeRes ( 0x0081 )
 
 
     static const tTLVDefn TLVS_WscReassocRes[ ] = {
@@ -5137,7 +5259,7 @@
     return status;
 } /* End dot11fUnpackIeWscReassocRes. */
 
-#define SigIeWscReassocRes ( 0x007e )
+#define SigIeWscReassocRes ( 0x0082 )
 
 
     static const tFFDefn FFS_AddBAReq[] = {
@@ -5792,6 +5914,8 @@
         {offsetof(tDot11fAssocRequest, CCXRadMgmtCap), offsetof(tDot11fIECCXRadMgmtCap, present), 0, "CCXRadMgmtCap" , 0, 8, 8, SigIeCCXRadMgmtCap, {0, 64, 150, 1, 0}, 4, DOT11F_EID_CCXRADMGMTCAP, 0, },
         {offsetof(tDot11fAssocRequest, CCXVersion), offsetof(tDot11fIECCXVersion, present), 0, "CCXVersion" , 0, 7, 7, SigIeCCXVersion, {0, 64, 150, 3, 0}, 4, DOT11F_EID_CCXVERSION, 0, },
         {offsetof(tDot11fAssocRequest, P2PIEOpaque), offsetof(tDot11fIEP2PIEOpaque, present), 0, "P2PIEOpaque" , 0, 8, 255, SigIeP2PIEOpaque, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PIEOPAQUE, 0, },
+        {offsetof(tDot11fAssocRequest, WFDIEOpaque), offsetof(tDot11fIEWFDIEOpaque, present), 0, "WFDIEOpaque" , 0, 8, 255, SigIeWFDIEOpaque, {80, 111, 154, 10, 0}, 4, DOT11F_EID_WFDIEOPAQUE, 0, },
+        {offsetof(tDot11fAssocRequest, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, },
     {0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },    };
 
 tANI_U32 dot11fUnpackAssocRequest(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U32 nBuf, tDot11fAssocRequest *pFrm)
@@ -6308,6 +6432,50 @@
             FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("num_data: %d.\n"), pFrm->P2PIEOpaque.num_data);
             FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* ) pFrm->P2PIEOpaque.data, pFrm->P2PIEOpaque.num_data);
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("WFDIEOpaque:\n"));
+        if (!pFrm->WFDIEOpaque.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("num_data: %d.\n"), pFrm->WFDIEOpaque.num_data);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* ) pFrm->WFDIEOpaque.data, pFrm->WFDIEOpaque.num_data);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
     }
 #   endif // DOT11F_DUMP_FRAMES
     return status;
@@ -6343,6 +6511,8 @@
         {offsetof(tDot11fAssocResponse, Airgo), offsetof(tDot11fIEAirgo, present), 0, "Airgo" , 0, 5, 232, SigIeAirgo, {0, 10, 245, 0, 0}, 3, DOT11F_EID_AIRGO, 0, },
         {offsetof(tDot11fAssocResponse, WscAssocRes), offsetof(tDot11fIEWscAssocRes, present), 0, "WscAssocRes" , 0, 6, 37, SigIeWscAssocRes, {0, 80, 242, 4, 0}, 4, DOT11F_EID_WSCASSOCRES, 0, },
         {offsetof(tDot11fAssocResponse, P2PAssocRes), offsetof(tDot11fIEP2PAssocRes, present), 0, "P2PAssocRes" , 0, 6, 17, SigIeP2PAssocRes, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PASSOCRES, 0, },
+        {offsetof(tDot11fAssocResponse, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, },
+        {offsetof(tDot11fAssocResponse, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, },
     {0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },    };
 
 tANI_U32 dot11fUnpackAssocResponse(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U32 nBuf, tDot11fAssocResponse *pFrm)
@@ -7344,6 +7514,52 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->P2PAssocRes.ExtendedListenTiming.availibilityInterval, 2);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
     }
 #   endif // DOT11F_DUMP_FRAMES
     return status;
@@ -7792,6 +8008,9 @@
         {offsetof(tDot11fBeacon, Airgo), offsetof(tDot11fIEAirgo, present), 0, "Airgo" , 0, 5, 232, SigIeAirgo, {0, 10, 245, 0, 0}, 3, DOT11F_EID_AIRGO, 0, },
         {offsetof(tDot11fBeacon, WscBeacon), offsetof(tDot11fIEWscBeacon, present), 0, "WscBeacon" , 0, 6, 84, SigIeWscBeacon, {0, 80, 242, 4, 0}, 4, DOT11F_EID_WSCBEACON, 0, },
         {offsetof(tDot11fBeacon, P2PBeacon), offsetof(tDot11fIEP2PBeacon, present), 0, "P2PBeacon" , 0, 6, 61, SigIeP2PBeacon, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PBEACON, 0, },
+        {offsetof(tDot11fBeacon, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, },
+        {offsetof(tDot11fBeacon, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, },
+        {offsetof(tDot11fBeacon, VHTExtBssLoad), offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad" , 0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTEXTBSSLOAD, 0, },
     {0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },    };
 
 tANI_U32 dot11fUnpackBeacon(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U32 nBuf, tDot11fBeacon *pFrm)
@@ -8738,6 +8957,65 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* ) pFrm->P2PBeacon.NoticeOfAbsence.NoADesc, pFrm->P2PBeacon.NoticeOfAbsence.num_NoADesc);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("VHTExtBssLoad:\n"));
+        if (!pFrm->VHTExtBssLoad.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTExtBssLoad.muMIMOCapStaCount, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTExtBssLoad.ssUnderUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTExtBssLoad.FortyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTExtBssLoad.EightyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTExtBssLoad.OneSixtyMHzUtil, 1);
+        }
     }
 #   endif // DOT11F_DUMP_FRAMES
     return status;
@@ -8867,6 +9145,9 @@
         {offsetof(tDot11fBeacon2, CCXTrafStrmMet), offsetof(tDot11fIECCXTrafStrmMet, present), 0, "CCXTrafStrmMet" , 0, 10, 10, SigIeCCXTrafStrmMet, {0, 64, 150, 7, 0}, 4, DOT11F_EID_CCXTRAFSTRMMET, 0, },
         {offsetof(tDot11fBeacon2, CCXTxmitPower), offsetof(tDot11fIECCXTxmitPower, present), 0, "CCXTxmitPower" , 0, 8, 8, SigIeCCXTxmitPower, {0, 64, 150, 0, 0}, 4, DOT11F_EID_CCXTXMITPOWER, 0, },
         {offsetof(tDot11fBeacon2, P2PBeacon), offsetof(tDot11fIEP2PBeacon, present), 0, "P2PBeacon" , 0, 6, 61, SigIeP2PBeacon, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PBEACON, 0, },
+        {offsetof(tDot11fBeacon2, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, },
+        {offsetof(tDot11fBeacon2, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, },
+        {offsetof(tDot11fBeacon2, VHTExtBssLoad), offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad" , 0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTEXTBSSLOAD, 0, },
     {0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },    };
 
 tANI_U32 dot11fUnpackBeacon2(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U32 nBuf, tDot11fBeacon2 *pFrm)
@@ -9669,6 +9950,65 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* ) pFrm->P2PBeacon.NoticeOfAbsence.NoADesc, pFrm->P2PBeacon.NoticeOfAbsence.num_NoADesc);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("VHTExtBssLoad:\n"));
+        if (!pFrm->VHTExtBssLoad.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTExtBssLoad.muMIMOCapStaCount, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTExtBssLoad.ssUnderUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTExtBssLoad.FortyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTExtBssLoad.EightyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTExtBssLoad.OneSixtyMHzUtil, 1);
+        }
     }
 #   endif // DOT11F_DUMP_FRAMES
     return status;
@@ -9718,6 +10058,9 @@
         {offsetof(tDot11fBeaconIEs, Airgo), offsetof(tDot11fIEAirgo, present), 0, "Airgo" , 0, 5, 232, SigIeAirgo, {0, 10, 245, 0, 0}, 3, DOT11F_EID_AIRGO, 0, },
         {offsetof(tDot11fBeaconIEs, WscBeaconProbeRes), offsetof(tDot11fIEWscBeaconProbeRes, present), 0, "WscBeaconProbeRes" , 0, 6, 319, SigIeWscBeaconProbeRes, {0, 80, 242, 4, 0}, 4, DOT11F_EID_WSCBEACONPROBERES, 0, },
         {offsetof(tDot11fBeaconIEs, P2PBeaconProbeRes), offsetof(tDot11fIEP2PBeaconProbeRes, present), 0, "P2PBeaconProbeRes" , 0, 6, 1150, SigIeP2PBeaconProbeRes, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PBEACONPROBERES, 0, },
+        {offsetof(tDot11fBeaconIEs, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, },
+        {offsetof(tDot11fBeaconIEs, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, },
+        {offsetof(tDot11fBeaconIEs, VHTExtBssLoad), offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad" , 0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTEXTBSSLOAD, 0, },
     {0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },    };
 
 tANI_U32 dot11fUnpackBeaconIEs(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U32 nBuf, tDot11fBeaconIEs *pFrm)
@@ -10772,6 +11115,65 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* ) pFrm->P2PBeaconProbeRes.P2PGroupInfo.P2PClientInfoDesc, pFrm->P2PBeaconProbeRes.P2PGroupInfo.num_P2PClientInfoDesc);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("VHTExtBssLoad:\n"));
+        if (!pFrm->VHTExtBssLoad.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTExtBssLoad.muMIMOCapStaCount, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTExtBssLoad.ssUnderUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTExtBssLoad.FortyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTExtBssLoad.EightyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTExtBssLoad.OneSixtyMHzUtil, 1);
+        }
     }
 #   endif // DOT11F_DUMP_FRAMES
     return status;
@@ -12537,6 +12939,7 @@
         {offsetof(tDot11fProbeRequest, WscProbeReq), offsetof(tDot11fIEWscProbeReq, present), 0, "WscProbeReq" , 0, 6, 286, SigIeWscProbeReq, {0, 80, 242, 4, 0}, 4, DOT11F_EID_WSCPROBEREQ, 0, },
         {offsetof(tDot11fProbeRequest, WFATPC), offsetof(tDot11fIEWFATPC, present), 0, "WFATPC" , 0, 9, 9, SigIeWFATPC, {0, 80, 242, 8, 0}, 5, DOT11F_EID_WFATPC, 0, },
         {offsetof(tDot11fProbeRequest, P2PProbeReq), offsetof(tDot11fIEP2PProbeReq, present), 0, "P2PProbeReq" , 0, 6, 43, SigIeP2PProbeReq, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PPROBEREQ, 0, },
+        {offsetof(tDot11fProbeRequest, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, },
     {0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },    };
 
 tANI_U32 dot11fUnpackProbeRequest(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U32 nBuf, tDot11fProbeRequest *pFrm)
@@ -12907,6 +13310,40 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), ( tANI_U8* )&pFrm->P2PProbeReq.OperatingChannel.channel, 1);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
     }
 #   endif // DOT11F_DUMP_FRAMES
     return status;
@@ -12956,6 +13393,9 @@
         {offsetof(tDot11fProbeResponse, Airgo), offsetof(tDot11fIEAirgo, present), 0, "Airgo" , 0, 5, 232, SigIeAirgo, {0, 10, 245, 0, 0}, 3, DOT11F_EID_AIRGO, 0, },
         {offsetof(tDot11fProbeResponse, WscProbeRes), offsetof(tDot11fIEWscProbeRes, present), 0, "WscProbeRes" , 0, 6, 319, SigIeWscProbeRes, {0, 80, 242, 4, 0}, 4, DOT11F_EID_WSCPROBERES, 0, },
         {offsetof(tDot11fProbeResponse, P2PProbeRes), offsetof(tDot11fIEP2PProbeRes, present), 0, "P2PProbeRes" , 0, 6, 1141, SigIeP2PProbeRes, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PPROBERES, 0, },
+        {offsetof(tDot11fProbeResponse, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, },
+        {offsetof(tDot11fProbeResponse, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, },
+        {offsetof(tDot11fProbeResponse, VHTExtBssLoad), offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad" , 0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTEXTBSSLOAD, 0, },
     {0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },    };
 
 tANI_U32 dot11fUnpackProbeResponse(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U32 nBuf, tDot11fProbeResponse *pFrm)
@@ -13987,6 +14427,65 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* ) pFrm->P2PProbeRes.P2PGroupInfo.P2PClientInfoDesc, pFrm->P2PProbeRes.P2PGroupInfo.num_P2PClientInfoDesc);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("VHTExtBssLoad:\n"));
+        if (!pFrm->VHTExtBssLoad.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTExtBssLoad.muMIMOCapStaCount, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTExtBssLoad.ssUnderUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTExtBssLoad.FortyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTExtBssLoad.EightyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTExtBssLoad.OneSixtyMHzUtil, 1);
+        }
     }
 #   endif // DOT11F_DUMP_FRAMES
     return status;
@@ -14359,6 +14858,8 @@
         {offsetof(tDot11fReAssocRequest, WMMTSPEC), offsetof(tDot11fIEWMMTSPEC, present), offsetof(tDot11fReAssocRequest, num_WMMTSPEC), "WMMTSPEC" , 4, 63, 63, SigIeWMMTSPEC, {0, 80, 242, 2, 2}, 5, DOT11F_EID_WMMTSPEC, 0, },
         {offsetof(tDot11fReAssocRequest, CCXTrafStrmRateSet), offsetof(tDot11fIECCXTrafStrmRateSet, present), 0, "CCXTrafStrmRateSet" , 0, 7, 15, SigIeCCXTrafStrmRateSet, {0, 64, 150, 8, 0}, 4, DOT11F_EID_CCXTRAFSTRMRATESET, 0, },
         {offsetof(tDot11fReAssocRequest, P2PIEOpaque), offsetof(tDot11fIEP2PIEOpaque, present), 0, "P2PIEOpaque" , 0, 8, 255, SigIeP2PIEOpaque, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PIEOPAQUE, 0, },
+        {offsetof(tDot11fReAssocRequest, WFDIEOpaque), offsetof(tDot11fIEWFDIEOpaque, present), 0, "WFDIEOpaque" , 0, 8, 255, SigIeWFDIEOpaque, {80, 111, 154, 10, 0}, 4, DOT11F_EID_WFDIEOPAQUE, 0, },
+        {offsetof(tDot11fReAssocRequest, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, },
     {0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },    };
 
 tANI_U32 dot11fUnpackReAssocRequest(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U32 nBuf, tDot11fReAssocRequest *pFrm)
@@ -15250,6 +15751,50 @@
             FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("num_data: %d.\n"), pFrm->P2PIEOpaque.num_data);
             FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), ( tANI_U8* ) pFrm->P2PIEOpaque.data, pFrm->P2PIEOpaque.num_data);
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("WFDIEOpaque:\n"));
+        if (!pFrm->WFDIEOpaque.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("num_data: %d.\n"), pFrm->WFDIEOpaque.num_data);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), ( tANI_U8* ) pFrm->WFDIEOpaque.data, pFrm->WFDIEOpaque.num_data);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
     }
 #   endif // DOT11F_DUMP_FRAMES
     return status;
@@ -15286,6 +15831,8 @@
         {offsetof(tDot11fReAssocResponse, Airgo), offsetof(tDot11fIEAirgo, present), 0, "Airgo" , 0, 5, 232, SigIeAirgo, {0, 10, 245, 0, 0}, 3, DOT11F_EID_AIRGO, 0, },
         {offsetof(tDot11fReAssocResponse, WscReassocRes), offsetof(tDot11fIEWscReassocRes, present), 0, "WscReassocRes" , 0, 6, 37, SigIeWscReassocRes, {0, 80, 242, 4, 0}, 4, DOT11F_EID_WSCREASSOCRES, 0, },
         {offsetof(tDot11fReAssocResponse, P2PAssocRes), offsetof(tDot11fIEP2PAssocRes, present), 0, "P2PAssocRes" , 0, 6, 17, SigIeP2PAssocRes, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PASSOCRES, 0, },
+        {offsetof(tDot11fReAssocResponse, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, },
+        {offsetof(tDot11fReAssocResponse, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, },
     {0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },    };
 
 tANI_U32 dot11fUnpackReAssocResponse(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U32 nBuf, tDot11fReAssocResponse *pFrm)
@@ -16294,6 +16841,52 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->P2PAssocRes.ExtendedListenTiming.availibilityInterval, 2);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
     }
 #   endif // DOT11F_DUMP_FRAMES
     return status;
@@ -17255,6 +17848,15 @@
                 case SigIeTPCRequest:
                         status |= dot11fUnpackIeTPCRequest(pCtx, pBufRemaining, len, ( tDot11fIETPCRequest* )(pFrm + pIe->offset + sizeof(tDot11fIETPCRequest)*countOffset) );
                             break;
+                case SigIeVHTCaps:
+                        status |= dot11fUnpackIeVHTCaps(pCtx, pBufRemaining, len, ( tDot11fIEVHTCaps* )(pFrm + pIe->offset + sizeof(tDot11fIEVHTCaps)*countOffset) );
+                            break;
+                case SigIeVHTExtBssLoad:
+                        status |= dot11fUnpackIeVHTExtBssLoad(pCtx, pBufRemaining, len, ( tDot11fIEVHTExtBssLoad* )(pFrm + pIe->offset + sizeof(tDot11fIEVHTExtBssLoad)*countOffset) );
+                            break;
+                case SigIeVHTOperation:
+                        status |= dot11fUnpackIeVHTOperation(pCtx, pBufRemaining, len, ( tDot11fIEVHTOperation* )(pFrm + pIe->offset + sizeof(tDot11fIEVHTOperation)*countOffset) );
+                            break;
                 case SigIeWAPI:
                         status |= dot11fUnpackIeWAPI(pCtx, pBufRemaining, len, ( tDot11fIEWAPI* )(pFrm + pIe->offset + sizeof(tDot11fIEWAPI)*countOffset) );
                             break;
@@ -17264,6 +17866,9 @@
                 case SigIeWFATPC:
                         status |= dot11fUnpackIeWFATPC(pCtx, pBufRemaining, len, ( tDot11fIEWFATPC* )(pFrm + pIe->offset + sizeof(tDot11fIEWFATPC)*countOffset) );
                             break;
+                case SigIeWFDIEOpaque:
+                        status |= dot11fUnpackIeWFDIEOpaque(pCtx, pBufRemaining, len, ( tDot11fIEWFDIEOpaque* )(pFrm + pIe->offset + sizeof(tDot11fIEWFDIEOpaque)*countOffset) );
+                            break;
                 case SigIeWMMCaps:
                         status |= dot11fUnpackIeWMMCaps(pCtx, pBufRemaining, len, ( tDot11fIEWMMCaps* )(pFrm + pIe->offset + sizeof(tDot11fIEWMMCaps)*countOffset) );
                             break;
@@ -19317,6 +19922,21 @@
                             byteCount = 0;
                             pIePresent = ( (tDot11fIETPCRequest* )(pFrm + pIe->offset + offset * i  ))->present;
                             break;
+                case SigIeVHTCaps:
+                            offset = sizeof(tDot11fIEVHTCaps);
+                            byteCount = 12;
+                            pIePresent = ( (tDot11fIEVHTCaps* )(pFrm + pIe->offset + offset * i  ))->present;
+                            break;
+                case SigIeVHTExtBssLoad:
+                            offset = sizeof(tDot11fIEVHTExtBssLoad);
+                            byteCount = 5;
+                            pIePresent = ( (tDot11fIEVHTExtBssLoad* )(pFrm + pIe->offset + offset * i  ))->present;
+                            break;
+                case SigIeVHTOperation:
+                            offset = sizeof(tDot11fIEVHTOperation);
+                            byteCount = 5;
+                            pIePresent = ( (tDot11fIEVHTOperation* )(pFrm + pIe->offset + offset * i  ))->present;
+                            break;
                 case SigIeWAPI:
                             offset = sizeof(tDot11fIEWAPI);
                             status |= dot11fGetPackedIEWAPI(pCtx, ( tDot11fIEWAPI* )(pFrm + pIe->offset + offset * i ), pnNeeded);
@@ -19331,6 +19951,11 @@
                             byteCount = 2;
                             pIePresent = ( (tDot11fIEWFATPC* )(pFrm + pIe->offset + offset * i  ))->present;
                             break;
+                case SigIeWFDIEOpaque:
+                            offset = sizeof(tDot11fIEWFDIEOpaque);
+                            byteCount = ((tDot11fIEWFDIEOpaque* )(pFrm + pIe->offset + sizeof(tDot11fIEWFDIEOpaque) * i ))->num_data;
+                            pIePresent = ( (tDot11fIEWFDIEOpaque* )(pFrm + pIe->offset + offset * i  ))->present;
+                            break;
                 case SigIeWMMCaps:
                             offset = sizeof(tDot11fIEWMMCaps);
                             byteCount = 2;
@@ -19649,13 +20274,13 @@
                                    tDot11fFfAddBAParameterSet *pSrc,
                                    tANI_U8 *pBuf)
 {
-    tANI_U16 tmp72__;
-    tmp72__ = 0U;
-    tmp72__ |= ( pSrc->amsduSupported << 0 );
-    tmp72__ |= ( pSrc->policy << 1 );
-    tmp72__ |= ( pSrc->tid << 2 );
-    tmp72__ |= ( pSrc->bufferSize << 6 );
-    frameshtons(pCtx, pBuf, tmp72__, 0);
+    tANI_U16 tmp75__;
+    tmp75__ = 0U;
+    tmp75__ |= ( pSrc->amsduSupported << 0 );
+    tmp75__ |= ( pSrc->policy << 1 );
+    tmp75__ |= ( pSrc->tid << 2 );
+    tmp75__ |= ( pSrc->bufferSize << 6 );
+    frameshtons(pCtx, pBuf, tmp75__, 0);
     (void)pCtx;
 } /* End dot11fPackFfAddBAParameterSet. */
 
@@ -19679,11 +20304,11 @@
                                            tDot11fFfBAStartingSequenceControl *pSrc,
                                            tANI_U8 *pBuf)
 {
-    tANI_U16 tmp73__;
-    tmp73__ = 0U;
-    tmp73__ |= ( pSrc->fragNumber << 0 );
-    tmp73__ |= ( pSrc->ssn << 4 );
-    frameshtons(pCtx, pBuf, tmp73__, 0);
+    tANI_U16 tmp76__;
+    tmp76__ = 0U;
+    tmp76__ |= ( pSrc->fragNumber << 0 );
+    tmp76__ |= ( pSrc->ssn << 4 );
+    frameshtons(pCtx, pBuf, tmp76__, 0);
     (void)pCtx;
 } /* End dot11fPackFfBAStartingSequenceControl. */
 
@@ -19707,25 +20332,25 @@
                               tDot11fFfCapabilities *pSrc,
                               tANI_U8 *pBuf)
 {
-    tANI_U16 tmp74__;
-    tmp74__ = 0U;
-    tmp74__ |= ( pSrc->ess << 0 );
-    tmp74__ |= ( pSrc->ibss << 1 );
-    tmp74__ |= ( pSrc->cfPollable << 2 );
-    tmp74__ |= ( pSrc->cfPollReq << 3 );
-    tmp74__ |= ( pSrc->privacy << 4 );
-    tmp74__ |= ( pSrc->shortPreamble << 5 );
-    tmp74__ |= ( pSrc->pbcc << 6 );
-    tmp74__ |= ( pSrc->channelAgility << 7 );
-    tmp74__ |= ( pSrc->spectrumMgt << 8 );
-    tmp74__ |= ( pSrc->qos << 9 );
-    tmp74__ |= ( pSrc->shortSlotTime << 10 );
-    tmp74__ |= ( pSrc->apsd << 11 );
-    tmp74__ |= ( pSrc->rrm << 12 );
-    tmp74__ |= ( pSrc->dsssOfdm << 13 );
-    tmp74__ |= ( pSrc->delayedBA << 14 );
-    tmp74__ |= ( pSrc->immediateBA << 15 );
-    frameshtons(pCtx, pBuf, tmp74__, 0);
+    tANI_U16 tmp77__;
+    tmp77__ = 0U;
+    tmp77__ |= ( pSrc->ess << 0 );
+    tmp77__ |= ( pSrc->ibss << 1 );
+    tmp77__ |= ( pSrc->cfPollable << 2 );
+    tmp77__ |= ( pSrc->cfPollReq << 3 );
+    tmp77__ |= ( pSrc->privacy << 4 );
+    tmp77__ |= ( pSrc->shortPreamble << 5 );
+    tmp77__ |= ( pSrc->pbcc << 6 );
+    tmp77__ |= ( pSrc->channelAgility << 7 );
+    tmp77__ |= ( pSrc->spectrumMgt << 8 );
+    tmp77__ |= ( pSrc->qos << 9 );
+    tmp77__ |= ( pSrc->shortSlotTime << 10 );
+    tmp77__ |= ( pSrc->apsd << 11 );
+    tmp77__ |= ( pSrc->rrm << 12 );
+    tmp77__ |= ( pSrc->dsssOfdm << 13 );
+    tmp77__ |= ( pSrc->delayedBA << 14 );
+    tmp77__ |= ( pSrc->immediateBA << 15 );
+    frameshtons(pCtx, pBuf, tmp77__, 0);
     (void)pCtx;
 } /* End dot11fPackFfCapabilities. */
 
@@ -19749,12 +20374,12 @@
                                    tDot11fFfDelBAParameterSet *pSrc,
                                    tANI_U8 *pBuf)
 {
-    tANI_U16 tmp75__;
-    tmp75__ = 0U;
-    tmp75__ |= ( pSrc->reserved << 0 );
-    tmp75__ |= ( pSrc->initiator << 11 );
-    tmp75__ |= ( pSrc->tid << 12 );
-    frameshtons(pCtx, pBuf, tmp75__, 0);
+    tANI_U16 tmp78__;
+    tmp78__ = 0U;
+    tmp78__ |= ( pSrc->reserved << 0 );
+    tmp78__ |= ( pSrc->initiator << 11 );
+    tmp78__ |= ( pSrc->tid << 12 );
+    frameshtons(pCtx, pBuf, tmp78__, 0);
     (void)pCtx;
 } /* End dot11fPackFfDelBAParameterSet. */
 
@@ -19850,12 +20475,12 @@
                                 tDot11fFfSMPowerModeSet *pSrc,
                                 tANI_U8 *pBuf)
 {
-    tANI_U8 tmp76__;
-    tmp76__ = 0U;
-    tmp76__ |= ( pSrc->PowerSave_En << 0 );
-    tmp76__ |= ( pSrc->Mode << 1 );
-    tmp76__ |= ( pSrc->reserved << 2 );
-    *pBuf = tmp76__;
+    tANI_U8 tmp79__;
+    tmp79__ = 0U;
+    tmp79__ |= ( pSrc->PowerSave_En << 0 );
+    tmp79__ |= ( pSrc->Mode << 1 );
+    tmp79__ |= ( pSrc->reserved << 2 );
+    *pBuf = tmp79__;
     (void)pCtx;
 } /* End dot11fPackFfSMPowerModeSet. */
 
@@ -19895,19 +20520,19 @@
                         tDot11fFfTSInfo *pSrc,
                         tANI_U8 *pBuf)
 {
-    tANI_U32 tmp77__;
-    tmp77__ = 0U;
-    tmp77__ |= ( pSrc->traffic_type << 0 );
-    tmp77__ |= ( pSrc->tsid << 1 );
-    tmp77__ |= ( pSrc->direction << 5 );
-    tmp77__ |= ( pSrc->access_policy << 7 );
-    tmp77__ |= ( pSrc->aggregation << 9 );
-    tmp77__ |= ( pSrc->psb << 10 );
-    tmp77__ |= ( pSrc->user_priority << 11 );
-    tmp77__ |= ( pSrc->tsinfo_ack_pol << 14 );
-    tmp77__ |= ( pSrc->schedule << 16 );
-    tmp77__ |= ( pSrc->unused << 17 );
-    frameshtonl(pCtx, pBuf, tmp77__, 0);
+    tANI_U32 tmp80__;
+    tmp80__ = 0U;
+    tmp80__ |= ( pSrc->traffic_type << 0 );
+    tmp80__ |= ( pSrc->tsid << 1 );
+    tmp80__ |= ( pSrc->direction << 5 );
+    tmp80__ |= ( pSrc->access_policy << 7 );
+    tmp80__ |= ( pSrc->aggregation << 9 );
+    tmp80__ |= ( pSrc->psb << 10 );
+    tmp80__ |= ( pSrc->user_priority << 11 );
+    tmp80__ |= ( pSrc->tsinfo_ack_pol << 14 );
+    tmp80__ |= ( pSrc->schedule << 16 );
+    tmp80__ |= ( pSrc->unused << 17 );
+    frameshtonl(pCtx, pBuf, tmp80__, 0);
     (void)pCtx;
 } /* End dot11fPackFfTSInfo. */
 
@@ -20004,7 +20629,7 @@
     tANI_U8* pTlvLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp78__;
+    tANI_U8 tmp81__;
     nNeeded += 3;
     if ( nNeeded > nBuf ) return DOT11F_BUFFER_OVERFLOW;
     while ( pSrc->present )
@@ -20013,10 +20638,10 @@
         pBuf += 1; *pnConsumed += 1;
         pTlvLen = pBuf;
         pBuf += 1; *pnConsumed += 1;
-        tmp78__ = 0U;
-        tmp78__ |= ( pSrc->minor << 0 );
-        tmp78__ |= ( pSrc->major << 4 );
-        *pBuf = tmp78__;
+        tmp81__ = 0U;
+        tmp81__ |= ( pSrc->minor << 0 );
+        tmp81__ |= ( pSrc->major << 4 );
+        *pBuf = tmp81__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
@@ -21225,7 +21850,7 @@
     tANI_U8* pTlvLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp79__;
+    tANI_U8 tmp82__;
     nNeeded += 5;
     if ( nNeeded > nBuf ) return DOT11F_BUFFER_OVERFLOW;
     while ( pSrc->present )
@@ -21234,10 +21859,10 @@
         pBuf += 2; *pnConsumed += 2;
         pTlvLen = pBuf;
         pBuf += 2; *pnConsumed += 2;
-        tmp79__ = 0U;
-        tmp79__ |= ( pSrc->minor << 0 );
-        tmp79__ |= ( pSrc->major << 4 );
-        *pBuf = tmp79__;
+        tmp82__ = 0U;
+        tmp82__ |= ( pSrc->minor << 0 );
+        tmp82__ |= ( pSrc->major << 4 );
+        *pBuf = tmp82__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
@@ -21443,7 +22068,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U16 tmp80__;
+    tANI_U16 tmp83__;
     nNeeded  +=  (pSrc->num_key + 11);
     while ( pSrc->present )
     {
@@ -21452,10 +22077,10 @@
         ++pBuf; ++(*pnConsumed);
         pIeLen = pBuf;
         ++pBuf; ++(*pnConsumed);
-        tmp80__ = 0U;
-        tmp80__ |= ( pSrc->keyId << 0 );
-        tmp80__ |= ( pSrc->reserved << 2 );
-        frameshtons(pCtx, pBuf, tmp80__, 0);
+        tmp83__ = 0U;
+        tmp83__ |= ( pSrc->keyId << 0 );
+        tmp83__ |= ( pSrc->reserved << 2 );
+        frameshtons(pCtx, pBuf, tmp83__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
@@ -21712,14 +22337,14 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp81__;
-    tANI_U8 tmp82__;
-    tANI_U8 tmp83__;
     tANI_U8 tmp84__;
     tANI_U8 tmp85__;
     tANI_U8 tmp86__;
     tANI_U8 tmp87__;
     tANI_U8 tmp88__;
+    tANI_U8 tmp89__;
+    tANI_U8 tmp90__;
+    tANI_U8 tmp91__;
     nNeeded  += 18;
     while ( pSrc->present )
     {
@@ -21734,76 +22359,76 @@
         *pBuf = pSrc->reserved;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp81__ = 0U;
-        tmp81__ |= ( pSrc->acbe_aifsn << 0 );
-        tmp81__ |= ( pSrc->acbe_acm << 4 );
-        tmp81__ |= ( pSrc->acbe_aci << 5 );
-        tmp81__ |= ( pSrc->unused1 << 7 );
-        *pBuf = tmp81__;
+        tmp84__ = 0U;
+        tmp84__ |= ( pSrc->acbe_aifsn << 0 );
+        tmp84__ |= ( pSrc->acbe_acm << 4 );
+        tmp84__ |= ( pSrc->acbe_aci << 5 );
+        tmp84__ |= ( pSrc->unused1 << 7 );
+        *pBuf = tmp84__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp82__ = 0U;
-        tmp82__ |= ( pSrc->acbe_min << 0 );
-        tmp82__ |= ( pSrc->acbe_max << 4 );
-        *pBuf = tmp82__;
+        tmp85__ = 0U;
+        tmp85__ |= ( pSrc->acbe_min << 0 );
+        tmp85__ |= ( pSrc->acbe_max << 4 );
+        *pBuf = tmp85__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
         frameshtons(pCtx, pBuf, pSrc->acbe_txoplimit, 0);
         *pnConsumed += 2;
         pBuf += 2;
-        tmp83__ = 0U;
-        tmp83__ |= ( pSrc->acbk_aifsn << 0 );
-        tmp83__ |= ( pSrc->acbk_acm << 4 );
-        tmp83__ |= ( pSrc->acbk_aci << 5 );
-        tmp83__ |= ( pSrc->unused2 << 7 );
-        *pBuf = tmp83__;
+        tmp86__ = 0U;
+        tmp86__ |= ( pSrc->acbk_aifsn << 0 );
+        tmp86__ |= ( pSrc->acbk_acm << 4 );
+        tmp86__ |= ( pSrc->acbk_aci << 5 );
+        tmp86__ |= ( pSrc->unused2 << 7 );
+        *pBuf = tmp86__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp84__ = 0U;
-        tmp84__ |= ( pSrc->acbk_min << 0 );
-        tmp84__ |= ( pSrc->acbk_max << 4 );
-        *pBuf = tmp84__;
+        tmp87__ = 0U;
+        tmp87__ |= ( pSrc->acbk_min << 0 );
+        tmp87__ |= ( pSrc->acbk_max << 4 );
+        *pBuf = tmp87__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
         frameshtons(pCtx, pBuf, pSrc->acbk_txoplimit, 0);
         *pnConsumed += 2;
         pBuf += 2;
-        tmp85__ = 0U;
-        tmp85__ |= ( pSrc->acvi_aifsn << 0 );
-        tmp85__ |= ( pSrc->acvi_acm << 4 );
-        tmp85__ |= ( pSrc->acvi_aci << 5 );
-        tmp85__ |= ( pSrc->unused3 << 7 );
-        *pBuf = tmp85__;
+        tmp88__ = 0U;
+        tmp88__ |= ( pSrc->acvi_aifsn << 0 );
+        tmp88__ |= ( pSrc->acvi_acm << 4 );
+        tmp88__ |= ( pSrc->acvi_aci << 5 );
+        tmp88__ |= ( pSrc->unused3 << 7 );
+        *pBuf = tmp88__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp86__ = 0U;
-        tmp86__ |= ( pSrc->acvi_min << 0 );
-        tmp86__ |= ( pSrc->acvi_max << 4 );
-        *pBuf = tmp86__;
+        tmp89__ = 0U;
+        tmp89__ |= ( pSrc->acvi_min << 0 );
+        tmp89__ |= ( pSrc->acvi_max << 4 );
+        *pBuf = tmp89__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
         frameshtons(pCtx, pBuf, pSrc->acvi_txoplimit, 0);
         *pnConsumed += 2;
         pBuf += 2;
-        tmp87__ = 0U;
-        tmp87__ |= ( pSrc->acvo_aifsn << 0 );
-        tmp87__ |= ( pSrc->acvo_acm << 4 );
-        tmp87__ |= ( pSrc->acvo_aci << 5 );
-        tmp87__ |= ( pSrc->unused4 << 7 );
-        *pBuf = tmp87__;
+        tmp90__ = 0U;
+        tmp90__ |= ( pSrc->acvo_aifsn << 0 );
+        tmp90__ |= ( pSrc->acvo_acm << 4 );
+        tmp90__ |= ( pSrc->acvo_aci << 5 );
+        tmp90__ |= ( pSrc->unused4 << 7 );
+        *pBuf = tmp90__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp88__ = 0U;
-        tmp88__ |= ( pSrc->acvo_min << 0 );
-        tmp88__ |= ( pSrc->acvo_max << 4 );
-        *pBuf = tmp88__;
+        tmp91__ = 0U;
+        tmp91__ |= ( pSrc->acvo_min << 0 );
+        tmp91__ |= ( pSrc->acvo_max << 4 );
+        *pBuf = tmp91__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
@@ -21991,7 +22616,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U16 tmp89__;
+    tANI_U16 tmp92__;
     nNeeded  += 6;
     while ( pSrc->present )
     {
@@ -22006,10 +22631,10 @@
         frameshtons(pCtx, pBuf, pSrc->baPolicy, 0);
         *pnConsumed += 2;
         pBuf += 2;
-        tmp89__ = 0U;
-        tmp89__ |= ( pSrc->baBufferSize << 0 );
-        tmp89__ |= ( pSrc->rsvd << 12 );
-        frameshtons(pCtx, pBuf, tmp89__, 0);
+        tmp92__ = 0U;
+        tmp92__ |= ( pSrc->baBufferSize << 0 );
+        tmp92__ |= ( pSrc->rsvd << 12 );
+        frameshtons(pCtx, pBuf, tmp92__, 0);
         *pnConsumed += 2;
         // fieldsEndFlag  = 1 
         nBuf -=  2 ;
@@ -22428,11 +23053,11 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp90__;
-    tANI_U8 tmp91__;
-    tANI_U8 tmp92__;
     tANI_U8 tmp93__;
     tANI_U8 tmp94__;
+    tANI_U8 tmp95__;
+    tANI_U8 tmp96__;
+    tANI_U8 tmp97__;
     nNeeded  += 5;
     while ( pSrc->present )
     {
@@ -22441,58 +23066,58 @@
         ++pBuf; ++(*pnConsumed);
         pIeLen = pBuf;
         ++pBuf; ++(*pnConsumed);
-        tmp90__ = 0U;
-        tmp90__ |= ( pSrc->LinkMeasurement << 0 );
-        tmp90__ |= ( pSrc->NeighborRpt << 1 );
-        tmp90__ |= ( pSrc->parallel << 2 );
-        tmp90__ |= ( pSrc->repeated << 3 );
-        tmp90__ |= ( pSrc->BeaconPassive << 4 );
-        tmp90__ |= ( pSrc->BeaconActive << 5 );
-        tmp90__ |= ( pSrc->BeaconTable << 6 );
-        tmp90__ |= ( pSrc->BeaconRepCond << 7 );
-        *pBuf = tmp90__;
-        *pnConsumed += 1;
-        pBuf += 1;
-        nBuf -=  1 ;
-        tmp91__ = 0U;
-        tmp91__ |= ( pSrc->FrameMeasurement << 0 );
-        tmp91__ |= ( pSrc->ChannelLoad << 1 );
-        tmp91__ |= ( pSrc->NoiseHistogram << 2 );
-        tmp91__ |= ( pSrc->statistics << 3 );
-        tmp91__ |= ( pSrc->LCIMeasurement << 4 );
-        tmp91__ |= ( pSrc->LCIAzimuth << 5 );
-        tmp91__ |= ( pSrc->TCMCapability << 6 );
-        tmp91__ |= ( pSrc->triggeredTCM << 7 );
-        *pBuf = tmp91__;
-        *pnConsumed += 1;
-        pBuf += 1;
-        nBuf -=  1 ;
-        tmp92__ = 0U;
-        tmp92__ |= ( pSrc->APChanReport << 0 );
-        tmp92__ |= ( pSrc->RRMMIBEnabled << 1 );
-        tmp92__ |= ( pSrc->operatingChanMax << 2 );
-        tmp92__ |= ( pSrc->nonOperatinChanMax << 5 );
-        *pBuf = tmp92__;
-        *pnConsumed += 1;
-        pBuf += 1;
-        nBuf -=  1 ;
         tmp93__ = 0U;
-        tmp93__ |= ( pSrc->MeasurementPilot << 0 );
-        tmp93__ |= ( pSrc->MeasurementPilotEnabled << 3 );
-        tmp93__ |= ( pSrc->NeighborTSFOffset << 4 );
-        tmp93__ |= ( pSrc->RCPIMeasurement << 5 );
-        tmp93__ |= ( pSrc->RSNIMeasurement << 6 );
-        tmp93__ |= ( pSrc->BssAvgAccessDelay << 7 );
+        tmp93__ |= ( pSrc->LinkMeasurement << 0 );
+        tmp93__ |= ( pSrc->NeighborRpt << 1 );
+        tmp93__ |= ( pSrc->parallel << 2 );
+        tmp93__ |= ( pSrc->repeated << 3 );
+        tmp93__ |= ( pSrc->BeaconPassive << 4 );
+        tmp93__ |= ( pSrc->BeaconActive << 5 );
+        tmp93__ |= ( pSrc->BeaconTable << 6 );
+        tmp93__ |= ( pSrc->BeaconRepCond << 7 );
         *pBuf = tmp93__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
         tmp94__ = 0U;
-        tmp94__ |= ( pSrc->BSSAvailAdmission << 0 );
-        tmp94__ |= ( pSrc->AntennaInformation << 1 );
-        tmp94__ |= ( pSrc->reserved << 2 );
+        tmp94__ |= ( pSrc->FrameMeasurement << 0 );
+        tmp94__ |= ( pSrc->ChannelLoad << 1 );
+        tmp94__ |= ( pSrc->NoiseHistogram << 2 );
+        tmp94__ |= ( pSrc->statistics << 3 );
+        tmp94__ |= ( pSrc->LCIMeasurement << 4 );
+        tmp94__ |= ( pSrc->LCIAzimuth << 5 );
+        tmp94__ |= ( pSrc->TCMCapability << 6 );
+        tmp94__ |= ( pSrc->triggeredTCM << 7 );
         *pBuf = tmp94__;
         *pnConsumed += 1;
+        pBuf += 1;
+        nBuf -=  1 ;
+        tmp95__ = 0U;
+        tmp95__ |= ( pSrc->APChanReport << 0 );
+        tmp95__ |= ( pSrc->RRMMIBEnabled << 1 );
+        tmp95__ |= ( pSrc->operatingChanMax << 2 );
+        tmp95__ |= ( pSrc->nonOperatinChanMax << 5 );
+        *pBuf = tmp95__;
+        *pnConsumed += 1;
+        pBuf += 1;
+        nBuf -=  1 ;
+        tmp96__ = 0U;
+        tmp96__ |= ( pSrc->MeasurementPilot << 0 );
+        tmp96__ |= ( pSrc->MeasurementPilotEnabled << 3 );
+        tmp96__ |= ( pSrc->NeighborTSFOffset << 4 );
+        tmp96__ |= ( pSrc->RCPIMeasurement << 5 );
+        tmp96__ |= ( pSrc->RSNIMeasurement << 6 );
+        tmp96__ |= ( pSrc->BssAvgAccessDelay << 7 );
+        *pBuf = tmp96__;
+        *pnConsumed += 1;
+        pBuf += 1;
+        nBuf -=  1 ;
+        tmp97__ = 0U;
+        tmp97__ |= ( pSrc->BSSAvailAdmission << 0 );
+        tmp97__ |= ( pSrc->AntennaInformation << 1 );
+        tmp97__ |= ( pSrc->reserved << 2 );
+        *pBuf = tmp97__;
+        *pnConsumed += 1;
         // fieldsEndFlag  = 1 
         nBuf -=  1 ;
         break;
@@ -22574,7 +23199,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U16 tmp95__;
+    tANI_U16 tmp98__;
     nNeeded  += 14;
     while ( pSrc->present )
     {
@@ -22583,12 +23208,12 @@
         ++pBuf; ++(*pnConsumed);
         pIeLen = pBuf;
         ++pBuf; ++(*pnConsumed);
-        tmp95__ = 0U;
-        tmp95__ |= ( pSrc->aggregation << 0 );
-        tmp95__ |= ( pSrc->tsid << 1 );
-        tmp95__ |= ( pSrc->direction << 5 );
-        tmp95__ |= ( pSrc->reserved << 7 );
-        frameshtons(pCtx, pBuf, tmp95__, 0);
+        tmp98__ = 0U;
+        tmp98__ |= ( pSrc->aggregation << 0 );
+        tmp98__ |= ( pSrc->tsid << 1 );
+        tmp98__ |= ( pSrc->direction << 5 );
+        tmp98__ |= ( pSrc->reserved << 7 );
+        frameshtons(pCtx, pBuf, tmp98__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
@@ -22788,9 +23413,9 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U16 tmp96__;
-    tANI_U8 tmp97__;
-    tANI_U16 tmp98__;
+    tANI_U16 tmp99__;
+    tANI_U8 tmp100__;
+    tANI_U16 tmp101__;
     nNeeded  += 55;
     while ( pSrc->present )
     {
@@ -22799,30 +23424,30 @@
         ++pBuf; ++(*pnConsumed);
         pIeLen = pBuf;
         ++pBuf; ++(*pnConsumed);
-        tmp96__ = 0U;
-        tmp96__ |= ( pSrc->traffic_type << 0 );
-        tmp96__ |= ( pSrc->tsid << 1 );
-        tmp96__ |= ( pSrc->direction << 5 );
-        tmp96__ |= ( pSrc->access_policy << 7 );
-        tmp96__ |= ( pSrc->aggregation << 9 );
-        tmp96__ |= ( pSrc->psb << 10 );
-        tmp96__ |= ( pSrc->user_priority << 11 );
-        tmp96__ |= ( pSrc->tsinfo_ack_pol << 14 );
-        frameshtons(pCtx, pBuf, tmp96__, 0);
+        tmp99__ = 0U;
+        tmp99__ |= ( pSrc->traffic_type << 0 );
+        tmp99__ |= ( pSrc->tsid << 1 );
+        tmp99__ |= ( pSrc->direction << 5 );
+        tmp99__ |= ( pSrc->access_policy << 7 );
+        tmp99__ |= ( pSrc->aggregation << 9 );
+        tmp99__ |= ( pSrc->psb << 10 );
+        tmp99__ |= ( pSrc->user_priority << 11 );
+        tmp99__ |= ( pSrc->tsinfo_ack_pol << 14 );
+        frameshtons(pCtx, pBuf, tmp99__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
-        tmp97__ = 0U;
-        tmp97__ |= ( pSrc->schedule << 0 );
-        tmp97__ |= ( pSrc->unused << 1 );
-        *pBuf = tmp97__;
+        tmp100__ = 0U;
+        tmp100__ |= ( pSrc->schedule << 0 );
+        tmp100__ |= ( pSrc->unused << 1 );
+        *pBuf = tmp100__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp98__ = 0U;
-        tmp98__ |= ( pSrc->size << 0 );
-        tmp98__ |= ( pSrc->fixed << 15 );
-        frameshtons(pCtx, pBuf, tmp98__, 0);
+        tmp101__ = 0U;
+        tmp101__ |= ( pSrc->size << 0 );
+        tmp101__ |= ( pSrc->fixed << 15 );
+        frameshtons(pCtx, pBuf, tmp101__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
@@ -22887,7 +23512,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U16 tmp99__;
+    tANI_U16 tmp102__;
     nNeeded  += 15;
     while ( pSrc->present )
     {
@@ -22909,12 +23534,12 @@
         *pBuf = pSrc->version;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp99__ = 0U;
-        tmp99__ |= ( pSrc->aggregation << 0 );
-        tmp99__ |= ( pSrc->tsid << 1 );
-        tmp99__ |= ( pSrc->direction << 5 );
-        tmp99__ |= ( pSrc->reserved << 7 );
-        frameshtons(pCtx, pBuf, tmp99__, 0);
+        tmp102__ = 0U;
+        tmp102__ |= ( pSrc->aggregation << 0 );
+        tmp102__ |= ( pSrc->tsid << 1 );
+        tmp102__ |= ( pSrc->direction << 5 );
+        tmp102__ |= ( pSrc->reserved << 7 );
+        frameshtons(pCtx, pBuf, tmp102__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
@@ -23153,9 +23778,9 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U16 tmp100__;
-    tANI_U8 tmp101__;
-    tANI_U16 tmp102__;
+    tANI_U16 tmp103__;
+    tANI_U8 tmp104__;
+    tANI_U16 tmp105__;
     nNeeded  += 38;
     while ( pSrc->present )
     {
@@ -23177,30 +23802,30 @@
         *pBuf = pSrc->version;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp100__ = 0U;
-        tmp100__ |= ( pSrc->traffic_type << 0 );
-        tmp100__ |= ( pSrc->tsid << 1 );
-        tmp100__ |= ( pSrc->direction << 5 );
-        tmp100__ |= ( pSrc->access_policy << 7 );
-        tmp100__ |= ( pSrc->aggregation << 9 );
-        tmp100__ |= ( pSrc->psb << 10 );
-        tmp100__ |= ( pSrc->user_priority << 11 );
-        tmp100__ |= ( pSrc->tsinfo_ack_pol << 14 );
-        frameshtons(pCtx, pBuf, tmp100__, 0);
+        tmp103__ = 0U;
+        tmp103__ |= ( pSrc->traffic_type << 0 );
+        tmp103__ |= ( pSrc->tsid << 1 );
+        tmp103__ |= ( pSrc->direction << 5 );
+        tmp103__ |= ( pSrc->access_policy << 7 );
+        tmp103__ |= ( pSrc->aggregation << 9 );
+        tmp103__ |= ( pSrc->psb << 10 );
+        tmp103__ |= ( pSrc->user_priority << 11 );
+        tmp103__ |= ( pSrc->tsinfo_ack_pol << 14 );
+        frameshtons(pCtx, pBuf, tmp103__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
-        tmp101__ = 0U;
-        tmp101__ |= ( pSrc->tsinfo_rsvd << 0 );
-        tmp101__ |= ( pSrc->burst_size_defn << 7 );
-        *pBuf = tmp101__;
+        tmp104__ = 0U;
+        tmp104__ |= ( pSrc->tsinfo_rsvd << 0 );
+        tmp104__ |= ( pSrc->burst_size_defn << 7 );
+        *pBuf = tmp104__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp102__ = 0U;
-        tmp102__ |= ( pSrc->size << 0 );
-        tmp102__ |= ( pSrc->fixed << 15 );
-        frameshtons(pCtx, pBuf, tmp102__, 0);
+        tmp105__ = 0U;
+        tmp105__ |= ( pSrc->size << 0 );
+        tmp105__ |= ( pSrc->fixed << 15 );
+        frameshtons(pCtx, pBuf, tmp105__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
@@ -23345,7 +23970,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp103__;
+    tANI_U8 tmp106__;
     nNeeded  += 2;
     while ( pSrc->present )
     {
@@ -23365,10 +23990,10 @@
         *pBuf = pSrc->mgmt_state;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp103__ = 0U;
-        tmp103__ |= ( pSrc->mbssid_mask << 0 );
-        tmp103__ |= ( pSrc->reserved << 3 );
-        *pBuf = tmp103__;
+        tmp106__ = 0U;
+        tmp106__ |= ( pSrc->mbssid_mask << 0 );
+        tmp106__ |= ( pSrc->reserved << 3 );
+        *pBuf = tmp106__;
         *pnConsumed += 1;
         // fieldsEndFlag  = 1 
         nBuf -=  1 ;
@@ -23728,14 +24353,14 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp104__;
-    tANI_U8 tmp105__;
-    tANI_U8 tmp106__;
     tANI_U8 tmp107__;
     tANI_U8 tmp108__;
     tANI_U8 tmp109__;
     tANI_U8 tmp110__;
     tANI_U8 tmp111__;
+    tANI_U8 tmp112__;
+    tANI_U8 tmp113__;
+    tANI_U8 tmp114__;
     nNeeded  += 18;
     while ( pSrc->present )
     {
@@ -23750,76 +24375,76 @@
         *pBuf = pSrc->reserved;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp104__ = 0U;
-        tmp104__ |= ( pSrc->acbe_aifsn << 0 );
-        tmp104__ |= ( pSrc->acbe_acm << 4 );
-        tmp104__ |= ( pSrc->acbe_aci << 5 );
-        tmp104__ |= ( pSrc->unused1 << 7 );
-        *pBuf = tmp104__;
+        tmp107__ = 0U;
+        tmp107__ |= ( pSrc->acbe_aifsn << 0 );
+        tmp107__ |= ( pSrc->acbe_acm << 4 );
+        tmp107__ |= ( pSrc->acbe_aci << 5 );
+        tmp107__ |= ( pSrc->unused1 << 7 );
+        *pBuf = tmp107__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp105__ = 0U;
-        tmp105__ |= ( pSrc->acbe_acwmin << 0 );
-        tmp105__ |= ( pSrc->acbe_acwmax << 4 );
-        *pBuf = tmp105__;
+        tmp108__ = 0U;
+        tmp108__ |= ( pSrc->acbe_acwmin << 0 );
+        tmp108__ |= ( pSrc->acbe_acwmax << 4 );
+        *pBuf = tmp108__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
         frameshtons(pCtx, pBuf, pSrc->acbe_txoplimit, 0);
         *pnConsumed += 2;
         pBuf += 2;
-        tmp106__ = 0U;
-        tmp106__ |= ( pSrc->acbk_aifsn << 0 );
-        tmp106__ |= ( pSrc->acbk_acm << 4 );
-        tmp106__ |= ( pSrc->acbk_aci << 5 );
-        tmp106__ |= ( pSrc->unused2 << 7 );
-        *pBuf = tmp106__;
+        tmp109__ = 0U;
+        tmp109__ |= ( pSrc->acbk_aifsn << 0 );
+        tmp109__ |= ( pSrc->acbk_acm << 4 );
+        tmp109__ |= ( pSrc->acbk_aci << 5 );
+        tmp109__ |= ( pSrc->unused2 << 7 );
+        *pBuf = tmp109__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp107__ = 0U;
-        tmp107__ |= ( pSrc->acbk_acwmin << 0 );
-        tmp107__ |= ( pSrc->acbk_acwmax << 4 );
-        *pBuf = tmp107__;
+        tmp110__ = 0U;
+        tmp110__ |= ( pSrc->acbk_acwmin << 0 );
+        tmp110__ |= ( pSrc->acbk_acwmax << 4 );
+        *pBuf = tmp110__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
         frameshtons(pCtx, pBuf, pSrc->acbk_txoplimit, 0);
         *pnConsumed += 2;
         pBuf += 2;
-        tmp108__ = 0U;
-        tmp108__ |= ( pSrc->acvi_aifsn << 0 );
-        tmp108__ |= ( pSrc->acvi_acm << 4 );
-        tmp108__ |= ( pSrc->acvi_aci << 5 );
-        tmp108__ |= ( pSrc->unused3 << 7 );
-        *pBuf = tmp108__;
+        tmp111__ = 0U;
+        tmp111__ |= ( pSrc->acvi_aifsn << 0 );
+        tmp111__ |= ( pSrc->acvi_acm << 4 );
+        tmp111__ |= ( pSrc->acvi_aci << 5 );
+        tmp111__ |= ( pSrc->unused3 << 7 );
+        *pBuf = tmp111__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp109__ = 0U;
-        tmp109__ |= ( pSrc->acvi_acwmin << 0 );
-        tmp109__ |= ( pSrc->acvi_acwmax << 4 );
-        *pBuf = tmp109__;
+        tmp112__ = 0U;
+        tmp112__ |= ( pSrc->acvi_acwmin << 0 );
+        tmp112__ |= ( pSrc->acvi_acwmax << 4 );
+        *pBuf = tmp112__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
         frameshtons(pCtx, pBuf, pSrc->acvi_txoplimit, 0);
         *pnConsumed += 2;
         pBuf += 2;
-        tmp110__ = 0U;
-        tmp110__ |= ( pSrc->acvo_aifsn << 0 );
-        tmp110__ |= ( pSrc->acvo_acm << 4 );
-        tmp110__ |= ( pSrc->acvo_aci << 5 );
-        tmp110__ |= ( pSrc->unused4 << 7 );
-        *pBuf = tmp110__;
+        tmp113__ = 0U;
+        tmp113__ |= ( pSrc->acvo_aifsn << 0 );
+        tmp113__ |= ( pSrc->acvo_acm << 4 );
+        tmp113__ |= ( pSrc->acvo_aci << 5 );
+        tmp113__ |= ( pSrc->unused4 << 7 );
+        *pBuf = tmp113__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp111__ = 0U;
-        tmp111__ |= ( pSrc->acvo_acwmin << 0 );
-        tmp111__ |= ( pSrc->acvo_acwmax << 4 );
-        *pBuf = tmp111__;
+        tmp114__ = 0U;
+        tmp114__ |= ( pSrc->acvo_acwmin << 0 );
+        tmp114__ |= ( pSrc->acvo_acwmax << 4 );
+        *pBuf = tmp114__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
@@ -23845,7 +24470,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp112__;
+    tANI_U8 tmp115__;
     nNeeded  += 1;
     while ( pSrc->present )
     {
@@ -23854,12 +24479,12 @@
         ++pBuf; ++(*pnConsumed);
         pIeLen = pBuf;
         ++pBuf; ++(*pnConsumed);
-        tmp112__ = 0U;
-        tmp112__ |= ( pSrc->non_erp_present << 0 );
-        tmp112__ |= ( pSrc->use_prot << 1 );
-        tmp112__ |= ( pSrc->barker_preamble << 2 );
-        tmp112__ |= ( pSrc->unused << 3 );
-        *pBuf = tmp112__;
+        tmp115__ = 0U;
+        tmp115__ |= ( pSrc->non_erp_present << 0 );
+        tmp115__ |= ( pSrc->use_prot << 1 );
+        tmp115__ |= ( pSrc->barker_preamble << 2 );
+        tmp115__ |= ( pSrc->unused << 3 );
+        *pBuf = tmp115__;
         *pnConsumed += 1;
         // fieldsEndFlag  = 1 
         nBuf -=  1 ;
@@ -24056,7 +24681,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U16 tmp113__;
+    tANI_U16 tmp116__;
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
     status = dot11fGetPackedIEFTInfo(pCtx, pSrc, &nNeeded);
     if ( ! DOT11F_SUCCEEDED( status ) ) return status;
@@ -24067,10 +24692,10 @@
         ++pBuf; --nBuf; ++(*pnConsumed);
         pIeLen = pBuf;
         ++pBuf; --nBuf; ++(*pnConsumed);
-        tmp113__ = 0U;
-        tmp113__ |= ( pSrc->reserved << 0 );
-        tmp113__ |= ( pSrc->IECount << 8 );
-        frameshtons(pCtx, pBuf, tmp113__, 0);
+        tmp116__ = 0U;
+        tmp116__ |= ( pSrc->reserved << 0 );
+        tmp116__ |= ( pSrc->IECount << 8 );
+        frameshtons(pCtx, pBuf, tmp116__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
@@ -24142,11 +24767,11 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U16 tmp114__;
-    tANI_U8 tmp115__;
-    tANI_U16 tmp116__;
-    tANI_U32 tmp117__;
+    tANI_U16 tmp117__;
     tANI_U8 tmp118__;
+    tANI_U16 tmp119__;
+    tANI_U32 tmp120__;
+    tANI_U8 tmp121__;
     nNeeded  +=  (pSrc->num_rsvd + 26);
     while ( pSrc->present )
     {
@@ -24155,77 +24780,77 @@
         ++pBuf; ++(*pnConsumed);
         pIeLen = pBuf;
         ++pBuf; ++(*pnConsumed);
-        tmp114__ = 0U;
-        tmp114__ |= ( pSrc->advCodingCap << 0 );
-        tmp114__ |= ( pSrc->supportedChannelWidthSet << 1 );
-        tmp114__ |= ( pSrc->mimoPowerSave << 2 );
-        tmp114__ |= ( pSrc->greenField << 4 );
-        tmp114__ |= ( pSrc->shortGI20MHz << 5 );
-        tmp114__ |= ( pSrc->shortGI40MHz << 6 );
-        tmp114__ |= ( pSrc->txSTBC << 7 );
-        tmp114__ |= ( pSrc->rxSTBC << 8 );
-        tmp114__ |= ( pSrc->delayedBA << 10 );
-        tmp114__ |= ( pSrc->maximalAMSDUsize << 11 );
-        tmp114__ |= ( pSrc->dsssCckMode40MHz << 12 );
-        tmp114__ |= ( pSrc->psmp << 13 );
-        tmp114__ |= ( pSrc->stbcControlFrame << 14 );
-        tmp114__ |= ( pSrc->lsigTXOPProtection << 15 );
-        frameshtons(pCtx, pBuf, tmp114__, 0);
+        tmp117__ = 0U;
+        tmp117__ |= ( pSrc->advCodingCap << 0 );
+        tmp117__ |= ( pSrc->supportedChannelWidthSet << 1 );
+        tmp117__ |= ( pSrc->mimoPowerSave << 2 );
+        tmp117__ |= ( pSrc->greenField << 4 );
+        tmp117__ |= ( pSrc->shortGI20MHz << 5 );
+        tmp117__ |= ( pSrc->shortGI40MHz << 6 );
+        tmp117__ |= ( pSrc->txSTBC << 7 );
+        tmp117__ |= ( pSrc->rxSTBC << 8 );
+        tmp117__ |= ( pSrc->delayedBA << 10 );
+        tmp117__ |= ( pSrc->maximalAMSDUsize << 11 );
+        tmp117__ |= ( pSrc->dsssCckMode40MHz << 12 );
+        tmp117__ |= ( pSrc->psmp << 13 );
+        tmp117__ |= ( pSrc->stbcControlFrame << 14 );
+        tmp117__ |= ( pSrc->lsigTXOPProtection << 15 );
+        frameshtons(pCtx, pBuf, tmp117__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
-        tmp115__ = 0U;
-        tmp115__ |= ( pSrc->maxRxAMPDUFactor << 0 );
-        tmp115__ |= ( pSrc->mpduDensity << 2 );
-        tmp115__ |= ( pSrc->reserved1 << 5 );
-        *pBuf = tmp115__;
+        tmp118__ = 0U;
+        tmp118__ |= ( pSrc->maxRxAMPDUFactor << 0 );
+        tmp118__ |= ( pSrc->mpduDensity << 2 );
+        tmp118__ |= ( pSrc->reserved1 << 5 );
+        *pBuf = tmp118__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
         DOT11F_MEMCPY(pCtx, pBuf, pSrc->supportedMCSSet, 16);
         *pnConsumed += 16;
         pBuf += 16;
-        tmp116__ = 0U;
-        tmp116__ |= ( pSrc->pco << 0 );
-        tmp116__ |= ( pSrc->transitionTime << 1 );
-        tmp116__ |= ( pSrc->reserved2 << 3 );
-        tmp116__ |= ( pSrc->mcsFeedback << 8 );
-        tmp116__ |= ( pSrc->reserved3 << 10 );
-        frameshtons(pCtx, pBuf, tmp116__, 0);
+        tmp119__ = 0U;
+        tmp119__ |= ( pSrc->pco << 0 );
+        tmp119__ |= ( pSrc->transitionTime << 1 );
+        tmp119__ |= ( pSrc->reserved2 << 3 );
+        tmp119__ |= ( pSrc->mcsFeedback << 8 );
+        tmp119__ |= ( pSrc->reserved3 << 10 );
+        frameshtons(pCtx, pBuf, tmp119__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
-        tmp117__ = 0U;
-        tmp117__ |= ( pSrc->txBF << 0 );
-        tmp117__ |= ( pSrc->rxStaggeredSounding << 1 );
-        tmp117__ |= ( pSrc->txStaggeredSounding << 2 );
-        tmp117__ |= ( pSrc->rxZLF << 3 );
-        tmp117__ |= ( pSrc->txZLF << 4 );
-        tmp117__ |= ( pSrc->implicitTxBF << 5 );
-        tmp117__ |= ( pSrc->calibration << 6 );
-        tmp117__ |= ( pSrc->explicitCSITxBF << 8 );
-        tmp117__ |= ( pSrc->explicitUncompressedSteeringMatrix << 9 );
-        tmp117__ |= ( pSrc->explicitBFCSIFeedback << 10 );
-        tmp117__ |= ( pSrc->explicitUncompressedSteeringMatrixFeedback << 13 );
-        tmp117__ |= ( pSrc->explicitCompressedSteeringMatrixFeedback << 16 );
-        tmp117__ |= ( pSrc->csiNumBFAntennae << 19 );
-        tmp117__ |= ( pSrc->uncompressedSteeringMatrixBFAntennae << 21 );
-        tmp117__ |= ( pSrc->compressedSteeringMatrixBFAntennae << 23 );
-        tmp117__ |= ( pSrc->reserved4 << 25 );
-        frameshtonl(pCtx, pBuf, tmp117__, 0);
+        tmp120__ = 0U;
+        tmp120__ |= ( pSrc->txBF << 0 );
+        tmp120__ |= ( pSrc->rxStaggeredSounding << 1 );
+        tmp120__ |= ( pSrc->txStaggeredSounding << 2 );
+        tmp120__ |= ( pSrc->rxZLF << 3 );
+        tmp120__ |= ( pSrc->txZLF << 4 );
+        tmp120__ |= ( pSrc->implicitTxBF << 5 );
+        tmp120__ |= ( pSrc->calibration << 6 );
+        tmp120__ |= ( pSrc->explicitCSITxBF << 8 );
+        tmp120__ |= ( pSrc->explicitUncompressedSteeringMatrix << 9 );
+        tmp120__ |= ( pSrc->explicitBFCSIFeedback << 10 );
+        tmp120__ |= ( pSrc->explicitUncompressedSteeringMatrixFeedback << 13 );
+        tmp120__ |= ( pSrc->explicitCompressedSteeringMatrixFeedback << 16 );
+        tmp120__ |= ( pSrc->csiNumBFAntennae << 19 );
+        tmp120__ |= ( pSrc->uncompressedSteeringMatrixBFAntennae << 21 );
+        tmp120__ |= ( pSrc->compressedSteeringMatrixBFAntennae << 23 );
+        tmp120__ |= ( pSrc->reserved4 << 25 );
+        frameshtonl(pCtx, pBuf, tmp120__, 0);
         *pnConsumed += 4;
         pBuf += 4;
         nBuf -=  4 ;
-        tmp118__ = 0U;
-        tmp118__ |= ( pSrc->antennaSelection << 0 );
-        tmp118__ |= ( pSrc->explicitCSIFeedbackTx << 1 );
-        tmp118__ |= ( pSrc->antennaIndicesFeedbackTx << 2 );
-        tmp118__ |= ( pSrc->explicitCSIFeedback << 3 );
-        tmp118__ |= ( pSrc->antennaIndicesFeedback << 4 );
-        tmp118__ |= ( pSrc->rxAS << 5 );
-        tmp118__ |= ( pSrc->txSoundingPPDUs << 6 );
-        tmp118__ |= ( pSrc->reserved5 << 7 );
-        *pBuf = tmp118__;
+        tmp121__ = 0U;
+        tmp121__ |= ( pSrc->antennaSelection << 0 );
+        tmp121__ |= ( pSrc->explicitCSIFeedbackTx << 1 );
+        tmp121__ |= ( pSrc->antennaIndicesFeedbackTx << 2 );
+        tmp121__ |= ( pSrc->explicitCSIFeedback << 3 );
+        tmp121__ |= ( pSrc->antennaIndicesFeedback << 4 );
+        tmp121__ |= ( pSrc->rxAS << 5 );
+        tmp121__ |= ( pSrc->txSoundingPPDUs << 6 );
+        tmp121__ |= ( pSrc->reserved5 << 7 );
+        *pBuf = tmp121__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
@@ -24251,9 +24876,9 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp119__;
-    tANI_U16 tmp120__;
-    tANI_U16 tmp121__;
+    tANI_U8 tmp122__;
+    tANI_U16 tmp123__;
+    tANI_U16 tmp124__;
     nNeeded  +=  (pSrc->num_rsvd + 22);
     while ( pSrc->present )
     {
@@ -24265,35 +24890,35 @@
         *pBuf = pSrc->primaryChannel;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp119__ = 0U;
-        tmp119__ |= ( pSrc->secondaryChannelOffset << 0 );
-        tmp119__ |= ( pSrc->recommendedTxWidthSet << 2 );
-        tmp119__ |= ( pSrc->rifsMode << 3 );
-        tmp119__ |= ( pSrc->controlledAccessOnly << 4 );
-        tmp119__ |= ( pSrc->serviceIntervalGranularity << 5 );
-        *pBuf = tmp119__;
+        tmp122__ = 0U;
+        tmp122__ |= ( pSrc->secondaryChannelOffset << 0 );
+        tmp122__ |= ( pSrc->recommendedTxWidthSet << 2 );
+        tmp122__ |= ( pSrc->rifsMode << 3 );
+        tmp122__ |= ( pSrc->controlledAccessOnly << 4 );
+        tmp122__ |= ( pSrc->serviceIntervalGranularity << 5 );
+        *pBuf = tmp122__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp120__ = 0U;
-        tmp120__ |= ( pSrc->opMode << 0 );
-        tmp120__ |= ( pSrc->nonGFDevicesPresent << 2 );
-        tmp120__ |= ( pSrc->transmitBurstLimit << 3 );
-        tmp120__ |= ( pSrc->obssNonHTStaPresent << 4 );
-        tmp120__ |= ( pSrc->reserved << 5 );
-        frameshtons(pCtx, pBuf, tmp120__, 0);
+        tmp123__ = 0U;
+        tmp123__ |= ( pSrc->opMode << 0 );
+        tmp123__ |= ( pSrc->nonGFDevicesPresent << 2 );
+        tmp123__ |= ( pSrc->transmitBurstLimit << 3 );
+        tmp123__ |= ( pSrc->obssNonHTStaPresent << 4 );
+        tmp123__ |= ( pSrc->reserved << 5 );
+        frameshtons(pCtx, pBuf, tmp123__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
-        tmp121__ = 0U;
-        tmp121__ |= ( pSrc->basicSTBCMCS << 0 );
-        tmp121__ |= ( pSrc->dualCTSProtection << 7 );
-        tmp121__ |= ( pSrc->secondaryBeacon << 8 );
-        tmp121__ |= ( pSrc->lsigTXOPProtectionFullSupport << 9 );
-        tmp121__ |= ( pSrc->pcoActive << 10 );
-        tmp121__ |= ( pSrc->pcoPhase << 11 );
-        tmp121__ |= ( pSrc->reserved2 << 12 );
-        frameshtons(pCtx, pBuf, tmp121__, 0);
+        tmp124__ = 0U;
+        tmp124__ |= ( pSrc->basicSTBCMCS << 0 );
+        tmp124__ |= ( pSrc->dualCTSProtection << 7 );
+        tmp124__ |= ( pSrc->secondaryBeacon << 8 );
+        tmp124__ |= ( pSrc->lsigTXOPProtectionFullSupport << 9 );
+        tmp124__ |= ( pSrc->pcoActive << 10 );
+        tmp124__ |= ( pSrc->pcoPhase << 11 );
+        tmp124__ |= ( pSrc->reserved2 << 12 );
+        frameshtons(pCtx, pBuf, tmp124__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
@@ -24352,9 +24977,9 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp122__;
-    tANI_U8 tmp123__;
-    tANI_U8 tmp124__;
+    tANI_U8 tmp125__;
+    tANI_U8 tmp126__;
+    tANI_U8 tmp127__;
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
     status = dot11fGetPackedIEMeasurementReport(pCtx, pSrc, &nNeeded);
     if ( ! DOT11F_SUCCEEDED( status ) ) return status;
@@ -24368,12 +24993,12 @@
         *pBuf = pSrc->token;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp122__ = 0U;
-        tmp122__ |= ( pSrc->late << 0 );
-        tmp122__ |= ( pSrc->incapable << 1 );
-        tmp122__ |= ( pSrc->refused << 2 );
-        tmp122__ |= ( pSrc->unused << 3 );
-        *pBuf = tmp122__;
+        tmp125__ = 0U;
+        tmp125__ |= ( pSrc->late << 0 );
+        tmp125__ |= ( pSrc->incapable << 1 );
+        tmp125__ |= ( pSrc->refused << 2 );
+        tmp125__ |= ( pSrc->unused << 3 );
+        *pBuf = tmp125__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
@@ -24393,14 +25018,14 @@
                     frameshtons(pCtx, pBuf, pSrc->report.Basic.meas_duration, 0);
                     *pnConsumed += 2;
                     pBuf += 2;
-                    tmp123__ = 0U;
-                    tmp123__ |= ( pSrc->report.Basic.bss << 0 );
-                    tmp123__ |= ( pSrc->report.Basic.ofdm_preamble << 1 );
-                    tmp123__ |= ( pSrc->report.Basic.unid_signal << 2 );
-                    tmp123__ |= ( pSrc->report.Basic.rader << 3 );
-                    tmp123__ |= ( pSrc->report.Basic.unmeasured << 4 );
-                    tmp123__ |= ( pSrc->report.Basic.unused << 5 );
-                    *pBuf = tmp123__;
+                    tmp126__ = 0U;
+                    tmp126__ |= ( pSrc->report.Basic.bss << 0 );
+                    tmp126__ |= ( pSrc->report.Basic.ofdm_preamble << 1 );
+                    tmp126__ |= ( pSrc->report.Basic.unid_signal << 2 );
+                    tmp126__ |= ( pSrc->report.Basic.rader << 3 );
+                    tmp126__ |= ( pSrc->report.Basic.unmeasured << 4 );
+                    tmp126__ |= ( pSrc->report.Basic.unused << 5 );
+                    *pBuf = tmp126__;
                     *pnConsumed += 1;
                     // fieldsEndFlag  = 1 
                     nBuf -=  1 ;
@@ -24467,10 +25092,10 @@
                     frameshtons(pCtx, pBuf, pSrc->report.Beacon.meas_duration, 0);
                     *pnConsumed += 2;
                     pBuf += 2;
-                    tmp124__ = 0U;
-                    tmp124__ |= ( pSrc->report.Beacon.condensed_PHY << 0 );
-                    tmp124__ |= ( pSrc->report.Beacon.reported_frame_type << 7 );
-                    *pBuf = tmp124__;
+                    tmp127__ = 0U;
+                    tmp127__ |= ( pSrc->report.Beacon.condensed_PHY << 0 );
+                    tmp127__ |= ( pSrc->report.Beacon.reported_frame_type << 7 );
+                    *pBuf = tmp127__;
                     *pnConsumed += 1;
                     pBuf += 1;
                     nBuf -=  1 ;
@@ -24519,7 +25144,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp125__;
+    tANI_U8 tmp128__;
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
     status = dot11fGetPackedIEMeasurementRequest(pCtx, pSrc, &nNeeded);
     if ( ! DOT11F_SUCCEEDED( status ) ) return status;
@@ -24533,14 +25158,14 @@
         *pBuf = pSrc->measurement_token;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp125__ = 0U;
-        tmp125__ |= ( pSrc->parallel << 0 );
-        tmp125__ |= ( pSrc->enable << 1 );
-        tmp125__ |= ( pSrc->request << 2 );
-        tmp125__ |= ( pSrc->report << 3 );
-        tmp125__ |= ( pSrc->durationMandatory << 4 );
-        tmp125__ |= ( pSrc->unused << 5 );
-        *pBuf = tmp125__;
+        tmp128__ = 0U;
+        tmp128__ |= ( pSrc->parallel << 0 );
+        tmp128__ |= ( pSrc->enable << 1 );
+        tmp128__ |= ( pSrc->request << 2 );
+        tmp128__ |= ( pSrc->report << 3 );
+        tmp128__ |= ( pSrc->durationMandatory << 4 );
+        tmp128__ |= ( pSrc->unused << 5 );
+        *pBuf = tmp128__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
@@ -24629,7 +25254,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp126__;
+    tANI_U8 tmp129__;
     nNeeded  += 3;
     while ( pSrc->present )
     {
@@ -24641,11 +25266,11 @@
         frameshtons(pCtx, pBuf, pSrc->MDID, 0);
         *pnConsumed += 2;
         pBuf += 2;
-        tmp126__ = 0U;
-        tmp126__ |= ( pSrc->overDSCap << 0 );
-        tmp126__ |= ( pSrc->resourceReqCap << 1 );
-        tmp126__ |= ( pSrc->reserved << 2 );
-        *pBuf = tmp126__;
+        tmp129__ = 0U;
+        tmp129__ |= ( pSrc->overDSCap << 0 );
+        tmp129__ |= ( pSrc->resourceReqCap << 1 );
+        tmp129__ |= ( pSrc->reserved << 2 );
+        *pBuf = tmp129__;
         *pnConsumed += 1;
         // fieldsEndFlag  = 1 
         nBuf -=  1 ;
@@ -24668,8 +25293,8 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp127__;
-    tANI_U8 tmp128__;
+    tANI_U8 tmp130__;
+    tANI_U8 tmp131__;
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
     status = dot11fGetPackedIENeighborReport(pCtx, pSrc, &nNeeded);
     if ( ! DOT11F_SUCCEEDED( status ) ) return status;
@@ -24683,24 +25308,24 @@
         DOT11F_MEMCPY(pCtx, pBuf, pSrc->bssid, 6);
         *pnConsumed += 6;
         pBuf += 6;
-        tmp127__ = 0U;
-        tmp127__ |= ( pSrc->APReachability << 0 );
-        tmp127__ |= ( pSrc->Security << 2 );
-        tmp127__ |= ( pSrc->KeyScope << 3 );
-        tmp127__ |= ( pSrc->SpecMgmtCap << 4 );
-        tmp127__ |= ( pSrc->QosCap << 5 );
-        tmp127__ |= ( pSrc->apsd << 6 );
-        tmp127__ |= ( pSrc->rrm << 7 );
-        *pBuf = tmp127__;
+        tmp130__ = 0U;
+        tmp130__ |= ( pSrc->APReachability << 0 );
+        tmp130__ |= ( pSrc->Security << 2 );
+        tmp130__ |= ( pSrc->KeyScope << 3 );
+        tmp130__ |= ( pSrc->SpecMgmtCap << 4 );
+        tmp130__ |= ( pSrc->QosCap << 5 );
+        tmp130__ |= ( pSrc->apsd << 6 );
+        tmp130__ |= ( pSrc->rrm << 7 );
+        *pBuf = tmp130__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp128__ = 0U;
-        tmp128__ |= ( pSrc->DelayedBA << 0 );
-        tmp128__ |= ( pSrc->ImmBA << 1 );
-        tmp128__ |= ( pSrc->MobilityDomain << 2 );
-        tmp128__ |= ( pSrc->reserved << 3 );
-        *pBuf = tmp128__;
+        tmp131__ = 0U;
+        tmp131__ |= ( pSrc->DelayedBA << 0 );
+        tmp131__ |= ( pSrc->ImmBA << 1 );
+        tmp131__ |= ( pSrc->MobilityDomain << 2 );
+        tmp131__ |= ( pSrc->reserved << 3 );
+        *pBuf = tmp131__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
@@ -25739,7 +26364,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp129__;
+    tANI_U8 tmp132__;
     nNeeded  += 1;
     while ( pSrc->present )
     {
@@ -25748,13 +26373,13 @@
         ++pBuf; ++(*pnConsumed);
         pIeLen = pBuf;
         ++pBuf; ++(*pnConsumed);
-        tmp129__ = 0U;
-        tmp129__ |= ( pSrc->reserved << 0 );
-        tmp129__ |= ( pSrc->txopreq << 1 );
-        tmp129__ |= ( pSrc->qreq << 2 );
-        tmp129__ |= ( pSrc->qack << 3 );
-        tmp129__ |= ( pSrc->count << 4 );
-        *pBuf = tmp129__;
+        tmp132__ = 0U;
+        tmp132__ |= ( pSrc->reserved << 0 );
+        tmp132__ |= ( pSrc->txopreq << 1 );
+        tmp132__ |= ( pSrc->qreq << 2 );
+        tmp132__ |= ( pSrc->qack << 3 );
+        tmp132__ |= ( pSrc->count << 4 );
+        *pBuf = tmp132__;
         *pnConsumed += 1;
         // fieldsEndFlag  = 1 
         nBuf -=  1 ;
@@ -25777,7 +26402,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp130__;
+    tANI_U8 tmp133__;
     nNeeded  += 1;
     while ( pSrc->present )
     {
@@ -25786,15 +26411,15 @@
         ++pBuf; ++(*pnConsumed);
         pIeLen = pBuf;
         ++pBuf; ++(*pnConsumed);
-        tmp130__ = 0U;
-        tmp130__ |= ( pSrc->more_data_ack << 0 );
-        tmp130__ |= ( pSrc->max_sp_length << 1 );
-        tmp130__ |= ( pSrc->qack << 3 );
-        tmp130__ |= ( pSrc->acbe_uapsd << 4 );
-        tmp130__ |= ( pSrc->acbk_uapsd << 5 );
-        tmp130__ |= ( pSrc->acvi_uapsd << 6 );
-        tmp130__ |= ( pSrc->acvo_uapsd << 7 );
-        *pBuf = tmp130__;
+        tmp133__ = 0U;
+        tmp133__ |= ( pSrc->more_data_ack << 0 );
+        tmp133__ |= ( pSrc->max_sp_length << 1 );
+        tmp133__ |= ( pSrc->qack << 3 );
+        tmp133__ |= ( pSrc->acbe_uapsd << 4 );
+        tmp133__ |= ( pSrc->acbk_uapsd << 5 );
+        tmp133__ |= ( pSrc->acvi_uapsd << 6 );
+        tmp133__ |= ( pSrc->acvo_uapsd << 7 );
+        *pBuf = tmp133__;
         *pnConsumed += 1;
         // fieldsEndFlag  = 1 
         nBuf -=  1 ;
@@ -25912,7 +26537,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U16 tmp131__;
+    tANI_U16 tmp134__;
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
     status = dot11fGetPackedIERSN(pCtx, pSrc, &nNeeded);
     if ( ! DOT11F_SUCCEEDED( status ) ) return status;
@@ -25947,13 +26572,13 @@
         DOT11F_MEMCPY(pCtx, pBuf, &( pSrc->akm_suites ), ( pSrc->akm_suite_count * 4 ));
         *pnConsumed += ( pSrc->akm_suite_count * 4 );
         pBuf += ( pSrc->akm_suite_count * 4 );
-        tmp131__ = 0U;
-        tmp131__ |= ( pSrc->preauth << 0 );
-        tmp131__ |= ( pSrc->no_pwise << 1 );
-        tmp131__ |= ( pSrc->PTKSA_replay_counter << 2 );
-        tmp131__ |= ( pSrc->GTKSA_replay_counter << 4 );
-        tmp131__ |= ( pSrc->reserved << 6 );
-        frameshtons(pCtx, pBuf, tmp131__, 0);
+        tmp134__ = 0U;
+        tmp134__ |= ( pSrc->preauth << 0 );
+        tmp134__ |= ( pSrc->no_pwise << 1 );
+        tmp134__ |= ( pSrc->PTKSA_replay_counter << 2 );
+        tmp134__ |= ( pSrc->GTKSA_replay_counter << 4 );
+        tmp134__ |= ( pSrc->reserved << 6 );
+        frameshtons(pCtx, pBuf, tmp134__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
@@ -26195,6 +26820,162 @@
     return DOT11F_PARSE_SUCCESS;
 } /* End dot11fPackIeTPCRequest. */
 
+tANI_U32 dot11fPackIeVHTCaps(tpAniSirGlobal pCtx,
+                             tDot11fIEVHTCaps *pSrc,
+                             tANI_U8 *pBuf,
+                             tANI_U32 nBuf,
+                             tANI_U32 *pnConsumed)
+{
+    tANI_U8* pIeLen = 0;
+    tANI_U32 nConsumedOnEntry = *pnConsumed;
+    tANI_U32 nNeeded = 0U;
+    tANI_U32 tmp135__;
+    tANI_U16 tmp136__;
+    tANI_U16 tmp137__;
+    nNeeded  += 12;
+    while ( pSrc->present )
+    {
+        if ( nNeeded > nBuf ) return DOT11F_BUFFER_OVERFLOW;
+        *pBuf = 191;
+        ++pBuf; ++(*pnConsumed);
+        pIeLen = pBuf;
+        ++pBuf; ++(*pnConsumed);
+        tmp135__ = 0U;
+        tmp135__ |= ( pSrc->maxMPDULen << 0 );
+        tmp135__ |= ( pSrc->supportedChannelWidthSet << 2 );
+        tmp135__ |= ( pSrc->ldpcCodingCap << 4 );
+        tmp135__ |= ( pSrc->shortGI80MHz << 5 );
+        tmp135__ |= ( pSrc->shortGI160and80plus80MHz << 6 );
+        tmp135__ |= ( pSrc->txSTBC << 7 );
+        tmp135__ |= ( pSrc->rxSTBC << 8 );
+        tmp135__ |= ( pSrc->suBeamFormerCap << 11 );
+        tmp135__ |= ( pSrc->suBeamformeeCap << 12 );
+        tmp135__ |= ( pSrc->csnofBeamformerAntSup << 13 );
+        tmp135__ |= ( pSrc->numSoundingDim << 16 );
+        tmp135__ |= ( pSrc->muBeamformerCap << 19 );
+        tmp135__ |= ( pSrc->muBeamformeeCap << 20 );
+        tmp135__ |= ( pSrc->vhtTXOPPS << 21 );
+        tmp135__ |= ( pSrc->htcVHTCap << 22 );
+        tmp135__ |= ( pSrc->maxAMPDULenExp << 23 );
+        tmp135__ |= ( pSrc->vhtLinkAdaptCap << 26 );
+        tmp135__ |= ( pSrc->rxAntPattern << 28 );
+        tmp135__ |= ( pSrc->txAntPattern << 29 );
+        tmp135__ |= ( pSrc->reserved1 << 30 );
+        frameshtonl(pCtx, pBuf, tmp135__, 0);
+        *pnConsumed += 4;
+        pBuf += 4;
+        nBuf -=  4 ;
+        frameshtons(pCtx, pBuf, pSrc->rxMCSMap, 0);
+        *pnConsumed += 2;
+        pBuf += 2;
+        tmp136__ = 0U;
+        tmp136__ |= ( pSrc->rxHighSupDataRate << 0 );
+        tmp136__ |= ( pSrc->reserved2 << 13 );
+        frameshtons(pCtx, pBuf, tmp136__, 0);
+        *pnConsumed += 2;
+        pBuf += 2;
+        nBuf -=  2 ;
+        frameshtons(pCtx, pBuf, pSrc->txMCSMap, 0);
+        *pnConsumed += 2;
+        pBuf += 2;
+        tmp137__ = 0U;
+        tmp137__ |= ( pSrc->txSupDataRate << 0 );
+        tmp137__ |= ( pSrc->reserved3 << 13 );
+        frameshtons(pCtx, pBuf, tmp137__, 0);
+        *pnConsumed += 2;
+        // fieldsEndFlag  = 1 
+        nBuf -=  2 ;
+        break;
+    }
+    (void)pCtx;
+    if (pIeLen)
+    {
+        *pIeLen = *pnConsumed - nConsumedOnEntry - 2;
+    }
+    return DOT11F_PARSE_SUCCESS;
+} /* End dot11fPackIeVHTCaps. */
+
+tANI_U32 dot11fPackIeVHTExtBssLoad(tpAniSirGlobal pCtx,
+                                   tDot11fIEVHTExtBssLoad *pSrc,
+                                   tANI_U8 *pBuf,
+                                   tANI_U32 nBuf,
+                                   tANI_U32 *pnConsumed)
+{
+    tANI_U8* pIeLen = 0;
+    tANI_U32 nConsumedOnEntry = *pnConsumed;
+    tANI_U32 nNeeded = 0U;
+    nNeeded  += 5;
+    while ( pSrc->present )
+    {
+        if ( nNeeded > nBuf ) return DOT11F_BUFFER_OVERFLOW;
+        *pBuf = 193;
+        ++pBuf; ++(*pnConsumed);
+        pIeLen = pBuf;
+        ++pBuf; ++(*pnConsumed);
+        *pBuf = pSrc->muMIMOCapStaCount;
+        *pnConsumed += 1;
+        pBuf += 1;
+        *pBuf = pSrc->ssUnderUtil;
+        *pnConsumed += 1;
+        pBuf += 1;
+        *pBuf = pSrc->FortyMHzUtil;
+        *pnConsumed += 1;
+        pBuf += 1;
+        *pBuf = pSrc->EightyMHzUtil;
+        *pnConsumed += 1;
+        pBuf += 1;
+        *pBuf = pSrc->OneSixtyMHzUtil;
+        *pnConsumed += 1;
+        // fieldsEndFlag = 1 
+        break;
+    }
+    (void)pCtx;
+    if (pIeLen)
+    {
+        *pIeLen = *pnConsumed - nConsumedOnEntry - 2;
+    }
+    return DOT11F_PARSE_SUCCESS;
+} /* End dot11fPackIeVHTExtBssLoad. */
+
+tANI_U32 dot11fPackIeVHTOperation(tpAniSirGlobal pCtx,
+                                  tDot11fIEVHTOperation *pSrc,
+                                  tANI_U8 *pBuf,
+                                  tANI_U32 nBuf,
+                                  tANI_U32 *pnConsumed)
+{
+    tANI_U8* pIeLen = 0;
+    tANI_U32 nConsumedOnEntry = *pnConsumed;
+    tANI_U32 nNeeded = 0U;
+    nNeeded  += 5;
+    while ( pSrc->present )
+    {
+        if ( nNeeded > nBuf ) return DOT11F_BUFFER_OVERFLOW;
+        *pBuf = 192;
+        ++pBuf; ++(*pnConsumed);
+        pIeLen = pBuf;
+        ++pBuf; ++(*pnConsumed);
+        *pBuf = pSrc->chanWidth;
+        *pnConsumed += 1;
+        pBuf += 1;
+        *pBuf = pSrc->chanCenterFreqSeg1;
+        *pnConsumed += 1;
+        pBuf += 1;
+        *pBuf = pSrc->chanCenterFreqSeg2;
+        *pnConsumed += 1;
+        pBuf += 1;
+        frameshtons(pCtx, pBuf, pSrc->basicMCSSet, 0);
+        *pnConsumed += 2;
+        // fieldsEndFlag = 1 
+        break;
+    }
+    (void)pCtx;
+    if (pIeLen)
+    {
+        *pIeLen = *pnConsumed - nConsumedOnEntry - 2;
+    }
+    return DOT11F_PARSE_SUCCESS;
+} /* End dot11fPackIeVHTOperation. */
+
 tANI_U32 dot11fPackIeWAPI(tpAniSirGlobal pCtx,
                           tDot11fIEWAPI *pSrc,
                           tANI_U8 *pBuf,
@@ -26204,7 +26985,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U16 tmp132__;
+    tANI_U16 tmp138__;
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
     status = dot11fGetPackedIEWAPI(pCtx, pSrc, &nNeeded);
     if ( ! DOT11F_SUCCEEDED( status ) ) return status;
@@ -26233,10 +27014,10 @@
         DOT11F_MEMCPY(pCtx, pBuf, pSrc->multicast_cipher_suite, 4);
         *pnConsumed += 4;
         pBuf += 4;
-        tmp132__ = 0U;
-        tmp132__ |= ( pSrc->preauth << 0 );
-        tmp132__ |= ( pSrc->reserved << 1 );
-        frameshtons(pCtx, pBuf, tmp132__, 0);
+        tmp138__ = 0U;
+        tmp138__ |= ( pSrc->preauth << 0 );
+        tmp138__ |= ( pSrc->reserved << 1 );
+        frameshtons(pCtx, pBuf, tmp138__, 0);
         *pnConsumed += 2;
         pBuf += 2;
         nBuf -=  2 ;
@@ -26332,6 +27113,44 @@
     return DOT11F_PARSE_SUCCESS;
 } /* End dot11fPackIeWFATPC. */
 
+tANI_U32 dot11fPackIeWFDIEOpaque(tpAniSirGlobal pCtx,
+                                 tDot11fIEWFDIEOpaque *pSrc,
+                                 tANI_U8 *pBuf,
+                                 tANI_U32 nBuf,
+                                 tANI_U32 *pnConsumed)
+{
+    tANI_U8* pIeLen = 0;
+    tANI_U32 nConsumedOnEntry = *pnConsumed;
+    tANI_U32 nNeeded = 0U;
+    nNeeded  +=  pSrc->num_data;
+    while ( pSrc->present )
+    {
+        if ( nNeeded > nBuf ) return DOT11F_BUFFER_OVERFLOW;
+        *pBuf = 221;
+        ++pBuf; ++(*pnConsumed);
+        pIeLen = pBuf;
+        ++pBuf; ++(*pnConsumed);
+        *pBuf = 0x50;
+        ++pBuf; ++(*pnConsumed);
+        *pBuf = 0x6f;
+        ++pBuf; ++(*pnConsumed);
+        *pBuf = 0x9a;
+        ++pBuf; ++(*pnConsumed);
+        *pBuf = 0xa;
+        ++pBuf; ++(*pnConsumed);
+        DOT11F_MEMCPY(pCtx, pBuf, &( pSrc->data ), pSrc->num_data);
+        *pnConsumed += pSrc->num_data;
+        // fieldsEndFlag = 1 
+        break;
+    }
+    (void)pCtx;
+    if (pIeLen)
+    {
+        *pIeLen = *pnConsumed - nConsumedOnEntry - 2;
+    }
+    return DOT11F_PARSE_SUCCESS;
+} /* End dot11fPackIeWFDIEOpaque. */
+
 tANI_U32 dot11fPackIeWMMCaps(tpAniSirGlobal pCtx,
                              tDot11fIEWMMCaps *pSrc,
                              tANI_U8 *pBuf,
@@ -26341,7 +27160,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp133__;
+    tANI_U8 tmp139__;
     nNeeded  += 2;
     while ( pSrc->present )
     {
@@ -26363,13 +27182,13 @@
         *pBuf = pSrc->version;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp133__ = 0U;
-        tmp133__ |= ( pSrc->reserved << 0 );
-        tmp133__ |= ( pSrc->qack << 4 );
-        tmp133__ |= ( pSrc->queue_request << 5 );
-        tmp133__ |= ( pSrc->txop_request << 6 );
-        tmp133__ |= ( pSrc->more_ack << 7 );
-        *pBuf = tmp133__;
+        tmp139__ = 0U;
+        tmp139__ |= ( pSrc->reserved << 0 );
+        tmp139__ |= ( pSrc->qack << 4 );
+        tmp139__ |= ( pSrc->queue_request << 5 );
+        tmp139__ |= ( pSrc->txop_request << 6 );
+        tmp139__ |= ( pSrc->more_ack << 7 );
+        *pBuf = tmp139__;
         *pnConsumed += 1;
         // fieldsEndFlag  = 1 
         nBuf -=  1 ;
@@ -26392,7 +27211,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp134__;
+    tANI_U8 tmp140__;
     nNeeded  += 2;
     while ( pSrc->present )
     {
@@ -26414,11 +27233,11 @@
         *pBuf = pSrc->version;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp134__ = 0U;
-        tmp134__ |= ( pSrc->param_set_count << 0 );
-        tmp134__ |= ( pSrc->reserved << 4 );
-        tmp134__ |= ( pSrc->uapsd << 7 );
-        *pBuf = tmp134__;
+        tmp140__ = 0U;
+        tmp140__ |= ( pSrc->param_set_count << 0 );
+        tmp140__ |= ( pSrc->reserved << 4 );
+        tmp140__ |= ( pSrc->uapsd << 7 );
+        *pBuf = tmp140__;
         *pnConsumed += 1;
         // fieldsEndFlag  = 1 
         nBuf -=  1 ;
@@ -26441,7 +27260,7 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp135__;
+    tANI_U8 tmp141__;
     nNeeded  += 2;
     while ( pSrc->present )
     {
@@ -26463,15 +27282,15 @@
         *pBuf = pSrc->version;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp135__ = 0U;
-        tmp135__ |= ( pSrc->acvo_uapsd << 0 );
-        tmp135__ |= ( pSrc->acvi_uapsd << 1 );
-        tmp135__ |= ( pSrc->acbk_uapsd << 2 );
-        tmp135__ |= ( pSrc->acbe_uapsd << 3 );
-        tmp135__ |= ( pSrc->reserved1 << 4 );
-        tmp135__ |= ( pSrc->max_sp_length << 5 );
-        tmp135__ |= ( pSrc->reserved2 << 7 );
-        *pBuf = tmp135__;
+        tmp141__ = 0U;
+        tmp141__ |= ( pSrc->acvo_uapsd << 0 );
+        tmp141__ |= ( pSrc->acvi_uapsd << 1 );
+        tmp141__ |= ( pSrc->acbk_uapsd << 2 );
+        tmp141__ |= ( pSrc->acbe_uapsd << 3 );
+        tmp141__ |= ( pSrc->reserved1 << 4 );
+        tmp141__ |= ( pSrc->max_sp_length << 5 );
+        tmp141__ |= ( pSrc->reserved2 << 7 );
+        *pBuf = tmp141__;
         *pnConsumed += 1;
         // fieldsEndFlag  = 1 
         nBuf -=  1 ;
@@ -26494,14 +27313,14 @@
     tANI_U8* pIeLen = 0;
     tANI_U32 nConsumedOnEntry = *pnConsumed;
     tANI_U32 nNeeded = 0U;
-    tANI_U8 tmp136__;
-    tANI_U8 tmp137__;
-    tANI_U8 tmp138__;
-    tANI_U8 tmp139__;
-    tANI_U8 tmp140__;
-    tANI_U8 tmp141__;
     tANI_U8 tmp142__;
     tANI_U8 tmp143__;
+    tANI_U8 tmp144__;
+    tANI_U8 tmp145__;
+    tANI_U8 tmp146__;
+    tANI_U8 tmp147__;
+    tANI_U8 tmp148__;
+    tANI_U8 tmp149__;
     nNeeded  += 19;
     while ( pSrc->present )
     {
@@ -26529,76 +27348,76 @@
         *pBuf = pSrc->reserved2;
         *pnConsumed += 1;
         pBuf += 1;
-        tmp136__ = 0U;
-        tmp136__ |= ( pSrc->acbe_aifsn << 0 );
-        tmp136__ |= ( pSrc->acbe_acm << 4 );
-        tmp136__ |= ( pSrc->acbe_aci << 5 );
-        tmp136__ |= ( pSrc->unused1 << 7 );
-        *pBuf = tmp136__;
+        tmp142__ = 0U;
+        tmp142__ |= ( pSrc->acbe_aifsn << 0 );
+        tmp142__ |= ( pSrc->acbe_acm << 4 );
+        tmp142__ |= ( pSrc->acbe_aci << 5 );
+        tmp142__ |= ( pSrc->unused1 << 7 );
+        *pBuf = tmp142__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp137__ = 0U;
-        tmp137__ |= ( pSrc->acbe_acwmin << 0 );
-        tmp137__ |= ( pSrc->acbe_acwmax << 4 );
-        *pBuf = tmp137__;
+        tmp143__ = 0U;
+        tmp143__ |= ( pSrc->acbe_acwmin << 0 );
+        tmp143__ |= ( pSrc->acbe_acwmax << 4 );
+        *pBuf = tmp143__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
         frameshtons(pCtx, pBuf, pSrc->acbe_txoplimit, 0);
         *pnConsumed += 2;
         pBuf += 2;
-        tmp138__ = 0U;
-        tmp138__ |= ( pSrc->acbk_aifsn << 0 );
-        tmp138__ |= ( pSrc->acbk_acm << 4 );
-        tmp138__ |= ( pSrc->acbk_aci << 5 );
-        tmp138__ |= ( pSrc->unused2 << 7 );
-        *pBuf = tmp138__;
+        tmp144__ = 0U;
+        tmp144__ |= ( pSrc->acbk_aifsn << 0 );
+        tmp144__ |= ( pSrc->acbk_acm << 4 );
+        tmp144__ |= ( pSrc->acbk_aci << 5 );
+        tmp144__ |= ( pSrc->unused2 << 7 );
+        *pBuf = tmp144__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp139__ = 0U;
-        tmp139__ |= ( pSrc->acbk_acwmin << 0 );
-        tmp139__ |= ( pSrc->acbk_acwmax << 4 );
-        *pBuf = tmp139__;
+        tmp145__ = 0U;
+        tmp145__ |= ( pSrc->acbk_acwmin << 0 );
+        tmp145__ |= ( pSrc->acbk_acwmax << 4 );
+        *pBuf = tmp145__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
         frameshtons(pCtx, pBuf, pSrc->acbk_txoplimit, 0);
         *pnConsumed += 2;
         pBuf += 2;
-        tmp140__ = 0U;
-        tmp140__ |= ( pSrc->acvi_aifsn << 0 );
-        tmp140__ |= ( pSrc->acvi_acm << 4 );
-        tmp140__ |= ( pSrc->acvi_aci << 5 );
-        tmp140__ |= ( pSrc->unused3 << 7 );
-        *pBuf = tmp140__;
+        tmp146__ = 0U;
+        tmp146__ |= ( pSrc->acvi_aifsn << 0 );
+        tmp146__ |= ( pSrc->acvi_acm << 4 );
+        tmp146__ |= ( pSrc->acvi_aci << 5 );
+        tmp146__ |= ( pSrc->unused3 << 7 );
+        *pBuf = tmp146__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp141__ = 0U;
-        tmp141__ |= ( pSrc->acvi_acwmin << 0 );
-        tmp141__ |= ( pSrc->acvi_acwmax << 4 );
-        *pBuf = tmp141__;
+        tmp147__ = 0U;
+        tmp147__ |= ( pSrc->acvi_acwmin << 0 );
+        tmp147__ |= ( pSrc->acvi_acwmax << 4 );
+        *pBuf = tmp147__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
         frameshtons(pCtx, pBuf, pSrc->acvi_txoplimit, 0);
         *pnConsumed += 2;
         pBuf += 2;
-        tmp142__ = 0U;
-        tmp142__ |= ( pSrc->acvo_aifsn << 0 );
-        tmp142__ |= ( pSrc->acvo_acm << 4 );
-        tmp142__ |= ( pSrc->acvo_aci << 5 );
-        tmp142__ |= ( pSrc->unused4 << 7 );
-        *pBuf = tmp142__;
+        tmp148__ = 0U;
+        tmp148__ |= ( pSrc->acvo_aifsn << 0 );
+        tmp148__ |= ( pSrc->acvo_acm << 4 );
+        tmp148__ |= ( pSrc->acvo_aci << 5 );
+        tmp148__ |= ( pSrc->unused4 << 7 );
+        *pBuf = tmp148__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
-        tmp143__ = 0U;
-        tmp143__ |= ( pSrc->acvo_acwmin << 0 );
-        tmp143__ |= ( pSrc->acvo_acwmax << 4 );
-        *pBuf = tmp143__;
+        tmp149__ = 0U;
+        tmp149__ |= ( pSrc->acvo_acwmin << 0 );
+        tmp149__ |= ( pSrc->acvo_acwmax << 4 );
+        *pBuf = tmp149__;
         *pnConsumed += 1;
         pBuf += 1;
         nBuf -=  1 ;
@@ -28183,6 +29002,50 @@
             FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("num_data: %d.\n"), pFrm->P2PIEOpaque.num_data);
             FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* ) pFrm->P2PIEOpaque.data, pFrm->P2PIEOpaque.num_data);
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("WFDIEOpaque:\n"));
+        if (!pFrm->WFDIEOpaque.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("num_data: %d.\n"), pFrm->WFDIEOpaque.num_data);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* ) pFrm->WFDIEOpaque.data, pFrm->WFDIEOpaque.num_data);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
         FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("to:\n"));
         FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), pBuf, nBuf);
     }
@@ -29189,6 +30052,52 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->P2PAssocRes.ExtendedListenTiming.availibilityInterval, 2);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
         FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), FRFL("to:\n"));
         FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCRESPONSE), pBuf, nBuf);
     }
@@ -30522,6 +31431,65 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* ) pFrm->P2PBeacon.NoticeOfAbsence.NoADesc, pFrm->P2PBeacon.NoticeOfAbsence.num_NoADesc);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("VHTExtBssLoad:\n"));
+        if (!pFrm->VHTExtBssLoad.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTExtBssLoad.muMIMOCapStaCount, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTExtBssLoad.ssUnderUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTExtBssLoad.FortyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTExtBssLoad.EightyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), ( tANI_U8* )&pFrm->VHTExtBssLoad.OneSixtyMHzUtil, 1);
+        }
         FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), FRFL("to:\n"));
         FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON), pBuf, nBuf);
     }
@@ -31408,6 +32376,65 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* ) pFrm->P2PBeacon.NoticeOfAbsence.NoADesc, pFrm->P2PBeacon.NoticeOfAbsence.num_NoADesc);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("VHTExtBssLoad:\n"));
+        if (!pFrm->VHTExtBssLoad.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTExtBssLoad.muMIMOCapStaCount, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTExtBssLoad.ssUnderUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTExtBssLoad.FortyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTExtBssLoad.EightyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), ( tANI_U8* )&pFrm->VHTExtBssLoad.OneSixtyMHzUtil, 1);
+        }
         FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), FRFL("to:\n"));
         FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACON2), pBuf, nBuf);
     }
@@ -32467,6 +33494,65 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* ) pFrm->P2PBeaconProbeRes.P2PGroupInfo.P2PClientInfoDesc, pFrm->P2PBeaconProbeRes.P2PGroupInfo.num_P2PClientInfoDesc);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("VHTExtBssLoad:\n"));
+        if (!pFrm->VHTExtBssLoad.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTExtBssLoad.muMIMOCapStaCount, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTExtBssLoad.ssUnderUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTExtBssLoad.FortyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTExtBssLoad.EightyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), ( tANI_U8* )&pFrm->VHTExtBssLoad.OneSixtyMHzUtil, 1);
+        }
         FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), FRFL("to:\n"));
         FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_BEACONIES), pBuf, nBuf);
     }
@@ -34344,6 +35430,40 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), ( tANI_U8* )&pFrm->P2PProbeReq.OperatingChannel.channel, 1);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
         FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), FRFL("to:\n"));
         FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBEREQUEST), pBuf, nBuf);
     }
@@ -35380,6 +36500,65 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* ) pFrm->P2PProbeRes.P2PGroupInfo.P2PClientInfoDesc, pFrm->P2PProbeRes.P2PGroupInfo.num_P2PClientInfoDesc);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("VHTExtBssLoad:\n"));
+        if (!pFrm->VHTExtBssLoad.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTExtBssLoad.muMIMOCapStaCount, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTExtBssLoad.ssUnderUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTExtBssLoad.FortyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTExtBssLoad.EightyMHzUtil, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), ( tANI_U8* )&pFrm->VHTExtBssLoad.OneSixtyMHzUtil, 1);
+        }
         FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), FRFL("to:\n"));
         FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_PROBERESPONSE), pBuf, nBuf);
     }
@@ -36565,6 +37744,50 @@
             FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("num_data: %d.\n"), pFrm->P2PIEOpaque.num_data);
             FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), ( tANI_U8* ) pFrm->P2PIEOpaque.data, pFrm->P2PIEOpaque.num_data);
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("WFDIEOpaque:\n"));
+        if (!pFrm->WFDIEOpaque.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("num_data: %d.\n"), pFrm->WFDIEOpaque.num_data);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), ( tANI_U8* ) pFrm->WFDIEOpaque.data, pFrm->WFDIEOpaque.num_data);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
         FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), FRFL("to:\n"));
         FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCREQUEST), pBuf, nBuf);
     }
@@ -37578,6 +38801,52 @@
                 FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->P2PAssocRes.ExtendedListenTiming.availibilityInterval, 2);
             }
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("VHTCaps:\n"));
+        if (!pFrm->VHTCaps.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("maxMPDULen (2): %d\n"), pFrm->VHTCaps.maxMPDULen);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("supportedChannelWidthSet (2): %d\n"), pFrm->VHTCaps.supportedChannelWidthSet);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("ldpcCodingCap (1): %d\n"), pFrm->VHTCaps.ldpcCodingCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("shortGI80MHz (1): %d\n"), pFrm->VHTCaps.shortGI80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("shortGI160and80plus80MHz (1): %d\n"), pFrm->VHTCaps.shortGI160and80plus80MHz);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("txSTBC (1): %d\n"), pFrm->VHTCaps.txSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("rxSTBC (3): %d\n"), pFrm->VHTCaps.rxSTBC);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("suBeamFormerCap (1): %d\n"), pFrm->VHTCaps.suBeamFormerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("suBeamformeeCap (1): %d\n"), pFrm->VHTCaps.suBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("csnofBeamformerAntSup (3): %d\n"), pFrm->VHTCaps.csnofBeamformerAntSup);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("numSoundingDim (3): %d\n"), pFrm->VHTCaps.numSoundingDim);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("muBeamformerCap (1): %d\n"), pFrm->VHTCaps.muBeamformerCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("muBeamformeeCap (1): %d\n"), pFrm->VHTCaps.muBeamformeeCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("vhtTXOPPS (1): %d\n"), pFrm->VHTCaps.vhtTXOPPS);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("htcVHTCap (1): %d\n"), pFrm->VHTCaps.htcVHTCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("maxAMPDULenExp (3): %d\n"), pFrm->VHTCaps.maxAMPDULenExp);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("vhtLinkAdaptCap (2): %d\n"), pFrm->VHTCaps.vhtLinkAdaptCap);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("rxAntPattern (1): %d\n"), pFrm->VHTCaps.rxAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("txAntPattern (1): %d\n"), pFrm->VHTCaps.txAntPattern);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("reserved1 (2): %d\n"), pFrm->VHTCaps.reserved1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTCaps.rxMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("rxHighSupDataRate (13): %d\n"), pFrm->VHTCaps.rxHighSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("reserved2 (3): %d\n"), pFrm->VHTCaps.reserved2);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTCaps.txMCSMap, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("txSupDataRate (13): %d\n"), pFrm->VHTCaps.txSupDataRate);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("reserved3 (3): %d\n"), pFrm->VHTCaps.reserved3);
+        }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("VHTOperation:\n"));
+        if (!pFrm->VHTOperation.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanWidth, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg1, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.chanCenterFreqSeg2, 1);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), ( tANI_U8* )&pFrm->VHTOperation.basicMCSSet, 2);
+        }
         FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), FRFL("to:\n"));
         FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_REASSOCRESPONSE), pBuf, nBuf);
     }
@@ -38387,6 +39656,15 @@
                     case SigIeTPCRequest:
                         status |= dot11fPackIeTPCRequest(pCtx, ( tDot11fIETPCRequest* )(pSrc + pIe->offset + sizeof(tDot11fIETPCRequest) * i ),  pBufRemaining, nBufRemaining, &len);
                         break;
+                    case SigIeVHTCaps:
+                        status |= dot11fPackIeVHTCaps(pCtx, ( tDot11fIEVHTCaps* )(pSrc + pIe->offset + sizeof(tDot11fIEVHTCaps) * i ),  pBufRemaining, nBufRemaining, &len);
+                        break;
+                    case SigIeVHTExtBssLoad:
+                        status |= dot11fPackIeVHTExtBssLoad(pCtx, ( tDot11fIEVHTExtBssLoad* )(pSrc + pIe->offset + sizeof(tDot11fIEVHTExtBssLoad) * i ),  pBufRemaining, nBufRemaining, &len);
+                        break;
+                    case SigIeVHTOperation:
+                        status |= dot11fPackIeVHTOperation(pCtx, ( tDot11fIEVHTOperation* )(pSrc + pIe->offset + sizeof(tDot11fIEVHTOperation) * i ),  pBufRemaining, nBufRemaining, &len);
+                        break;
                     case SigIeWAPI:
                         status |= dot11fPackIeWAPI(pCtx, ( tDot11fIEWAPI* )(pSrc + pIe->offset + sizeof(tDot11fIEWAPI) * i ),  pBufRemaining, nBufRemaining, &len);
                         break;
@@ -38396,6 +39674,9 @@
                     case SigIeWFATPC:
                         status |= dot11fPackIeWFATPC(pCtx, ( tDot11fIEWFATPC* )(pSrc + pIe->offset + sizeof(tDot11fIEWFATPC) * i ),  pBufRemaining, nBufRemaining, &len);
                         break;
+                    case SigIeWFDIEOpaque:
+                        status |= dot11fPackIeWFDIEOpaque(pCtx, ( tDot11fIEWFDIEOpaque* )(pSrc + pIe->offset + sizeof(tDot11fIEWFDIEOpaque) * i ),  pBufRemaining, nBufRemaining, &len);
+                        break;
                     case SigIeWMMCaps:
                         status |= dot11fPackIeWMMCaps(pCtx, ( tDot11fIEWMMCaps* )(pSrc + pIe->offset + sizeof(tDot11fIEWMMCaps) * i ),  pBufRemaining, nBufRemaining, &len);
                         break;
diff --git a/CORE/SYS/legacy/src/utils/src/macTrace.c b/CORE/SYS/legacy/src/utils/src/macTrace.c
index 96f4885..dc72941 100644
--- a/CORE/SYS/legacy/src/utils/src/macTrace.c
+++ b/CORE/SYS/legacy/src/utils/src/macTrace.c
@@ -324,9 +324,6 @@
 {
     switch( limMsg )
     {
-         CASE_RETURN_STRING(SIR_LIM_RESUME_ACTIVITY_NTF);
-        CASE_RETURN_STRING(SIR_LIM_SUSPEND_ACTIVITY_REQ );
-        CASE_RETURN_STRING(SIR_HAL_SUSPEND_ACTIVITY_RSP );
         CASE_RETURN_STRING(SIR_LIM_RETRY_INTERRUPT_MSG);
         CASE_RETURN_STRING(SIR_BB_XPORT_MGMT_MSG );
         CASE_RETURN_STRING(SIR_LIM_INV_KEY_INTERRUPT_MSG );
diff --git a/CORE/SYS/legacy/src/utils/src/parserApi.c b/CORE/SYS/legacy/src/utils/src/parserApi.c
index 16d2730..106fa55 100644
--- a/CORE/SYS/legacy/src/utils/src/parserApi.c
+++ b/CORE/SYS/legacy/src/utils/src/parserApi.c
@@ -267,22 +267,24 @@
 
 void
 PopulateDot11fChanSwitchAnn(tpAniSirGlobal          pMac,
-                            tDot11fIEChanSwitchAnn *pDot11f)
+                            tDot11fIEChanSwitchAnn *pDot11f,
+                            tpPESession psessionEntry)
 {
-    pDot11f->switchMode = pMac->lim.gLimChannelSwitch.switchMode;
-    pDot11f->newChannel = pMac->lim.gLimChannelSwitch.primaryChannel;
-    pDot11f->switchCount = ( tANI_U8 ) pMac->lim.gLimChannelSwitch.switchCount;
+    pDot11f->switchMode = psessionEntry->gLimChannelSwitch.switchMode;
+    pDot11f->newChannel = psessionEntry->gLimChannelSwitch.primaryChannel;
+    pDot11f->switchCount = ( tANI_U8 ) psessionEntry->gLimChannelSwitch.switchCount;
 
     pDot11f->present = 1;
 } // End PopulateDot11fChanSwitchAnn.
 
 void
 PopulateDot11fExtChanSwitchAnn(tpAniSirGlobal pMac,
-                               tDot11fIEExtChanSwitchAnn *pDot11f)
+                               tDot11fIEExtChanSwitchAnn *pDot11f,
+                               tpPESession psessionEntry)
 {
     //Has to be updated on the cb state basis
     pDot11f->secondaryChannelOffset = 
-             limGetHTCBState(pMac->lim.gLimChannelSwitch.secondarySubBand);
+             psessionEntry->gLimChannelSwitch.secondarySubBand;
 
     pDot11f->present = 1;
 }
@@ -542,7 +544,8 @@
 
 tSirRetStatus
 PopulateDot11fHTCaps(tpAniSirGlobal           pMac,
-                             tDot11fIEHTCaps *pDot11f)
+                           tpPESession      psessionEntry,
+                           tDot11fIEHTCaps *pDot11f)
 {
     tANI_U32                         nCfgValue, nCfgLen;
     tANI_U8                          nCfgValue8;
@@ -572,12 +575,8 @@
     pHTCapabilityInfo = ( tSirMacHTCapabilityInfo* ) &nCfgValue16;
 #endif
 
-    dot11fLog( pMac, LOG1, FL( "HT Caps: %x\n" ), nCfgValue);
-
-
 #ifdef WLAN_SOFTAP_FEATURE  // this is added for fixing CRs on MDM9K platform - 257951, 259577
     pDot11f->advCodingCap             = uHTCapabilityInfo.htCapInfo.advCodingCap;
-    pDot11f->supportedChannelWidthSet = uHTCapabilityInfo.htCapInfo.supportedChannelWidthSet;
     pDot11f->mimoPowerSave            = uHTCapabilityInfo.htCapInfo.mimoPowerSave;
     pDot11f->greenField               = uHTCapabilityInfo.htCapInfo.greenField;
     pDot11f->shortGI20MHz             = uHTCapabilityInfo.htCapInfo.shortGI20MHz;
@@ -592,7 +591,6 @@
     pDot11f->lsigTXOPProtection       = uHTCapabilityInfo.htCapInfo.lsigTXOPProtection;
 #else
     pDot11f->advCodingCap             = pHTCapabilityInfo->advCodingCap;
-    pDot11f->supportedChannelWidthSet = pHTCapabilityInfo->supportedChannelWidthSet;
     pDot11f->mimoPowerSave            = pHTCapabilityInfo->mimoPowerSave;
     pDot11f->greenField               = pHTCapabilityInfo->greenField;
     pDot11f->shortGI20MHz             = pHTCapabilityInfo->shortGI20MHz;
@@ -607,6 +605,16 @@
     pDot11f->lsigTXOPProtection       = pHTCapabilityInfo->lsigTXOPProtection;
 #endif
 
+    // All sessionized entries will need the check below
+    if (psessionEntry == NULL) // Only in case of NO session
+    {
+        pDot11f->supportedChannelWidthSet = uHTCapabilityInfo.htCapInfo.supportedChannelWidthSet;
+    }
+    else
+    {
+        pDot11f->supportedChannelWidthSet = psessionEntry->htSupportedChannelWidthSet;
+    }
+
     /* Ensure that shortGI40MHz is Disabled if supportedChannelWidthSet is
        eHT_CHANNEL_WIDTH_20MHZ */
     if(pDot11f->supportedChannelWidthSet == eHT_CHANNEL_WIDTH_20MHZ)
@@ -690,7 +698,247 @@
     return eSIR_SUCCESS;
 
 } // End PopulateDot11fHTCaps.
+#ifdef WLAN_FEATURE_11AC
 
+void limLogVHTCap(tpAniSirGlobal pMac,
+                              tDot11fIEVHTCaps *pDot11f)
+{
+
+    limLog(pMac, LOGW, FL("maxMPDULen (2): %d\n"), pDot11f->maxMPDULen);
+    limLog(pMac, LOGW, FL("supportedChannelWidthSet (2): %d\n"), pDot11f->supportedChannelWidthSet);
+    limLog(pMac, LOGW, FL("ldpcCodingCap (1): %d\n"), pDot11f->ldpcCodingCap);
+    limLog(pMac, LOGW, FL("shortGI80MHz (1): %d\n"), pDot11f->shortGI80MHz);
+    limLog(pMac, LOGW, FL("shortGI160and80plus80MHz (1): %d\n"), pDot11f->shortGI160and80plus80MHz);
+    limLog(pMac, LOGW, FL("txSTBC (1): %d\n"), pDot11f->txSTBC);
+    limLog(pMac, LOGW, FL("rxSTBC (3): %d\n"), pDot11f->rxSTBC);
+    limLog(pMac, LOGW, FL("suBeamFormerCap (1): %d\n"), pDot11f->suBeamFormerCap);
+    limLog(pMac, LOGW, FL("suBeamformeeCap (1): %d\n"), pDot11f->suBeamformeeCap);
+    limLog(pMac, LOGW, FL("csnofBeamformerAntSup (3): %d\n"), pDot11f->csnofBeamformerAntSup);
+    limLog(pMac, LOGW, FL("numSoundingDim (3): %d\n"), pDot11f->numSoundingDim);
+    limLog(pMac, LOGW, FL("muBeamformerCap (1): %d\n"), pDot11f->muBeamformerCap);
+    limLog(pMac, LOGW, FL("muBeamformeeCap (1): %d\n"), pDot11f->muBeamformeeCap);
+    limLog(pMac, LOGW, FL("vhtTXOPPS (1): %d\n"), pDot11f->vhtTXOPPS);
+    limLog(pMac, LOGW, FL("htcVHTCap (1): %d\n"), pDot11f->htcVHTCap);
+    limLog(pMac, LOGW, FL("maxAMPDULenExp (3): %d\n"), pDot11f->maxAMPDULenExp);
+    limLog(pMac, LOGW, FL("vhtLinkAdaptCap (2): %d\n"), pDot11f->vhtLinkAdaptCap);
+    limLog(pMac, LOGW, FL("rxAntPattern (1): %d\n"), pDot11f->vhtLinkAdaptCap);
+    limLog(pMac, LOGW, FL("txAntPattern (1): %d\n"), pDot11f->vhtLinkAdaptCap);
+    limLog(pMac, LOGW, FL("reserved1 (2): %d\n"), pDot11f->reserved1);
+    limLog(pMac, LOGW, FL("rxMCSMap (16): %d\n"), pDot11f->rxMCSMap);
+    limLog(pMac, LOGW, FL("rxHighSupDataRate (13): %d\n"), pDot11f->rxHighSupDataRate);
+    limLog(pMac, LOGW, FL("reserve (3): %d\n"), pDot11f->reserved2);
+    limLog(pMac, LOGW, FL("txMCSMap (16): %d\n"), pDot11f->txMCSMap);
+    limLog(pMac, LOGW, FL("txSupDataRate (13): %d\n"), pDot11f->txSupDataRate);
+    limLog(pMac, LOGW, FL("reserv (3): %d\n"), pDot11f->reserved3);
+}
+
+void limLogVHTOperation(tpAniSirGlobal pMac,
+                              tDot11fIEVHTOperation *pDot11f)
+{
+
+    limLog(pMac, LOGW, FL("chanWidth : %d\n"), pDot11f->chanWidth);
+    limLog(pMac, LOGW, FL("chanCenterFreqSeg1: %d\n"), pDot11f->chanCenterFreqSeg1);
+    limLog(pMac, LOGW, FL("chanCenterFreqSeg2: %d\n"), pDot11f->chanCenterFreqSeg2);
+    limLog(pMac, LOGW, FL("basicMCSSet: %d\n"), pDot11f->basicMCSSet);
+}
+
+void limLogVHTExtBssLoad(tpAniSirGlobal pMac,
+                              tDot11fIEVHTExtBssLoad *pDot11f)
+{
+    limLog(pMac, LOGW, FL("muMIMOCapStaCount : %d\n"), pDot11f->muMIMOCapStaCount);
+    limLog(pMac, LOGW, FL("ssUnderUtil: %d\n"), pDot11f->ssUnderUtil);
+    limLog(pMac, LOGW, FL("FortyMHzUtil: %d\n"), pDot11f->FortyMHzUtil);
+    limLog(pMac, LOGW, FL("EightyMHzUtil: %d\n"), pDot11f->EightyMHzUtil);
+    limLog(pMac, LOGW, FL("OneSixtyMHzUtil: %d\n"), pDot11f->OneSixtyMHzUtil);
+}
+
+
+tSirRetStatus
+PopulateDot11fVHTCaps(tpAniSirGlobal           pMac,
+                           tDot11fIEVHTCaps *pDot11f)
+{
+    tSirRetStatus        nStatus;
+    tANI_U32             nCfgValue=0;
+
+    pDot11f->present = 1;
+
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_MAX_MPDU_LENGTH, nCfgValue );
+    pDot11f->maxMPDULen =  (nCfgValue & 0x0003);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET,
+                                                             nCfgValue );
+    pDot11f->supportedChannelWidthSet = (nCfgValue & 0x0003);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_LDPC_CODING_CAP, nCfgValue );
+    pDot11f->ldpcCodingCap = (nCfgValue & 0x0001);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_SHORT_GI_80MHZ, nCfgValue );
+    pDot11f->shortGI80MHz= (nCfgValue & 0x0001);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ,
+                                                                nCfgValue );
+    pDot11f->shortGI160and80plus80MHz = (nCfgValue & 0x0001);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_TXSTBC, nCfgValue );
+    pDot11f->txSTBC = (nCfgValue & 0x0001);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_RXSTBC, nCfgValue );
+    pDot11f->rxSTBC = (nCfgValue & 0x0007);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_SU_BEAMFORMER_CAP, nCfgValue );
+    pDot11f->suBeamFormerCap = (nCfgValue & 0x0001);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_SU_BEAMFORMEE_CAP, nCfgValue );
+    pDot11f->suBeamformeeCap = (nCfgValue & 0x0001);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED,
+                                                               nCfgValue );
+    pDot11f->csnofBeamformerAntSup = (nCfgValue & 0x0007);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS,
+                                                               nCfgValue );
+    pDot11f->numSoundingDim = (nCfgValue & 0x0007);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_MU_BEAMFORMER_CAP, nCfgValue );
+    pDot11f->muBeamformerCap = (nCfgValue & 0x0001);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_MU_BEAMFORMEE_CAP, nCfgValue );
+    pDot11f->muBeamformeeCap = (nCfgValue & 0x0001);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_TXOP_PS, nCfgValue );
+    pDot11f->vhtTXOPPS = (nCfgValue & 0x0001);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_HTC_VHTC_CAP, nCfgValue );
+    pDot11f->htcVHTCap = (nCfgValue & 0x0001);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_AMPDU_LEN_EXPONENT, nCfgValue );
+    pDot11f->maxAMPDULenExp = (nCfgValue & 0x0007);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_LINK_ADAPTATION_CAP, nCfgValue );
+    pDot11f->vhtLinkAdaptCap = (nCfgValue & 0x0003);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_RX_ANT_PATTERN, nCfgValue );
+    pDot11f->rxAntPattern = nCfgValue;
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_TX_ANT_PATTERN, nCfgValue );
+    pDot11f->txAntPattern = nCfgValue;
+
+    pDot11f->reserved1= 0;
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_RX_MCS_MAP, nCfgValue );
+    pDot11f->rxMCSMap = (nCfgValue & 0x0000FFFF);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE,
+                                                                  nCfgValue );
+    pDot11f->rxHighSupDataRate = (nCfgValue & 0x00001FFF);
+
+    pDot11f->reserved2= 0;
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_TX_MCS_MAP, nCfgValue );
+    pDot11f->txMCSMap = (nCfgValue & 0x0000FFFF);
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE,
+                                                                  nCfgValue );
+    pDot11f->txSupDataRate = (nCfgValue & 0x00001FFF);
+
+    pDot11f->reserved3= 0;
+
+    limLogVHTCap(pMac, pDot11f);
+
+    return eSIR_SUCCESS;
+
+}
+
+tSirRetStatus
+PopulateDot11fVHTOperation(tpAniSirGlobal   pMac,
+                               tDot11fIEVHTOperation  *pDot11f)
+{
+    tSirRetStatus        nStatus;
+    tANI_U32             nCfgValue=0;
+
+    pDot11f->present = 1;
+
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_CHANNEL_WIDTH, nCfgValue );
+    pDot11f->chanWidth = (tANI_U8)nCfgValue;
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT1,
+                                                               nCfgValue );
+    pDot11f->chanCenterFreqSeg1 = (tANI_U8)nCfgValue;
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_CHANNEL_CENTER_FREQ_SEGMENT2,
+                                                               nCfgValue );
+    pDot11f->chanCenterFreqSeg2 = (tANI_U8)nCfgValue;
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_BASIC_MCS_SET,nCfgValue );
+    pDot11f->basicMCSSet = (tANI_U16)nCfgValue;
+
+    limLogVHTOperation(pMac,pDot11f);
+
+    return eSIR_SUCCESS;
+
+}
+
+tSirRetStatus
+PopulateDot11fVHTExtBssLoad(tpAniSirGlobal      pMac,
+                           tDot11fIEVHTExtBssLoad   *pDot11f)
+{
+    tSirRetStatus    nStatus;
+    tANI_U32         nCfgValue=0;
+
+    pDot11f->present = 1;
+
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_MU_MIMO_CAP_STA_COUNT,
+                                                         nCfgValue );
+    pDot11f->muMIMOCapStaCount = (tANI_U8)nCfgValue;
+
+    nCfgValue = 0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_SS_UNDER_UTIL,nCfgValue );
+    pDot11f->ssUnderUtil = (tANI_U8)nCfgValue;
+
+    nCfgValue=0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_40MHZ_UTILIZATION,nCfgValue );
+    pDot11f->FortyMHzUtil = (tANI_U8)nCfgValue;
+
+    nCfgValue=0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_80MHZ_UTILIZATION,nCfgValue );
+    pDot11f->EightyMHzUtil = (tANI_U8)nCfgValue;
+
+    nCfgValue=0;
+    CFG_GET_INT( nStatus, pMac, WNI_CFG_VHT_160MHZ_UTILIZATION,nCfgValue );
+    pDot11f->EightyMHzUtil = (tANI_U8)nCfgValue;
+
+    limLogVHTExtBssLoad(pMac,pDot11f);
+
+    return eSIR_SUCCESS;
+}
+
+
+#endif
 #ifdef WLAN_SOFTAP_FEATURE
 tSirRetStatus
 PopulateDot11fHTInfo(tpAniSirGlobal   pMac,
@@ -737,11 +985,19 @@
     htInfoField1 = ( tANI_U8 ) nCfgValue;
 
     pHTInfoField1 = ( tSirMacHTInfoField1* ) &htInfoField1;
-    pHTInfoField1->secondaryChannelOffset     = pMac->lim.gHTSecondaryChannelOffset;
-    pHTInfoField1->recommendedTxWidthSet      = pMac->lim.gHTRecommendedTxWidthSet;
     pHTInfoField1->rifsMode                   = psessionEntry->beaconParams.fRIFSMode;
     pHTInfoField1->serviceIntervalGranularity = pMac->lim.gHTServiceIntervalGranularity;
 
+    if (psessionEntry == NULL)
+    {
+        PELOGE(limLog(pMac, LOG1,
+            FL("Keep the value retrieved from cfg for secondary channel offset and recommended Tx Width set\n"));)
+    }
+    else
+    {
+        pHTInfoField1->secondaryChannelOffset     = psessionEntry->htSecondaryChannelOffset;
+        pHTInfoField1->recommendedTxWidthSet      = psessionEntry->htRecommendedTxWidthSet;
+    }
 
 #ifdef WLAN_SOFTAP_FEATURE
     if(psessionEntry->limSystemRole == eLIM_AP_ROLE ){
@@ -1591,11 +1847,19 @@
         pProbeReq->wscIePresent = 1;
         memcpy(&pProbeReq->probeReqWscIeInfo, &pr.WscProbeReq, sizeof(tDot11fIEWscProbeReq));
     }
+#ifdef WLAN_FEATURE_11AC
+    if ( pr.VHTCaps.present )
+    {
+        palCopyMemory( pMac, &pProbeReq->VHTCaps, &pr.VHTCaps, sizeof( tDot11fIEVHTCaps ) );
+    }
+#endif
+
 
     if ( pr.P2PProbeReq.present )
     {
         pProbeReq->p2pIePresent = 1;
     }
+
     return eSIR_SUCCESS;
 
 } // End sirConvertProbeReqFrame2Struct.
@@ -1817,6 +2081,20 @@
                                                 sizeof(tDot11fIEP2PProbeRes) );
     }
 #endif
+#ifdef WLAN_FEATURE_11AC
+    if ( pr.VHTCaps.present )
+    {
+       palCopyMemory( pMac, &pProbeResp->VHTCaps, &pr.VHTCaps, sizeof( tDot11fIEVHTCaps ) );
+    }
+    if ( pr.VHTOperation.present )
+    {
+        palCopyMemory( pMac, &pProbeResp->VHTOperation, &pr.VHTOperation, sizeof( tDot11fIEVHTOperation) );
+    }
+    if ( pr.VHTExtBssLoad.present )
+    {
+        palCopyMemory( pMac, &pProbeResp->VHTExtBssLoad, &pr.VHTExtBssLoad, sizeof( tDot11fIEVHTExtBssLoad) );
+    }
+#endif
     return eSIR_SUCCESS;
 
 } // End sirConvertProbeFrame2Struct.
@@ -1934,6 +2212,14 @@
     }
 #endif
 
+#ifdef WLAN_FEATURE_WFD
+    if(ar.WFDIEOpaque.present)
+    {
+        pAssocReq->addIEPresent = 1;
+        ConvertWFDOpaque( pMac, &pAssocReq->addIE, &ar.WFDIEOpaque);
+    }
+#endif
+
     // Power Capabilities
     if ( ar.PowerCaps.present )
     {
@@ -1977,6 +2263,15 @@
         return eSIR_FAILURE;
     }
 
+#ifdef WLAN_FEATURE_11AC
+    if ( ar.VHTCaps.present )
+    {
+        palCopyMemory( pMac, &pAssocReq->VHTCaps, &ar.VHTCaps, sizeof( tDot11fIEVHTCaps ) );
+        limLog( pMac, LOGW, FL("Received Assoc Req with VHT Cap\n"));
+        limLogVHTCap( pMac, &pAssocReq->VHTCaps);
+    }
+#endif
+
     return eSIR_SUCCESS;
 
 } // End sirConvertAssocReqFrame2Struct.
@@ -2129,6 +2424,21 @@
     }    
 #endif
 
+#ifdef WLAN_FEATURE_11AC
+    if ( ar.VHTCaps.present )
+    {
+        palCopyMemory( pMac, &pAssocRsp->VHTCaps, &ar.VHTCaps, sizeof( tDot11fIEVHTCaps ) );
+        limLog( pMac, LOGW, FL("Received Assoc Response with VHT Cap\n"));
+        limLogVHTCap(pMac, &pAssocRsp->VHTCaps);
+    }
+    if ( ar.VHTOperation.present )
+    {
+        palCopyMemory( pMac, &pAssocRsp->VHTOperation, &ar.VHTOperation, sizeof( tDot11fIEVHTOperation) );
+        limLog( pMac, LOGW, FL("Received Assoc Response with VHT Operation\n"));
+        limLogVHTOperation(pMac, &pAssocRsp->VHTOperation);
+    }
+#endif
+
     return eSIR_SUCCESS;
 
 } // End sirConvertAssocRespFrame2Struct.
@@ -2291,6 +2601,20 @@
     }
 #endif
 
+#ifdef WLAN_FEATURE_WFD
+    if(ar.WFDIEOpaque.present)
+    {
+        pAssocReq->addIEPresent = 1;
+        ConvertWFDOpaque( pMac, &pAssocReq->addIE, &ar.WFDIEOpaque);
+    }
+#endif
+
+#ifdef WLAN_FEATURE_11AC
+    if ( ar.VHTCaps.present )
+    {
+        palCopyMemory( pMac, &pAssocReq->VHTCaps, &ar.VHTCaps, sizeof( tDot11fIEVHTCaps ) );
+    }
+#endif
     return eSIR_SUCCESS;
 
 } // End sirConvertReassocReqFrame2Struct.
@@ -2496,8 +2820,26 @@
         ConvertERPInfo( pMac, &pBeaconStruct->erpIEInfo, &pBies->ERPInfo );
     }
 
+#ifdef WLAN_FEATURE_11AC
+    if ( pBies->VHTCaps.present )
+    {
+        pBeaconStruct->VHTCaps.present = 1;
+        palCopyMemory( pMac, &pBeaconStruct->VHTCaps, &pBies->VHTCaps, sizeof( tDot11fIEVHTCaps ) );
+    }
+    if ( pBies->VHTOperation.present )
+    {
+         pBeaconStruct->VHTOperation.present = 1;
+         palCopyMemory( pMac, &pBeaconStruct->VHTOperation, &pBies->VHTOperation, sizeof( tDot11fIEVHTOperation) );
+    }
+    if ( pBies->VHTExtBssLoad.present )
+    {
+         pBeaconStruct->VHTExtBssLoad.present = 1;
+         palCopyMemory( pMac, &pBeaconStruct->VHTExtBssLoad, &pBies->VHTExtBssLoad, sizeof( tDot11fIEVHTExtBssLoad) );
+    }
+#endif
     palFreeMemory(pMac->hHdd, pBies);
 
+
     return eSIR_SUCCESS;
 
 } // End sirParseBeaconIE.
@@ -2741,6 +3083,21 @@
     }
 #endif
 
+#ifdef WLAN_FEATURE_11AC
+    if ( beacon.VHTCaps.present )
+    {
+        palCopyMemory( pMac, &pBeaconStruct->VHTCaps, &beacon.VHTCaps, sizeof( tDot11fIEVHTCaps ) );
+    }
+    if ( beacon.VHTOperation.present )
+    {
+        palCopyMemory( pMac, &pBeaconStruct->VHTOperation, &beacon.VHTOperation, sizeof( tDot11fIEVHTOperation) );
+    }
+    if ( beacon.VHTExtBssLoad.present )
+    {
+        palCopyMemory( pMac, &pBeaconStruct->VHTExtBssLoad, &beacon.VHTExtBssLoad, sizeof( tDot11fIEVHTExtBssLoad) );
+    }
+#endif
+
     return eSIR_SUCCESS;
 
 } // End sirConvertBeaconFrame2Struct.
diff --git a/CORE/SYS/legacy/src/utils/src/utilsParser.c b/CORE/SYS/legacy/src/utils/src/utilsParser.c
index 5d9568e..aa5a83c 100644
--- a/CORE/SYS/legacy/src/utils/src/utilsParser.c
+++ b/CORE/SYS/legacy/src/utils/src/utilsParser.c
@@ -168,6 +168,28 @@
 }
 #endif
 
+#ifdef WLAN_FEATURE_WFD
+tSirRetStatus ConvertWFDOpaque( tpAniSirGlobal      pMac,
+                                tSirAddie           *pOld,
+                                tDot11fIEWFDIEOpaque *pNew )
+{
+    // This is awful, I know, but the old code just rammed the IE into
+    // an opaque array.  Note that we need to explicitly add the vendorIE and OUI !
+    tANI_U8 curAddIELen = pOld->length; 
+
+    pOld->length    = curAddIELen + pNew->num_data + 6;
+    pOld->addIEdata[ curAddIELen++ ] = 0xdd;
+    pOld->addIEdata[ curAddIELen++ ] = pNew->num_data + 4;
+    pOld->addIEdata[ curAddIELen++ ] = 0x50;
+    pOld->addIEdata[ curAddIELen++ ] = 0x6f;
+    pOld->addIEdata[ curAddIELen++ ] = 0x9A;
+    pOld->addIEdata[ curAddIELen++ ] = 0x0a;
+    palCopyMemory( pMac->hHdd, pOld->addIEdata + curAddIELen, pNew->data, pNew->num_data );
+
+    return eSIR_SUCCESS;
+}
+#endif
+
 tSirRetStatus ConvertRSN(tpAniSirGlobal  pMac,
                                tSirMacRsnInfo *pOld,
                                tDot11fIERSN      *pNew)
diff --git a/CORE/TL/inc/wlan_qct_tl.h b/CORE/TL/inc/wlan_qct_tl.h
index 610408c..a85cbc5 100644
--- a/CORE/TL/inc/wlan_qct_tl.h
+++ b/CORE/TL/inc/wlan_qct_tl.h
@@ -775,6 +775,18 @@
    v_PVOID_t                       pUserCtxt
 );
 
+typedef struct
+{
+    // Common for all types are requests
+    v_U16_t                         msgType;    // message type is same as the request type
+    v_U16_t                         msgLen;  // length of the entire request
+    v_U8_t                          sessionId; //sme Session Id
+    v_U8_t                          rssiNotification;    
+    v_PVOID_t                       tlCallback;
+    v_PVOID_t                       pAdapter;
+    v_PVOID_t                       pUserCtxt;
+} WLANTL_TlIndicationReq;
+
 /*----------------------------------------------------------------------------
  * Function Declarations and Documentation
  * -------------------------------------------------------------------------*/
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index 7b883a1..93b27fb 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -5100,12 +5100,15 @@
           continue;
         }
 
+/* This will be handled within statistics module */
+#ifndef FEATURE_WLAN_INTEGRATED_SOC
 #ifdef WLAN_SOFTAP_FEATURE
     /* RX Statistics Data */
       /* This is RX UC data frame */
       pTLCb->atlSTAClients[ucSTAId].trafficStatistics.rxUCFcnt++;
       pTLCb->atlSTAClients[ucSTAId].trafficStatistics.rxUCBcnt += usPktLen;
 #endif
+#endif /* FEATURE_WLAN_INTEGRATED_SOC */
 
     }/* else data frame*/
 
@@ -5880,6 +5883,10 @@
     return vosStatus;
   }
 
+#ifdef FEATURE_WLAN_INTEGRATED_SOC
+  WLANTL_StatHandleTXFrame(pvosGCtx, ucSTAId, vosDataBuff, NULL, &tlMetaInfo);
+#endif /* FEATURE_WLAN_INTEGRATED_SOC */
+
 #ifdef WLAN_SOFTAP_FEATURE
   /*There are still packets in HDD - set back the pending packets and 
    the no more data assumption*/
diff --git a/CORE/TL/src/wlan_qct_tl_hosupport.c b/CORE/TL/src/wlan_qct_tl_hosupport.c
index 3c80984..e77bb74 100644
--- a/CORE/TL/src/wlan_qct_tl_hosupport.c
+++ b/CORE/TL/src/wlan_qct_tl_hosupport.c
@@ -433,7 +433,7 @@
    if(WDA_IS_RX_BCAST(pBDHeader))
    {
       TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"This is RX BC/MC frame"));
-      if(VOS_FALSE == isBroadcast)
+      if(isBroadcast)
       {
          TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"This is RX BC frame"));
          statistics->rxBCFcnt++;
@@ -455,6 +455,11 @@
 
    /* TODO caculation is needed, dimension of 500kbps */
    statistics->rxRate = WDA_GET_RX_MAC_RATE_IDX(pBDHeader);
+   
+   TLLOG1(VOS_TRACE (VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_MED,
+                  "****Received rate Index = %ld type=%d subtype=%d****\n",
+                  statistics->rxRate,WDA_GET_RX_TYPE(pBDHeader),WDA_GET_RX_SUBTYPE(pBDHeader)));
+
    statistics->rxBcnt += (packetSize - WLANHAL_RX_BD_HEADER_SIZE);
 
 #ifdef WLANTL_HO_DEBUG_MSG
@@ -481,6 +486,9 @@
    v_U8_t           STAid,
    vos_pkt_t       *dataBuffer,
    v_PVOID_t        pBDHeader
+#ifdef FEATURE_WLAN_INTEGRATED_SOC
+  ,WLANTL_MetaInfoType *txMetaInfo
+#endif /* FEATURE_WLAN_INTEGRATED_SOC */
 )
 {
    WLANTL_CbType            *tlCtxt = VOS_GET_TL_CB(pAdapter);
@@ -503,35 +511,39 @@
    /* TODO : BC/MC/UC have to be determined by MAC address */
    statistics = &tlCtxt->atlSTAClients[STAid].trafficStatistics;
    vos_pkt_get_packet_length(dataBuffer, &packetSize);
+#ifdef FEATURE_WLAN_INTEGRATED_SOC
+   if(txMetaInfo->ucBcast)
+#else
    if(WLANTL_STA_ID_BCAST == STAid)
+#endif /* FEATURE_WLAN_INTEGRATED_SOC */
    {
       TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"This TX is BC frame"));
       statistics->txBCFcnt++;
+#ifdef FEATURE_WLAN_INTEGRATED_SOC
+      statistics->txBCBcnt += packetSize;
+#else
       statistics->txBCBcnt += (packetSize - WLANHAL_TX_BD_HEADER_SIZE);
+#endif /* FEATURE_WLAN_INTEGRATED_SOC */
    }
-/*
-   if(WLANHAL_TX_BD_GET_UB(pBDHeader))
+   else if(txMetaInfo->ucMcast)
    {
-      TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"This TX is BC/MC frame"));
-      if(WLANTL_STA_ID_BCAST == STAid)
-      {
-         TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"This TX is BC frame"));
-         statistics->txBCFcnt++;
-         statistics->txBCBcnt += (packetSize - WLANHAL_TX_BD_HEADER_SIZE);
-      }
-      else
-      {
-         TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"This TX is MC frame"));
-         statistics->txMCFcnt++;
-         statistics->txMCBcnt += (packetSize - WLANHAL_RX_BD_HEADER_SIZE);
-      }
+      TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"This TX is MC frame"));
+      statistics->txMCFcnt++;
+#ifdef FEATURE_WLAN_INTEGRATED_SOC
+      statistics->txMCBcnt += packetSize;
+#else
+      statistics->txMCBcnt += (packetSize - WLANHAL_RX_BD_HEADER_SIZE);
+#endif /* FEATURE_WLAN_INTEGRATED_SOC */
    }
-*/
    else
    {
       TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"This is TX UC frame"));
       statistics->txUCFcnt++;
+#ifdef FEATURE_WLAN_INTEGRATED_SOC
+      statistics->txUCBcnt += packetSize;
+#else
       statistics->txUCBcnt += (packetSize - WLANHAL_RX_BD_HEADER_SIZE);
+#endif /* FEATURE_WLAN_INTEGRATED_SOC */
    }
 
 #ifdef WLANTL_HO_DEBUG_MSG
@@ -979,7 +991,7 @@
                   usrCtxt = hoSupport->registeredInd[idx].usrCtxt[sIdx];
                   evtType = WLANTL_HO_THRESHOLD_DOWN;
                   TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Trigger Event %d, region index %d", hoSupport->registeredInd[idx].triggerEvent[sIdx], idx));
-                  status = cbFunction(pAdapter, evtType, usrCtxt);
+                  status = WLANTL_HSSerializeTlIndication(pAdapter, evtType, usrCtxt, cbFunction);
                }
             }
          }
@@ -1001,7 +1013,7 @@
                   usrCtxt = hoSupport->registeredInd[idx - 1].usrCtxt[sIdx];
                   evtType = WLANTL_HO_THRESHOLD_UP;
                   TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Trigger Event %d, region index %d", hoSupport->registeredInd[idx - 1].triggerEvent[sIdx], idx - 1));
-                  status = cbFunction(pAdapter, evtType, usrCtxt);
+                  status = WLANTL_HSSerializeTlIndication(pAdapter, evtType, usrCtxt, cbFunction);
                }
             }
          }
@@ -1092,6 +1104,14 @@
    }
    currentHO->sampleTime = currentTimestamp;
 
+   /* Get Current RSSI from BD Heaser */
+   status = WLANTL_HSGetRSSI(pAdapter, pBDHeader, STAid, &currentAvgRSSI);
+   if(!VOS_IS_STATUS_SUCCESS(status))
+   {
+      TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"Get RSSI Fail"));
+      return status;
+   }
+
    /* If any threshold is not registerd, DO NOTHING! */
    if(0 == tlCtxt->hoSupport.currentHOState.numThreshold)
    {
@@ -1099,13 +1119,6 @@
    }
    else
    {
-      /* Get Current RSSI from BD Heaser */
-      status = WLANTL_HSGetRSSI(pAdapter, pBDHeader, STAid, &currentAvgRSSI);
-      if(!VOS_IS_STATUS_SUCCESS(status))
-      {
-         TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"Get RSSI Fail"));
-         return status;
-      }
       /* Handle current RSSI value, region, notification, etc */
       status = WLANTL_HSHandleRSSIChange(pAdapter, currentAvgRSSI);
       if(!VOS_IS_STATUS_SUCCESS(status))
@@ -1153,7 +1166,9 @@
       return VOS_STATUS_SUCCESS;
    }
 
+#ifndef FEATURE_WLAN_INTEGRATED_SOC
    WLANTL_StatHandleTXFrame(pAdapter, STAid, dataBuffer, bdHeader);
+#endif /* FEATURE_WLAN_INTEGRATED_SOC */
 
    /* Only Voice traffic is handled as real time traffic */
    if(WLANTL_AC_VO == ac)
@@ -1337,7 +1352,7 @@
             if((WLANTL_HO_THRESHOLD_DOWN == triggerEvent) || (WLANTL_HO_THRESHOLD_CROSS == triggerEvent))
             {
                TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Registered RSSI value larger than Current RSSI, and DOWN event, Send Notification"));
-               crossCBFunction(pAdapter, WLANTL_HO_THRESHOLD_DOWN, usrCtxt);
+               WLANTL_HSSerializeTlIndication(pAdapter, WLANTL_HO_THRESHOLD_DOWN, usrCtxt, crossCBFunction);
             }
          }
          else if((currentHO->regionNumber < (currentHO->numThreshold - 1)) &&
@@ -1366,14 +1381,14 @@
       ((WLANTL_HO_THRESHOLD_DOWN == triggerEvent) || (WLANTL_HO_THRESHOLD_CROSS == triggerEvent)))
    {
       TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Registered RSSI value larger than Current RSSI, and DOWN event, Send Notification"));
-      crossCBFunction(pAdapter, WLANTL_HO_THRESHOLD_DOWN, usrCtxt);
+      WLANTL_HSSerializeTlIndication(pAdapter, WLANTL_HO_THRESHOLD_DOWN, usrCtxt, crossCBFunction);
    }
    else if((VOS_FALSE == tlCtxt->isBMPS) &&
            (rssiValue < currentHO->historyRSSI) && (0 != currentHO->historyRSSI) &&
            ((WLANTL_HO_THRESHOLD_UP == triggerEvent) || (WLANTL_HO_THRESHOLD_CROSS == triggerEvent)))
    {
       TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Registered RSSI value smaller than Current RSSI, and UP event, Send Notification"));
-      crossCBFunction(pAdapter, WLANTL_HO_THRESHOLD_UP, usrCtxt);
+      WLANTL_HSSerializeTlIndication(pAdapter, WLANTL_HO_THRESHOLD_UP, usrCtxt, crossCBFunction);
    }
 
    if(VOS_TRUE == tlCtxt->isBMPS)
@@ -1796,4 +1811,58 @@
 
    return status;   
 }
-#endif //FEATURE_WLAN_GEN6_ROAMING
+
+/*==========================================================================
+
+   FUNCTION
+
+   DESCRIPTION 
+    
+   PARAMETERS 
+
+   RETURN VALUE
+
+============================================================================*/
+VOS_STATUS WLANTL_HSSerializeTlIndication
+(
+   v_PVOID_t   pAdapter,
+   v_U8_t      rssiNotification,
+   v_PVOID_t   pUserCtxt,
+   WLANTL_RSSICrossThresholdCBType cbFunction
+)
+{
+   VOS_STATUS       status = VOS_STATUS_SUCCESS;
+   vos_msg_t        msg;
+   WLANTL_TlIndicationReq *pMsg;
+
+   pMsg = vos_mem_malloc(sizeof(WLANTL_TlIndicationReq));
+   if ( NULL == pMsg ) 
+   {
+      VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "In %s, failed to allocate mem for req", __FUNCTION__);
+      return VOS_STATUS_E_NOMEM;
+   }
+
+   pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_RSSI_IND);
+   pMsg->msgLen = (tANI_U16)sizeof(WLANTL_TlIndicationReq);
+   pMsg->sessionId = 0;//for now just pass 0
+   pMsg->pAdapter = pAdapter;
+   pMsg->pUserCtxt = pUserCtxt;
+   pMsg->rssiNotification = rssiNotification;
+   pMsg->tlCallback = cbFunction;
+
+
+   msg.type = eWNI_SME_RSSI_IND;
+   msg.bodyptr = pMsg;
+   msg.reserved = 0;
+
+   if(VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, &msg))
+   {
+       VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "In %s, failed to post msg to self", __FUNCTION__);
+       vos_mem_free(pMsg);
+       status = VOS_STATUS_E_FAILURE;
+   }
+
+   return status;   
+}
+
+#endif //FEATURE_WLAN_GEN6_ROAMING || WLAN_FEATURE_NEIGHBOR_ROAMING
diff --git a/CORE/TL/src/wlan_qct_tl_hosupport.h b/CORE/TL/src/wlan_qct_tl_hosupport.h
index 437fec1..ca8d8f7 100644
--- a/CORE/TL/src/wlan_qct_tl_hosupport.h
+++ b/CORE/TL/src/wlan_qct_tl_hosupport.h
@@ -258,6 +258,46 @@
    v_PVOID_t                       pAdapter
 );
 
+/*==========================================================================
+
+   FUNCTION
+
+   DESCRIPTION 
+    
+   PARAMETERS 
+
+   RETURN VALUE
+
+============================================================================*/
+VOS_STATUS WLANTL_HSSerializeTlIndication
+(
+   v_PVOID_t   pAdapter,
+   v_U8_t      rssiNotification,
+   v_PVOID_t   pUserCtxt,
+   WLANTL_RSSICrossThresholdCBType cbFunction
+);
+
+/*==========================================================================
+
+   FUNCTION
+
+   DESCRIPTION 
+    
+   PARAMETERS 
+
+   RETURN VALUE
+
+============================================================================*/
+VOS_STATUS WLANTL_StatHandleTXFrame
+(
+   v_PVOID_t        pAdapter,
+   v_U8_t           STAid,
+   vos_pkt_t       *dataBuffer,
+   v_PVOID_t        pBDHeader
+#ifdef FEATURE_WLAN_INTEGRATED_SOC
+  ,WLANTL_MetaInfoType *txMetaInfo
+#endif /* FEATURE_WLAN_INTEGRATED_SOC */
+);
 
 #endif //FEATURE_WLAN_GEN6_ROAMING
 
diff --git a/CORE/VOSS/inc/i_vos_packet.h b/CORE/VOSS/inc/i_vos_packet.h
index 68251de..9f5ee25 100644
--- a/CORE/VOSS/inc/i_vos_packet.h
+++ b/CORE/VOSS/inc/i_vos_packet.h
@@ -64,7 +64,7 @@
 
 // the number of Receive vos packets used exclusively for vos packet
 // allocations of type VOS_PKT_TYPE_RX_RAW
-#define VPKT_NUM_RX_RAW_PACKETS (  512 )
+#define VPKT_NUM_RX_RAW_PACKETS (1024)
 
 // the number of Transmit Management vos packets, used exclusively for
 // vos packet allocations of type VOS_PKT_TYPE_TX_802_11_MGMT
diff --git a/CORE/VOSS/inc/vos_api.h b/CORE/VOSS/inc/vos_api.h
index df78f32..d23a44c 100644
--- a/CORE/VOSS/inc/vos_api.h
+++ b/CORE/VOSS/inc/vos_api.h
@@ -286,4 +286,20 @@
 */
 VOS_STATUS vos_wlanReInit(void);
 
+/**
+  @brief vos_wlanRestart() - This API will reload WLAN driver.
+
+  This function is called if driver detects any fatal state which 
+  can be recovered by a WLAN module reload ( Android framwork initiated ).
+  Note that this API will not initiate any RIVA subsystem restart.
+
+  @param
+       NONE
+  @return
+       VOS_STATUS_SUCCESS   - Operation completed successfully.
+       VOS_STATUS_E_FAILURE - Operation failed.
+
+*/
+VOS_STATUS vos_wlanRestart(void);
+
 #endif // if !defined __VOS_NVITEM_H
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index 4b632d6..00cef2c 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -618,6 +618,8 @@
          VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
            "%s: WDA_preStart reporting other error", __func__);
       }
+      macStop(gpVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
+      ccmStop(gpVosContext->pMACContext);
       VOS_ASSERT( 0 );
       return VOS_STATUS_E_FAILURE;
    }
@@ -961,18 +963,7 @@
         VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
          "%s: WDA_stop reporting other error", __func__ );
      }
-     /* if WDA stop failed, call WDA shutdown to cleanup WDA/WDI */
-     vosStatus = WDA_shutdown( vosContext, VOS_TRUE );
-     if (VOS_IS_STATUS_SUCCESS( vosStatus ) )
-     {
-        hdd_set_ssr_required( VOS_TRUE );
-     }
-     else
-     {
-        VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
-                               "%s: Failed to shutdown WDA", __func__ );
-        VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
-     }
+     WDA_stopFailed(vosContext);
   }
 #endif
 
@@ -1070,12 +1061,30 @@
   }
 
 #ifdef FEATURE_WLAN_INTEGRATED_SOC
-  vosStatus = WDA_close( vosContext );
-  if (!VOS_IS_STATUS_SUCCESS(vosStatus))
+  if ( TRUE == WDA_needShutdown(vosContext ))
   {
-     VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
-         "%s: Failed to close WDA", __func__);
-     VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
+     /* if WDA stop failed, call WDA shutdown to cleanup WDA/WDI */
+     vosStatus = WDA_shutdown( vosContext, VOS_TRUE );
+     if (VOS_IS_STATUS_SUCCESS( vosStatus ) )
+     {
+        hdd_set_ssr_required( VOS_TRUE );
+     }
+     else
+     {
+        VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
+                               "%s: Failed to shutdown WDA", __func__ );
+        VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
+     }
+  } 
+  else 
+  {
+     vosStatus = WDA_close( vosContext );
+     if (!VOS_IS_STATUS_SUCCESS(vosStatus))
+     {
+        VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+            "%s: Failed to close WDA", __func__);
+        VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
+     }
   }
   
   /* Let DXE return packets in WDA_close and then free them here */
@@ -2370,3 +2379,56 @@
    vstatus = vos_watchdog_wlan_re_init();
    return vstatus;
 }
+/**
+  @brief vos_wlanRestart() - This API will reload WLAN driver.
+
+  This function is called if driver detects any fatal state which 
+  can be recovered by a WLAN module reload ( Android framwork initiated ).
+  Note that this API will not initiate any RIVA subsystem restart.
+
+  The function wlan_hdd_restart_driver protects against re-entrant calls.
+
+  @param
+       NONE
+  @return
+       VOS_STATUS_SUCCESS   - Operation completed successfully.
+       VOS_STATUS_E_FAILURE - Operation failed.
+       VOS_STATUS_E_EMPTY   - No configured interface
+       VOS_STATUS_E_ALREADY - Request already in progress
+
+
+*/
+VOS_STATUS vos_wlanRestart(void)
+{
+   VOS_STATUS vstatus;
+   hdd_context_t *pHddCtx = NULL;
+   v_CONTEXT_t pVosContext        = NULL;
+
+   /* Check whether driver load unload is in progress */
+   if(vos_is_load_unload_in_progress( VOS_MODULE_ID_VOSS, NULL)) 
+   {
+      VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, 
+               "%s: Driver load/unload is in progress, retry later.", __func__);
+      return VOS_STATUS_E_AGAIN;
+   }
+
+   /* Get the Global VOSS Context */
+   pVosContext = vos_get_global_context(VOS_MODULE_ID_VOSS, NULL);
+   if(!pVosContext) {
+      VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, 
+               "%s: Global VOS context is Null", __func__);
+      return VOS_STATUS_E_FAILURE;
+   }
+    
+   /* Get the HDD context */
+   pHddCtx = (hdd_context_t *)vos_get_context(VOS_MODULE_ID_HDD, pVosContext );
+   if(!pHddCtx) {
+      VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, 
+               "%s: HDD context is Null", __func__);
+      return VOS_STATUS_E_FAILURE;
+   }
+
+   /* Reload the driver */
+   vstatus = wlan_hdd_restart_driver(pHddCtx);
+   return vstatus;
+}
diff --git a/CORE/VOSS/src/vos_getBin.c b/CORE/VOSS/src/vos_getBin.c
index a9f3b9c..557a54a 100644
--- a/CORE/VOSS/src/vos_getBin.c
+++ b/CORE/VOSS/src/vos_getBin.c
@@ -164,7 +164,7 @@
     {
        pHddCtx = vos_get_context( VOS_MODULE_ID_HDD, pVosContext);
 
-       for (i=0;i<VOS_MAX_NO_OF_MODE; i++)
+       for (i=0; i < VOS_MAX_NO_OF_MODE; i++)
        {
           j += pHddCtx->no_of_sessions[i];
        }
diff --git a/CORE/VOSS/src/vos_nvitem.c b/CORE/VOSS/src/vos_nvitem.c
index 9d247a3..6ecd555 100644
--- a/CORE/VOSS/src/vos_nvitem.c
+++ b/CORE/VOSS/src/vos_nvitem.c
@@ -1499,7 +1499,34 @@
 #endif
         *num20MHzChannelsFound = (tANI_U8)count;
     }
-    //TODO: 40 MHz
+
+    if( channels40MHz && num40MHzChannelsFound )
+    {
+        count = 0;
+#ifdef FEATURE_WLAN_INTEGRATED_SOC
+        //center channels for 2.4 Ghz 40 MHz channels
+        for( i = RF_CHAN_BOND_3; i <= RF_CHAN_BOND_11; i++ )
+        {
+            
+            if( regChannels[i].enabled )
+            {
+                channels40MHz[count].chanId = rfChannels[i].channelNum;
+                channels40MHz[count++].pwr  = regChannels[i].pwrLimit;
+            }
+        }
+        //center channels for 5 Ghz 40 MHz channels
+        for( i = RF_CHAN_BOND_38; i <= RF_CHAN_BOND_163; i++ )
+        {
+            
+            if( regChannels[i].enabled )
+            {
+                channels40MHz[count].chanId = rfChannels[i].channelNum;
+                channels40MHz[count++].pwr  = regChannels[i].pwrLimit;
+            }
+        }
+#endif
+        *num40MHzChannelsFound = (tANI_U8)count;
+    }
     return (status);
 }
 
diff --git a/CORE/VOSS/src/vos_packet.c b/CORE/VOSS/src/vos_packet.c
index 304bd51..3eeaa90 100644
--- a/CORE/VOSS/src/vos_packet.c
+++ b/CORE/VOSS/src/vos_packet.c
@@ -174,6 +174,13 @@
       return;
    }
 
+   if ((gpVosPacketContext->rxReplenishListCount < VPKT_RX_REPLENISH_THRESHOLD)
+       &&
+       (!list_empty(&gpVosPacketContext->rxRawFreeList)))
+    {
+      return;
+    }
+
    // we only replenish if the Rx Raw pool is empty or the Replenish pool
    // reaches a high water mark
    rc = mutex_lock_interruptible(&gpVosPacketContext->mlock);
@@ -185,14 +192,6 @@
       return;     
    }
 
-   if ((gpVosPacketContext->rxReplenishListCount < VPKT_RX_REPLENISH_THRESHOLD)
-       &&
-       (!list_empty(&gpVosPacketContext->rxRawFreeList)))
-   {
-      mutex_unlock(&gpVosPacketContext->mlock);
-      return;
-   }
-
    VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
              "VPKT [%d]: Packet replenish activated", __LINE__);
 
@@ -629,6 +628,7 @@
    vos_pkt_low_resource_info *pLowResourceInfo;
    struct vos_pkt_t *pVosPacket;
    int rc; 
+
    // Validate the return parameter pointer
    if (unlikely(NULL == ppPacket))
    {
@@ -751,7 +751,6 @@
              0,
              skb_end_pointer(pVosPacket->pSkb) - pVosPacket->pSkb->head);
    }
-
    VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
              "VPKT [%d]: [%p] Packet allocated, type %d[%s]",
              __LINE__, pVosPacket, pktType, vos_pkti_packet_type_str(pktType));
@@ -1069,6 +1068,7 @@
                                   v_VOID_t **ppOSPacket,
                                   v_BOOL_t clearOSPacket )
 {
+
    // Validate the input and output parameter pointers
    if (unlikely((NULL == pPacket)||(NULL == ppOSPacket)))
    {
@@ -1288,7 +1288,6 @@
                    "VPKT [%d]: Invalid magic", __LINE__);
          return VOS_STATUS_E_INVAL;
       }
-
       //If an skb is attached then reset the pointers      
       if (pPacket->pSkb)
       {
@@ -1357,7 +1356,6 @@
                    "VPKT [%d]: [%p] Packet recycled, type %d[%s]",
                    __LINE__, pPacket, pPacket->packetType,
                    vos_pkti_packet_type_str(pPacket->packetType));
-
          // clear out the User Data pointers in the voss packet..
          memset(&pPacket->pvUserData, 0, sizeof(pPacket->pvUserData));
 
@@ -1379,6 +1377,7 @@
                    "VPKT [%d]: [%p] Packet returned, type %d[%s]",
                    __LINE__, pPacket, pPacket->packetType,
                    vos_pkti_packet_type_str(pPacket->packetType));
+
          rc = mutex_lock_interruptible(&gpVosPacketContext->mlock);
          list_add_tail(&pPacket->node, pPktFreeList);
          if (likely(0 == rc)) 
diff --git a/CORE/WDA/inc/legacy/halMsgApi.h b/CORE/WDA/inc/legacy/halMsgApi.h
index ffeadf3..0ff8d86 100644
--- a/CORE/WDA/inc/legacy/halMsgApi.h
+++ b/CORE/WDA/inc/legacy/halMsgApi.h
@@ -126,6 +126,9 @@
     eRXP_BTAMP_AP_MODE          = 0x400,
     eRXP_BTAMP_STA_MODE         = 0x800,
     eRXP_MULTI_BSS_MODE         = 0x1000
+#ifdef FEATURE_OEM_DATA_SUPPORT
+   ,eRXP_OEM_DATA_MODE             = 0x2000
+#endif
 #ifndef WLAN_FTM_STUB
     ,eRXP_FTM_MODE         = 0x4000
 #endif
@@ -299,6 +302,11 @@
     tANI_U8     p2pCapableSta;
 #endif
 
+#ifdef WLAN_FEATURE_11AC
+    tANI_U8    vhtCapable;
+    tANI_U8    vhtTxChannelWidthSet;
+#endif
+
 } tAddStaParams, *tpAddStaParams;
 
 
@@ -502,7 +510,10 @@
 
     //Spectrum Management Capability, 1 - Enabled, 0 - Disabled.
     tANI_U8 bSpectrumMgtEnabled;
-
+#ifdef WLAN_FEATURE_11AC
+    tANI_U8 vhtCapable;
+    tANI_U8    vhtTxChannelWidthSet;
+#endif
 } tAddBssParams, * tpAddBssParams;
 
 typedef struct
@@ -695,6 +706,27 @@
 } tFinishScanParams, * tpFinishScanParams;
 
 #ifdef FEATURE_WLAN_INTEGRATED_SOC
+#ifdef FEATURE_OEM_DATA_SUPPORT 
+
+#ifndef OEM_DATA_REQ_SIZE
+#define OEM_DATA_REQ_SIZE 70
+#endif
+#ifndef OEM_DATA_RSP_SIZE
+#define OEM_DATA_RSP_SIZE 968
+#endif
+
+typedef struct
+{
+    tSirMacAddr          selfMacAddr;
+    eHalStatus           status;
+    tANI_U8              oemDataReq[OEM_DATA_REQ_SIZE];
+} tStartOemDataReq, *tpStartOemDataReq;
+
+typedef struct 
+{
+    tANI_U8             oemDataRsp[OEM_DATA_RSP_SIZE];
+} tStartOemDataRsp, *tpStartOemDataRsp;
+#endif
 #endif
 
 typedef struct sBeaconGenStaInfo {
@@ -917,7 +949,7 @@
 #ifndef WLAN_FEATURE_VOWIFI    
     tANI_U8 localPowerConstraint;
 #endif /* WLAN_FEATURE_VOWIFI  */
-    tSirMacHTSecondaryChannelOffset secondaryChannelOffset;
+    ePhyChanBondState secondaryChannelOffset;
     tANI_U8 peSessionId;
 #if defined WLAN_FEATURE_VOWIFI
     tPowerdBm txMgmtPower; //HAL fills in the tx power used for mgmt frames in this field.
@@ -1129,6 +1161,7 @@
 {
     tANI_U8     sendDataNull;
     eHalStatus  status;
+    tANI_U8     bssIdx;
 } tExitBmpsParams, *tpExitBmpsParams;
 
 //
@@ -1146,6 +1179,7 @@
     tANI_U8     viTriggerEnabled:1;
     tANI_U8     voTriggerEnabled:1;
     eHalStatus  status;
+    tANI_U8     bssIdx;
 }tUapsdParams, *tpUapsdParams;
 
 //
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 836e4bf..74fb8ad 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -128,6 +128,7 @@
  * Check the version number and find if MCC feature is supported or not
  */
 #define IS_MCC_SUPPORTED (WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual( 0, 1, 1, 0))
+#define IS_SLM_SESSIONIZED (WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual( 7, 0, 0, 0))
 
 /*--------------------------------------------------------------------------
   Definitions for Data path APIs
@@ -419,6 +420,7 @@
    /* set, when BT AMP session is going on */
    v_BOOL_t             wdaAmpSessionOn;
    v_U32_t              VosPacketToFree;
+   v_BOOL_t             needShutdown;
 } tWDA_CbContext ; 
 
 typedef struct
@@ -467,6 +469,17 @@
 VOS_STATUS WDA_shutdown(v_PVOID_t pVosContext, wpt_boolean closeTransport);
 
 /*
+ * FUNCTION: WDA_stopFailed
+ * WDA stop is failed
+ */
+void WDA_stopFailed(v_PVOID_t pVosContext);
+/*
+ * FUNCTION: WDA_needShutdown
+ * WDA requires a shutdown rather than a close
+ */
+v_BOOL_t WDA_needShutdown(v_PVOID_t pVosContext);
+
+/*
  * FUNCTION: WDA_McProcessMsg
  * DAL-AL message processing entry function 
  */ 
@@ -1174,6 +1187,12 @@
 #define WDA_SIGNAL_BTAMP_EVENT         SIR_HAL_SIGNAL_BTAMP_EVENT
 
 #ifdef ANI_CHIPSET_VOLANS
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/* PE <-> HAL OEM_DATA RELATED MESSAGES */
+#define WDA_START_OEM_DATA_REQ         SIR_HAL_START_OEM_DATA_REQ 
+#define WDA_START_OEM_DATA_RSP         SIR_HAL_START_OEM_DATA_RSP
+#define WDA_FINISH_OEM_DATA_REQ        SIR_HAL_FINISH_OEM_DATA_REQ
+#endif
 #endif
 
 #define WDA_SET_MAX_TX_POWER_REQ       SIR_HAL_SET_MAX_TX_POWER_REQ
@@ -1202,9 +1221,6 @@
 #define WDA_WLAN_RESUME_REQ           SIR_HAL_WLAN_RESUME_REQ
 #define WDA_MSG_TYPES_END    SIR_HAL_MSG_TYPES_END
 
-#define WDA_SUSPEND_ACTIVITY_RSP SIR_HAL_SUSPEND_ACTIVITY_RSP
-
-
 #define WDA_MMH_TXMB_READY_EVT SIR_HAL_MMH_TXMB_READY_EVT     
 #define WDA_MMH_RXMB_DONE_EVT  SIR_HAL_MMH_RXMB_DONE_EVT    
 #define WDA_MMH_MSGQ_NE_EVT    SIR_HAL_MMH_MSGQ_NE_EVT
diff --git a/CORE/WDA/src/wlan_nv.c b/CORE/WDA/src/wlan_nv.c
index a3b453b..a03227a 100644
--- a/CORE/WDA/src/wlan_nv.c
+++ b/CORE/WDA/src/wlan_nv.c
@@ -3796,7 +3796,7 @@
     } // tables
 };
 
-#else 
+#else
 
 #include "palTypes.h"
 #include "wlan_nv.h"
@@ -3890,6 +3890,84 @@
                 {1500},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS,
                 {1400},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS,
                 {1350},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS,
+#ifdef WLAN_FEATURE_11AC
+                //11AC rates
+               //11A duplicate 80MHz Rates
+                {1700},    // HAL_PHY_RATE_11AC_DUP_6_MBPS,
+                {1700},    // HAL_PHY_RATE_11AC_DUP_9_MBPS,
+                {1700},    // HAL_PHY_RATE_11AC_DUP_12_MBPS,
+                {1650},    // HAL_PHY_RATE_11AC_DUP_18_MBPS,
+                {1600},    // HAL_PHY_RATE_11AC_DUP_24_MBPS,
+                {1550},    // HAL_PHY_RATE_11AC_DUP_36_MBPS,
+                {1550},    // HAL_PHY_RATE_11AC_DUP_48_MBPS,
+                {1500},    // HAL_PHY_RATE_11AC_DUP_54_MBPS,
+
+               //11ac 20MHZ NG, SG
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_6_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_13_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_19_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_26_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_39_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_52_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_65_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_78_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_7_2_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_14_4_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_21_6_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_28_8_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_43_3_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_57_7_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_65_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_72_2_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_86_6_MBPS,
+
+
+               //11ac 40MHZ NG, SG
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
+
+
+               //11ac 80MHZ NG, SG
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
+#endif //WLAN_FEATURE_11AC
                 },  //    RF_SUBBAND_2_4_GHZ
 
                 {
@@ -3957,6 +4035,84 @@
                 {1400},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS,
                 {1300},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS,
                 {1200},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS,
+#ifdef WLAN_FEATURE_11AC
+                //11AC rates
+               //11A duplicate 80MHz Rates
+                {1700},    // HAL_PHY_RATE_11AC_DUP_6_MBPS,
+                {1700},    // HAL_PHY_RATE_11AC_DUP_9_MBPS,
+                {1700},    // HAL_PHY_RATE_11AC_DUP_12_MBPS,
+                {1650},    // HAL_PHY_RATE_11AC_DUP_18_MBPS,
+                {1600},    // HAL_PHY_RATE_11AC_DUP_24_MBPS,
+                {1550},    // HAL_PHY_RATE_11AC_DUP_36_MBPS,
+                {1550},    // HAL_PHY_RATE_11AC_DUP_48_MBPS,
+                {1500},    // HAL_PHY_RATE_11AC_DUP_54_MBPS,
+
+               //11ac 20MHZ NG, SG
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_6_5_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_13_MBPS,
+                {1350},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_19_5_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_26_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_39_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_52_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_65_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_78_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_7_2_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_14_4_MBPS,
+                {1350},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_21_6_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_28_8_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_43_3_MBPS,
+                {1200},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_57_7_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_65_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_72_2_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_86_6_MBPS,
+
+
+               //11ac 40MHZ NG, SG
+                {1400},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
+
+
+               //11ac 80MHZ NG, SG
+                {1300},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
+#endif //WLAN_FEATURE_11AC
                 },  //    RF_SUBBAND_5_LOW_GHZ
 
                 // 5G Mid
@@ -4025,6 +4181,84 @@
                 {1400},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS,
                 {1300},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS,
                 {1200},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS,
+#ifdef WLAN_FEATURE_11AC
+                //11AC rates
+               //11A duplicate 80MHz Rates
+                {1700},    // HAL_PHY_RATE_11AC_DUP_6_MBPS,
+                {1700},    // HAL_PHY_RATE_11AC_DUP_9_MBPS,
+                {1700},    // HAL_PHY_RATE_11AC_DUP_12_MBPS,
+                {1650},    // HAL_PHY_RATE_11AC_DUP_18_MBPS,
+                {1600},    // HAL_PHY_RATE_11AC_DUP_24_MBPS,
+                {1550},    // HAL_PHY_RATE_11AC_DUP_36_MBPS,
+                {1550},    // HAL_PHY_RATE_11AC_DUP_48_MBPS,
+                {1500},    // HAL_PHY_RATE_11AC_DUP_54_MBPS,
+
+               //11ac 20MHZ NG, SG
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_6_5_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_13_MBPS,
+                {1350},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_19_5_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_26_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_39_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_52_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_65_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_78_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_7_2_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_14_4_MBPS,
+                {1350},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_21_6_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_28_8_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_43_3_MBPS,
+                {1200},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_57_7_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_65_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_72_2_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_86_6_MBPS,
+
+
+               //11ac 40MHZ NG, SG
+                {1400},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
+
+
+               //11ac 80MHZ NG, SG
+                {1300},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
+#endif //WLAN_FEATURE_11AC
                 },  //    //     RF_SUBBAND_5_MID_GHZ
                 // 5G High
                 {
@@ -4092,6 +4326,84 @@
                 {1400},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS,
                 {1300},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS,
                 {1200},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS,
+#ifdef WLAN_FEATURE_11AC
+                //11AC rates
+               //11A duplicate 80MHz Rates
+                {1700},    // HAL_PHY_RATE_11AC_DUP_6_MBPS,
+                {1700},    // HAL_PHY_RATE_11AC_DUP_9_MBPS,
+                {1700},    // HAL_PHY_RATE_11AC_DUP_12_MBPS,
+                {1650},    // HAL_PHY_RATE_11AC_DUP_18_MBPS,
+                {1600},    // HAL_PHY_RATE_11AC_DUP_24_MBPS,
+                {1550},    // HAL_PHY_RATE_11AC_DUP_36_MBPS,
+                {1550},    // HAL_PHY_RATE_11AC_DUP_48_MBPS,
+                {1500},    // HAL_PHY_RATE_11AC_DUP_54_MBPS,
+
+               //11ac 20MHZ NG, SG
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_6_5_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_13_MBPS,
+                {1350},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_19_5_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_26_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_39_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_52_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_65_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_NGI_78_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_7_2_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_14_4_MBPS,
+                {1350},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_21_6_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_28_8_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_43_3_MBPS,
+                {1200},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_57_7_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_65_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_72_2_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_CB_SGI_86_6_MBPS,
+
+
+               //11ac 40MHZ NG, SG
+                {1400},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
+                {1400},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
+                {1250},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
+
+
+               //11ac 80MHZ NG, SG
+                {1300},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
+                {1300},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
+                {1100},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
+                {1000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
+#endif //WLAN_FEATURE_11AC
                 },  //    RF_SUBBAND_5_HIGH_GHZ,
                 // 4.9G
 
@@ -4160,6 +4472,84 @@
                 {1400},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS,
                 {1300},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS,
                 {1200},    // HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS,
+#ifdef WLAN_FEATURE_11AC
+                //11AC rates
+               //11A duplicate 80MHz Rates
+                {1700},    // HAL_PHY_RATE_11AC_DUP_6_MBPS,
+                {1700},    // HAL_PHY_RATE_11AC_DUP_9_MBPS,
+                {1700},    // HAL_PHY_RATE_11AC_DUP_12_MBPS,
+                {1650},    // HAL_PHY_RATE_11AC_DUP_18_MBPS,
+                {1600},    // HAL_PHY_RATE_11AC_DUP_24_MBPS,
+                {1550},    // HAL_PHY_RATE_11AC_DUP_36_MBPS,
+                {1550},    // HAL_PHY_RATE_11AC_DUP_48_MBPS,
+                {1500},    // HAL_PHY_RATE_11AC_DUP_54_MBPS,
+
+               //11ac 20MHZ NG, SG
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,
+
+
+               //11ac 40MHZ NG, SG
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
+
+
+               //11ac 80MHZ NG, SG
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
+                {0000},    // HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
+#endif //WLAN_FEATURE_11AC
                 },  //    RF_SUBBAND_4_9_GHZ
         },
 
@@ -7352,7 +7742,7 @@
             100,   // RF_CHAN_108
             100,   // RF_CHAN_112
             100,   // RF_CHAN_116
-            100,   // RF_CHAN_120 
+            100,   // RF_CHAN_120
             100,   // RF_CHAN_124
             100,   // RF_CHAN_128
             100,   // RF_CHAN_132
@@ -7364,7 +7754,7 @@
             100,   // RF_CHAN_161
             100,   // RF_CHAN_165
             //CHANNEL BONDED CHANNELS
-            100,   // RF_CHAN_BOND_3 
+            100,   // RF_CHAN_BOND_3
             100,   // RF_CHAN_BOND_4
             100,   // RF_CHAN_BOND_5
             100,   // RF_CHAN_BOND_6
@@ -7381,15 +7771,15 @@
             100,   // RF_CHAN_BOND_38
             100,   // RF_CHAN_BOND_42
             100,   // RF_CHAN_BOND_46
-            100,   // RF_CHAN_BOND_50 
+            100,   // RF_CHAN_BOND_50
             100,   // RF_CHAN_BOND_54
             100,   // RF_CHAN_BOND_58
             100,   // RF_CHAN_BOND_62
             100,   // RF_CHAN_BOND_102
             100,   // RF_CHAN_BOND_106
             100,   // RF_CHAN_BOND_110
-            100,   // RF_CHAN_BOND_114 
-            100,   // RF_CHAN_BOND_118 
+            100,   // RF_CHAN_BOND_114
+            100,   // RF_CHAN_BOND_118
             100,   // RF_CHAN_BOND_122
             100,   // RF_CHAN_BOND_126
             100,   // RF_CHAN_BOND_130
@@ -8690,7 +9080,7 @@
             280,   // RF_CHAN_108
             280,   // RF_CHAN_112
             280,   // RF_CHAN_116
-            280,   // RF_CHAN_120 
+            280,   // RF_CHAN_120
             280,   // RF_CHAN_124
             280,   // RF_CHAN_128
             280,   // RF_CHAN_132
@@ -8702,7 +9092,7 @@
             280,   // RF_CHAN_161
             280,   // RF_CHAN_165
             //CHANNEL BONDED CHANNELS
-            280,   // RF_CHAN_BOND_3 
+            280,   // RF_CHAN_BOND_3
             280,   // RF_CHAN_BOND_4
             280,   // RF_CHAN_BOND_5
             280,   // RF_CHAN_BOND_6
@@ -8719,15 +9109,15 @@
             280,   // RF_CHAN_BOND_38
             280,   // RF_CHAN_BOND_42
             280,   // RF_CHAN_BOND_46
-            280,   // RF_CHAN_BOND_50 
+            280,   // RF_CHAN_BOND_50
             280,   // RF_CHAN_BOND_54
             280,   // RF_CHAN_BOND_58
             280,   // RF_CHAN_BOND_62
             280,   // RF_CHAN_BOND_102
             280,   // RF_CHAN_BOND_106
             280,   // RF_CHAN_BOND_110
-            280,   // RF_CHAN_BOND_114 
-            280,   // RF_CHAN_BOND_118 
+            280,   // RF_CHAN_BOND_114
+            280,   // RF_CHAN_BOND_118
             280,   // RF_CHAN_BOND_122
             280,   // RF_CHAN_BOND_126
             280,   // RF_CHAN_BOND_130
@@ -8743,7 +9133,7 @@
         {
             { 2150 }, // applied to all channels, MODE_802_11B
             { 1850 }, // applied to all channels,MODE_802_11AG
-            { 1750 }  // applied to all channels,MODE_802_11N 
+            { 1750 }  // applied to all channels,MODE_802_11N
         },
 
         //NV_TABLE_OFDM_CMD_PWR_OFFSET
@@ -8759,7 +9149,7 @@
     } // tables
 };
 
-#endif 
+#endif
 #endif
 
 
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index c0ba3e2..fd374a5 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -20,47 +20,33 @@
  */
 
 /*===========================================================================
-
                        W L A N _ Q C T _ WDA . C
-
   OVERVIEW:
-
   This software unit holds the implementation of the WLAN Transport Layer.
-
   The functions externalized by this module are to be called ONLY by other
   WLAN modules that properly register with the Transport Layer initially.
-
   DEPENDENCIES:
-
   Are listed for each API below.
 
-
   Copyright (c) 2010-2011 QUALCOMM Incorporated.
   All Rights Reserved.
   Qualcomm Confidential and Proprietary
 ===========================================================================*/
-
 /*===========================================================================
-
                       EDIT HISTORY FOR FILE
 
-
   This section contains comments describing changes made to the module.
   Notice that changes are listed in reverse chronological order.
 
-
    $Header$$DateTime$$Author$
 
-
   when        who        what, where, why
 ----------    ---       -------------------------------------------------
 10/05/2011    haparna     Adding support for Keep Alive Feature
 2010-12-30    smiryala     UMAC convergence changes
 2010-08-19    adwivedi    WLAN DAL AL(WDA) layer for Prima
 ===========================================================================*/
-
 #if defined( FEATURE_WLAN_INTEGRATED_SOC )
-
 #include "vos_mq.h" 
 #include "vos_api.h" 
 #include "vos_packet.h" 
@@ -82,32 +68,26 @@
 #include "limUtils.h"
 #include "btcApi.h"
 #include "vos_sched.h"
-
 #ifdef ANI_MANF_DIAG
 #include "pttMsgApi.h"
 #include "wlan_qct_sys.h"
 #endif /* ANI_MANF_DIAG */
-
 /* Used MACRO's */
 /* Get WDA context from vOSS module */
 #define VOS_GET_WDA_CTXT(a)            vos_get_context(VOS_MODULE_ID_WDA, a)
 #define VOS_GET_MAC_CTXT(a)            vos_get_context(VOS_MODULE_ID_PE, a)
 #define OFFSET_OF(structType,fldName)   (&((structType*)0)->fldName)
 #define WDA_BA_TX_FRM_THRESHOLD (5)
-
 #define  CONVERT_WDI2SIR_STATUS(x) \
    ((WDI_STATUS_SUCCESS != (x)) ? eSIR_FAILURE : eSIR_SUCCESS)
 
 #define  IS_WDI_STATUS_FAILURE(status) \
    ((WDI_STATUS_SUCCESS != (status)) && (WDI_STATUS_PENDING != (status)))
-
 #define  CONVERT_WDI2VOS_STATUS(x) \
    ((IS_WDI_STATUS_FAILURE(x)) ? VOS_STATUS_E_FAILURE  : VOS_STATUS_SUCCESS)
 
 /* macro's for acessing TL API/data structures */
-
 #define WDA_TL_GET_TX_PKTCOUNT(a, b, c, d) WLANTL_GetTxPktCount(a, b, c, d)
-
 #define WDA_GET_BA_TXFLAG(a, b, c)  \
    (((a)->wdaStaInfo[(b)].ucUseBaBitmap) & (1 << (c)))  
 
@@ -116,43 +96,33 @@
 
 #define WDA_CLEAR_BA_TXFLAG(a, b, c)  \
    (((a)->wdaStaInfo[b].ucUseBaBitmap) &= ~(1 << c))
-
 #define WDA_TL_BA_SESSION_ADD(a, b, c, d, e, f, g) \
    WLANTL_BaSessionAdd(a, b, c, d, e, f, g)
-
 /* timer related Macros */
 #define WDA_CREATE_TIMER(a, b, c, d, e, f, g) \
    tx_timer_create(a, b, c, d, e, f, g)
 #define WDA_START_TIMER(a) tx_timer_activate(a)
 #define WDA_STOP_TIMER(a) tx_timer_deactivate(a)
 #define WDA_DESTROY_TIMER(a) tx_timer_delete(a)
-
 #define WDA_WDI_START_TIMEOUT 15000
 
 #define WDA_LAST_POLLED_THRESHOLD(a, curSta, tid) \
    ((a)->wdaStaInfo[curSta].framesTxed[tid] + WDA_BA_TX_FRM_THRESHOLD)
-
 #define WDA_BA_MAX_WINSIZE   (64)
-
 #define WDA_INVALID_KEY_INDEX  0xFF
-
 #define WDA_NUM_PWR_SAVE_CFG       11
-
 #define WDA_TX_COMPLETE_TIME_OUT_VALUE 1000
   
-
 #define WDA_MAX_RETRIES_TILL_RING_EMPTY  1000   /* MAX 10000 msec = 10 seconds wait */
 
 #define WDA_WAIT_MSEC_TILL_RING_EMPTY    10    /* 10 msec wait per cycle */
 /* extern declarations */
 extern void vos_WDAComplete_cback(v_PVOID_t pVosContext);
-
 /* forward declarations */
 void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType, 
                                         void *pBodyptr, tANI_U32 bodyVal) ;
 VOS_STATUS WDA_prepareConfigTLV(v_PVOID_t pVosContext, 
                                 WDI_StartReqParamsType  *wdiStartParams ) ;
-
 VOS_STATUS WDA_wdiCompleteCB(v_PVOID_t pVosContext) ;
 VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams);
 
@@ -170,22 +140,18 @@
 static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA);
 void WDA_BaCheckActivity(tWDA_CbContext *pWDA) ;
 void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams, void* pUserData);
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
 VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA, tAggrAddTsParams *pAggrAddTsReqParams);
 #endif /* WLAN_FEATURE_VOWIFI_11R */
 
-
 void WDA_TimerHandler(v_VOID_t *pWDA, tANI_U32 timerInfo) ;
 void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pContext) ;
 VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA);
-
 #ifdef FEATURE_WLAN_SCAN_PNO
 static VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA, tSirPNOScanReq *pPNOScanReqParams);
 static VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA, tSirSetRSSIFilterReq* pRssiFilterParams);
 static VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA, tSirUpdateScanParams *pUpdateScanParams);
 #endif // FEATURE_WLAN_SCAN_PNO
-
 #ifdef WLAN_FEATURE_PACKET_FILTERING
 static VOS_STATUS WDA_Process8023MulticastListReq (
                                        tWDA_CbContext *pWDA,
@@ -204,12 +170,9 @@
                                tSirRcvFltPktClearParam *pRcvFltPktClearParam
                                                          );
 #endif // WLAN_FEATURE_PACKET_FILTERING
-
 VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA, tSirSetPowerParamsReq *pPowerParams);
-
 static VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
                                           tpTxControlParams pTxCtrlParam);
-
 VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA, 
                                                       v_U8_t *pDefaultKeyId,
                                                       v_U8_t *pNumKeys,
@@ -232,7 +195,6 @@
    tWDA_CbContext *wdaContext;
    VOS_STATUS status;
    WDI_DeviceCapabilityType wdiDevCapability = {0} ;
-
    /* Allocate WDA context */
    status = vos_alloc_context(pVosContext, VOS_MODULE_ID_WDA, 
                            (v_VOID_t **)&wdaContext, sizeof(tWDA_CbContext)) ;
@@ -240,7 +202,6 @@
    {
       return VOS_STATUS_E_NOMEM;
    }
-
    /*__asm int 3;*/
    vos_mem_zero(wdaContext,sizeof(tWDA_CbContext));
    
@@ -257,7 +218,6 @@
                 "WDI Sync Event init failed - status = %d\n", status);
       status = VOS_STATUS_E_FAILURE;
    }
-
    /* Init Frame transfer event */
    status = vos_event_init(&wdaContext->txFrameEvent);
    if(!VOS_IS_STATUS_SUCCESS(status)) 
@@ -266,7 +226,6 @@
                 "VOS Mgmt Frame Event init failed - status = %d\n", status);
       status = VOS_STATUS_E_FAILURE;
    }
-
    status = vos_event_init(&wdaContext->suspendDataTxEvent);
    if(!VOS_IS_STATUS_SUCCESS(status)) 
    {
@@ -274,7 +233,6 @@
             "VOS suspend data tx Event init failed - status = %d\n", status);
       status = VOS_STATUS_E_FAILURE;
    }
-
    status = vos_event_init(&wdaContext->waitOnWdiIndicationCallBack);
    if(!VOS_IS_STATUS_SUCCESS(status)) 
    {
@@ -282,9 +240,7 @@
             "VOS wait On Wdi Ind Event init failed - status = %d\n", status);
       status = VOS_STATUS_E_FAILURE;
    }
-
    vos_trace_setLevel(VOS_MODULE_ID_WDA,VOS_TRACE_LEVEL_ERROR);
-
    wdaContext->driverMode = pMacParams->driverType;
    if(WDI_STATUS_SUCCESS != WDI_Init(pOSContext, &wdaContext->pWdiContext, 
                                      &wdiDevCapability, pMacParams->driverType))
@@ -298,7 +254,6 @@
       pMacParams->maxStation = wdiDevCapability.ucMaxSTASupported ;
       pMacParams->maxBssId =  wdiDevCapability.ucMaxBSSSupported;
       pMacParams->frameTransRequired = wdiDevCapability.bFrameXtlSupported;
-
       /* update max STA in WDA used for BA */
       wdaContext->wdaMaxSta = pMacParams->maxStation;
       /* store the frameTransRequired flag in wdaContext, to send this to HAL 
@@ -306,11 +261,9 @@
        */
       wdaContext->frameTransRequired = wdiDevCapability.bFrameXtlSupported;
    }
-
    return status;
 }
 
-
 /*
  * FUNCTION: WDA_preStart
  * Trigger DAL-AL to start CFG download 
@@ -319,24 +272,20 @@
 {   
    VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
    vos_msg_t wdaMsg = {0} ;
-
    /*
     * trigger CFG download in WDA by sending WDA_CFG_DNLD message
     */ 
    wdaMsg.type = WNI_CFG_DNLD_REQ ; 
    wdaMsg.bodyptr = NULL;
    wdaMsg.bodyval = 0;
-
    /* post the message.. */
    vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
    if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
    {
       vosStatus = VOS_STATUS_E_BADMSG;
    }
-
    return( vosStatus );
 }
-
 /*
  * FUNCTION: WDA_wdiStartCallback
  * Once WDI_Start is finished, WDI start callback will be called by WDI
@@ -347,14 +296,12 @@
 {
    tWDA_CbContext *wdaContext;
    VOS_STATUS status;
-
    if (NULL == pVosContext)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
                  "%s: Invoked with invalid pVosContext", __FUNCTION__ );
       return;
    }
-
    wdaContext = VOS_GET_WDA_CTXT(pVosContext);
    if (NULL == wdaContext)
    {
@@ -362,7 +309,6 @@
                  "%s: Invoked with invalid wdaContext", __FUNCTION__ );
       return;
    }
-
    if (WDI_STATUS_SUCCESS != wdiRspParams->wdiStatus)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
@@ -372,7 +318,6 @@
    {
       wdaContext->wdaState = WDA_START_STATE;
    }
-
    /* extract and save version information from the Start Response */
    wdaContext->wcnssWlanCompiledVersion.major =
       wdiRspParams->wlanCompiledVersion.major;
@@ -396,7 +341,6 @@
    wpalMemoryCopy(wdaContext->wcnssHardwareVersionString,
            wdiRspParams->wcnssHardwareVersion,
            sizeof(wdaContext->wcnssHardwareVersionString));
-
    /* Notify WDA_start that WDI_Start has completed */
    status = vos_event_set(&wdaContext->wdaWdiEvent);
    if (VOS_STATUS_SUCCESS != status)
@@ -404,30 +348,25 @@
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
                  "%s: Unable to unblock WDA_start", __FUNCTION__ );
    }
-
    return;
 }
 
-
 /*
  * FUNCTION: WDA_start
  * Prepare TLV configuration and call WDI_Start.
  */
-
 VOS_STATUS WDA_start(v_PVOID_t pVosContext)
 {
    tWDA_CbContext *wdaContext;
    VOS_STATUS status;
    WDI_Status wdiStatus;
    WDI_StartReqParamsType wdiStartParam;
-
    if (NULL == pVosContext)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                  "%s: Invoked with invalid pVosContext", __FUNCTION__ );
       return VOS_STATUS_E_FAILURE;
    }
-
    wdaContext = VOS_GET_WDA_CTXT(pVosContext);
    if (NULL == wdaContext)
    {
@@ -435,7 +374,6 @@
                  "%s: Invoked with invalid wdaContext", __FUNCTION__ );
       return VOS_STATUS_E_FAILURE;
    }
-
    /* Non-FTM mode, WDA status for START must be INIT
     * FTM mode, WDA Status for START can be INIT or STOP */
    if ( (WDA_INIT_STATE != wdaContext->wdaState) &&
@@ -446,14 +384,11 @@
                  __FUNCTION__, wdaContext->wdaState );
       return VOS_STATUS_E_FAILURE;
    }
-
    /* initialize the wdiStartParam.  Note that we can create this on
       the stack since we won't exit until WDI_Start() completes or
       times out */
    vos_mem_set(&wdiStartParam, sizeof(wdiStartParam), 0);
-
    wdiStartParam.wdiDriverType = wdaContext->driverMode;
-
    /* prepare the config TLV for the WDI */
    status = WDA_prepareConfigTLV(pVosContext, &wdiStartParam);
    if ( !VOS_IS_STATUS_SUCCESS(status) )
@@ -462,17 +397,13 @@
                  "%s: Unable to prepare Config TLV", __FUNCTION__ );
       return VOS_STATUS_E_FAILURE;
    }
-
    /* note from here onwards if an error occurs we must
       reclaim the config TLV buffer */
-
    wdiStartParam.wdiLowLevelIndCB = WDA_lowLevelIndCallback;
    wdiStartParam.pIndUserData = (v_PVOID_t *)wdaContext;
    wdiStartParam.wdiReqStatusCB = NULL;
-
    /* initialize the WDA-WDI synchronization event */
    vos_event_reset(&wdaContext->wdaWdiEvent);
-
    /* call WDI start */
    wdiStatus = WDI_Start(&wdiStartParam,
                          (WDI_StartRspCb)WDA_wdiStartCallback,
@@ -484,7 +415,6 @@
       vos_mem_free(wdiStartParam.pConfigBuffer);
       return VOS_STATUS_E_FAILURE;
    }
-
    /* wait for WDI start to invoke our callback */
    status = vos_wait_single_event( &wdaContext->wdaWdiEvent,
                                    WDA_WDI_START_TIMEOUT );
@@ -504,12 +434,9 @@
       vos_mem_free(wdiStartParam.pConfigBuffer);
       return VOS_STATUS_E_FAILURE;
    }
-
    /* WDI_Start() has completed so we can resume our work */
-
    /* we no longer need the config TLV */
    vos_mem_free(wdiStartParam.pConfigBuffer);
-
    /* if we are not in the START state then WDI_Start() failed */
    if (WDA_START_STATE != wdaContext->wdaState)
    {
@@ -517,17 +444,14 @@
                  "%s: WDI_Start() failure detected", __FUNCTION__ );
       return VOS_STATUS_E_FAILURE;
    }
-
    /* FTM mode does not need to monitor BA activity */
    if ( eDRIVER_TYPE_MFG != wdaContext->driverMode )
    {
       status = wdaCreateTimers(wdaContext) ;
    }
-
    return status;
 }
 
-
 /*
  * FUNCTION: WDA_prepareConfigTLV
  * Function to prepare CFG for DAL(WDA)
@@ -545,7 +469,6 @@
    tANI_U32       configParamSize;
    tANI_U32       *configDataValue;
    WDI_WlanVersionType wcnssCompiledApiVersion;
-
    if ((NULL == pMac)||(NULL == wdaContext))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -553,7 +476,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    configParamSize = (sizeof(tHalCfg) * QWLAN_HAL_CFG_MAX_PARAMS) + 
                            WNI_CFG_STA_ID_LEN +
                            WNI_CFG_EDCA_WME_ACBK_LEN +
@@ -561,7 +483,6 @@
                            WNI_CFG_EDCA_WME_ACVI_LEN +
                            WNI_CFG_EDCA_WME_ACVO_LEN +
                            + (QWLAN_HAL_CFG_INTEGER_PARAM * sizeof(tANI_U32));
-
    /* malloc memory for all configs in one shot */ 
    configParam = vos_mem_malloc(configParamSize);
    
@@ -573,12 +494,9 @@
       return VOS_STATUS_E_NOMEM;
    }
    vos_mem_set(configParam, configParamSize, 0);
-
    wdiStartParams->pConfigBuffer = configParam;
-
    tlvStruct = (tHalCfg *)configParam;
    tlvStructStart = (tANI_U8 *)configParam;
-
    /* TODO: Remove Later */
    /* QWLAN_HAL_CFG_STA_ID */
    tlvStruct->type = QWLAN_HAL_CFG_STA_ID;
@@ -594,10 +512,8 @@
    /* calculate the pad bytes to have the CFG in aligned format */
    tlvStruct->padBytes = ALIGNED_WORD_SIZE - 
                               (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes)) ;
-
    /* QWLAN_HAL_CFG_CURRENT_TX_ANTENNA */
    tlvStruct->type = QWLAN_HAL_CFG_CURRENT_TX_ANTENNA;
    tlvStruct->length = sizeof(tANI_U32);
@@ -609,10 +525,8 @@
                           "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_CURRENT_RX_ANTENNA */
    tlvStruct->type = QWLAN_HAL_CFG_CURRENT_RX_ANTENNA;
    tlvStruct->length = sizeof(tANI_U32);
@@ -624,10 +538,8 @@
                     "Failed to get value for WNI_CFG_CURRENT_RX_ANTENNA");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE */
    tlvStruct->type = QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE;
    tlvStruct->length = sizeof(tANI_U32);
@@ -639,7 +551,6 @@
                     "Failed to get value for WNI_CFG_LOW_GAIN_OVERRIDE");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ;
  
@@ -654,10 +565,8 @@
                     "Failed to get value for WNI_CFG_POWER_STATE_PER_CHAIN");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)); 
-
    /* QWLAN_HAL_CFG_CAL_PERIOD */
    tlvStruct->type = QWLAN_HAL_CFG_CAL_PERIOD;
    tlvStruct->length = sizeof(tANI_U32);
@@ -669,10 +578,8 @@
                     "Failed to get value for WNI_CFG_CAL_PERIOD");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length));
-
    /* QWLAN_HAL_CFG_CAL_CONTROL  */
    tlvStruct->type = QWLAN_HAL_CFG_CAL_CONTROL ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -684,10 +591,8 @@
                     "Failed to get value for WNI_CFG_CAL_CONTROL");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length));
-
    /* QWLAN_HAL_CFG_PROXIMITY  */
    tlvStruct->type = QWLAN_HAL_CFG_PROXIMITY ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -699,10 +604,8 @@
                     "Failed to get value for WNI_CFG_PROXIMITY");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                              + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_NETWORK_DENSITY  */
    tlvStruct->type = QWLAN_HAL_CFG_NETWORK_DENSITY ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -714,10 +617,8 @@
                     "Failed to get value for WNI_CFG_NETWORK_DENSITY");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)); 
-
    /* QWLAN_HAL_CFG_MAX_MEDIUM_TIME  */
    tlvStruct->type = QWLAN_HAL_CFG_MAX_MEDIUM_TIME ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -729,10 +630,8 @@
                     "Failed to get value for WNI_CFG_MAX_MEDIUM_TIME");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)); 
-
    /* QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU   */
    tlvStruct->type = QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -744,10 +643,8 @@
                     "Failed to get value for WNI_CFG_MAX_MPDUS_IN_AMPDU");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ;
-
    /* QWLAN_HAL_CFG_RTS_THRESHOLD   */
    tlvStruct->type = QWLAN_HAL_CFG_RTS_THRESHOLD  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -759,10 +656,8 @@
                     "Failed to get value for WNI_CFG_RTS_THRESHOLD");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length));
-
    /* QWLAN_HAL_CFG_SHORT_RETRY_LIMIT   */
    tlvStruct->type = QWLAN_HAL_CFG_SHORT_RETRY_LIMIT  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -774,10 +669,8 @@
                     "Failed to get value for WNI_CFG_SHORT_RETRY_LIMIT");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_LONG_RETRY_LIMIT   */
    tlvStruct->type = QWLAN_HAL_CFG_LONG_RETRY_LIMIT  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -789,10 +682,8 @@
                     "Failed to get value for WNI_CFG_LONG_RETRY_LIMIT");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ;
-
    /* QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD   */
    tlvStruct->type = QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -804,10 +695,8 @@
                     "Failed to get value for WNI_CFG_FRAGMENTATION_THRESHOLD");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ;
-
    /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO   */
    tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -819,7 +708,6 @@
                     "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ZERO");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length));
  
@@ -834,10 +722,8 @@
                     "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ONE");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)); 
-
    /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO   */
    tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -849,7 +735,6 @@
                     "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_TWO");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length));
  
@@ -864,7 +749,6 @@
                     "Failed to get value for WNI_CFG_FIXED_RATE");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length));
  
@@ -879,7 +763,6 @@
                     "Failed to get value for WNI_CFG_RETRYRATE_POLICY");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length));
  
@@ -894,10 +777,8 @@
                     "Failed to get value for WNI_CFG_RETRYRATE_SECONDARY");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_RETRYRATE_TERTIARY   */
    tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_TERTIARY  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -911,7 +792,6 @@
    }
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION   */
    tlvStruct->type = QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -923,10 +803,8 @@
                     "Failed to get value for WNI_CFG_FORCE_POLICY_PROTECTION");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length); 
-
    /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ   */
    tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -938,10 +816,8 @@
                  "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_24GHZ");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length); 
-
    /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ   */
    tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -953,7 +829,6 @@
                  "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_5GHZ");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length); 
    
@@ -969,7 +844,6 @@
                     "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_24GHZ");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length); 
 #endif
@@ -984,10 +858,8 @@
                     "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_5GHZ");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                              + sizeof(tHalCfg) + tlvStruct->length); 
-
    /* QWLAN_HAL_CFG_MAX_BA_SESSIONS   */
    tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_SESSIONS  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -999,7 +871,6 @@
                     "Failed to get value for WNI_CFG_MAX_BA_SESSIONS");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                              + sizeof(tHalCfg) + tlvStruct->length);
  
@@ -1014,10 +885,8 @@
                "Failed to get value for WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                              + sizeof(tHalCfg) + tlvStruct->length); 
-
    /* QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER   */
    tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1029,10 +898,8 @@
                     "Failed to get value for WNI_CFG_PS_ENABLE_BCN_FILTER");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                              + sizeof(tHalCfg) + tlvStruct->length); 
-
    /* QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR   */
    tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1044,10 +911,8 @@
                     "Failed to get value for WNI_CFG_PS_ENABLE_RSSI_MONITOR");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                               + sizeof(tHalCfg) + tlvStruct->length); 
-
    /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE   */
    tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1059,7 +924,6 @@
                 "Failed to get value for WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                               + sizeof(tHalCfg) + tlvStruct->length);
  
@@ -1074,10 +938,8 @@
                     "Failed to get value for WNI_CFG_STATS_PERIOD");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                                + sizeof(tHalCfg) + tlvStruct->length); 
-
    /* QWLAN_HAL_CFG_CFP_MAX_DURATION   */
    tlvStruct->type = QWLAN_HAL_CFG_CFP_MAX_DURATION  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1089,20 +951,16 @@
                     "Failed to get value for WNI_CFG_CFP_MAX_DURATION");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* QWLAN_HAL_CFG_FRAME_TRANS_ENABLED */
    tlvStruct->type = QWLAN_HAL_CFG_FRAME_TRANS_ENABLED  ;
    tlvStruct->length = sizeof(tANI_U32);
    configDataValue = (tANI_U32 *)(tlvStruct + 1);
    vos_mem_copy(configDataValue, &wdaContext->frameTransRequired, 
                                                sizeof(tANI_U32));
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* QWLAN_HAL_CFG_DTIM_PERIOD */
    tlvStruct->type = QWLAN_HAL_CFG_DTIM_PERIOD  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1114,10 +972,8 @@
                     "Failed to get value for WNI_CFG_DTIM_PERIOD");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* QWLAN_HAL_CFG_EDCA_WMM_ACBK */
    tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBK  ;
    strLength = WNI_CFG_EDCA_WME_ACBK_LEN;
@@ -1133,10 +989,8 @@
    /* calculate the pad bytes to have the CFG in aligned format */
    tlvStruct->padBytes = ALIGNED_WORD_SIZE - 
                               (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                  + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ; 
-
    /* QWLAN_HAL_CFG_EDCA_WMM_ACBE */
    tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBE  ;
    strLength = WNI_CFG_EDCA_WME_ACBE_LEN;
@@ -1152,10 +1006,8 @@
    /* calculate the pad bytes to have the CFG in aligned format */
    tlvStruct->padBytes = ALIGNED_WORD_SIZE - 
                               (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                  + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ; 
-
    /* QWLAN_HAL_CFG_EDCA_WMM_ACVI */
    tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVO  ;
    strLength = WNI_CFG_EDCA_WME_ACVI_LEN;
@@ -1171,10 +1023,8 @@
    /* calculate the pad bytes to have the CFG in aligned format */
    tlvStruct->padBytes = ALIGNED_WORD_SIZE - 
                               (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                  + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ; 
-
    /* QWLAN_HAL_CFG_EDCA_WMM_ACVO */
    tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVI  ;
    strLength = WNI_CFG_EDCA_WME_ACVO_LEN;
@@ -1190,10 +1040,8 @@
    /* calculate the pad bytes to have the CFG in aligned format */
    tlvStruct->padBytes = ALIGNED_WORD_SIZE - 
                               (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                  + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ; 
-
    /* QWLAN_HAL_CFG_BA_THRESHOLD_HIGH */
    tlvStruct->type = QWLAN_HAL_CFG_BA_THRESHOLD_HIGH  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1205,10 +1053,8 @@
                     "Failed to get value for WNI_CFG_BA_THRESHOLD_HIGH");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* QWLAN_HAL_CFG_MAX_BA_BUFFERS */
    tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_BUFFERS  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1220,10 +1066,8 @@
                     "Failed to get value for WNI_CFG_MAX_BA_BUFFERS");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE */
    tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1235,10 +1079,8 @@
                     "Failed to get value for WNI_CFG_DYNAMIC_PS_POLL_VALUE");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI */
    tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1252,7 +1094,6 @@
    }
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS */
    tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1266,7 +1107,6 @@
    }
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI */
    tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1280,7 +1120,6 @@
    }
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS */
    tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1294,7 +1133,6 @@
    }
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN */
    tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1308,7 +1146,6 @@
    }
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD */
    tlvStruct->type = QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1320,10 +1157,8 @@
                     "Failed to get value for WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /*QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE*/
    tlvStruct->type = QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1335,10 +1170,8 @@
                     "Failed to get value for WNI_CFG_TX_PWR_CTRL_ENABLE");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ;
-
    /* QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP   */
    tlvStruct->type = QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1350,15 +1183,12 @@
                     "Failed to get value for WNI_CFG_ENABLE_CLOSE_LOOP");
       goto handle_failure;
    }
-
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* [COEX] strictly speaking, the Coex parameters are not part of the WLAN_CFG_FILE binary, 
    * but are from the WLAN_INI_FILE file.  However, this is the only parameter download routine
    * into FW, so the parameters are added here.
    */
-
    /* [COEX] QWLAN_HAL_CFG_BTC_EXECUTION_MODE */
    tlvStruct->type = QWLAN_HAL_CFG_BTC_EXECUTION_MODE  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1366,7 +1196,6 @@
    *configDataValue = pMac->btc.btcConfig.btcExecutionMode; 
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK */
    tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1374,7 +1203,6 @@
    *configDataValue = pMac->btc.btcConfig.btcConsBtSlotsToBlockDuringDhcp; 
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* [COEX] QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS */
    tlvStruct->type = QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1382,7 +1210,6 @@
    *configDataValue = pMac->btc.btcConfig.btcA2DPBtSubIntervalsDuringDhcp; 
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
-
    /* [COEX] QWLAN_HAL_CFG_WCNSS_API_VERSION */
    tlvStruct->type = QWLAN_HAL_CFG_WCNSS_API_VERSION  ;
    tlvStruct->length = sizeof(tANI_U32);
@@ -1440,11 +1267,9 @@
                             + sizeof(tHalCfg) + tlvStruct->length) ; 
 
    wdiStartParams->usConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
-
 #ifdef WLAN_DEBUG
    {
       int i;
-
        VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                     "****** Dumping CFG TLV ***** ");
       for (i=0; (i+7) < wdiStartParams->usConfigBufferLen; i+=8)
@@ -1470,14 +1295,11 @@
                     "**************************** ");
    }
 #endif
-
    return VOS_STATUS_SUCCESS ;
-
 handle_failure:
    vos_mem_free(configParam);
    return VOS_STATUS_E_FAILURE;
 }
-
 /*
  * FUNCTION: WDA_wdiCompleteCB
  * call the voss call back function
@@ -1485,21 +1307,18 @@
 void WDA_stopCallback(WDI_Status status, v_PVOID_t *pVosContext)
 {
    tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
-
    if (NULL == wdaContext)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                  "%s: Invoked with invalid wdaContext", __FUNCTION__ );
       return ;
    }
-
    /* free the config structure */
    if(wdaContext->wdaWdiApiMsgParam != NULL)
    {
       vos_mem_free(wdaContext->wdaWdiApiMsgParam);
       wdaContext->wdaWdiApiMsgParam = NULL;
    }
-
    if(WDI_STATUS_SUCCESS != status)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -1510,25 +1329,20 @@
    {
       wdaContext->wdaState = WDA_STOP_STATE;
    }
-
    /* Indicate VOSS about the start complete */
    vos_WDAComplete_cback(pVosContext);
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_stop
  * call WDI_stop
  */ 
-
 VOS_STATUS WDA_stop(v_PVOID_t pVosContext, tANI_U8 reason)
 {
    WDI_Status wdiStatus;
    VOS_STATUS status = VOS_STATUS_SUCCESS;
    WDI_StopReqParamsType *wdiStopReq;
    tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
-
    if (NULL == pWDA)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -1536,7 +1350,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    /* FTM mode stay START_STATE */
    if( (WDA_READY_STATE != pWDA->wdaState) &&
        (WDA_INIT_STATE != pWDA->wdaState) &&
@@ -1544,7 +1357,6 @@
    {
       VOS_ASSERT(0);
    }
-
    wdiStopReq = (WDI_StopReqParamsType *)
                             vos_mem_malloc(sizeof(WDI_StopReqParamsType));
    if(NULL == wdiStopReq)
@@ -1554,10 +1366,8 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiStopReq->wdiStopReason = reason;
    wdiStopReq->wdiReqStatusCB = NULL;
-
    if(NULL != pWDA->wdaWdiApiMsgParam)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -1566,17 +1376,14 @@
       vos_mem_free(wdiStopReq);
       return VOS_STATUS_E_FAILURE;
    }
-
    if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
    {
       wdaDestroyTimers(pWDA);
    }
    pWDA->wdaWdiApiMsgParam = (v_PVOID_t *)wdiStopReq;
-
    /* call WDI stop */
    wdiStatus = WDI_Stop(wdiStopReq,
                            (WDI_StopRspCb)WDA_stopCallback, pVosContext);
-
    if (IS_WDI_STATUS_FAILURE(wdiStatus) )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -1585,10 +1392,8 @@
       pWDA->wdaWdiApiMsgParam = NULL;
       status = VOS_STATUS_E_FAILURE;
    }
-
    return status;
 }
-
 /*
  * FUNCTION: WDA_close
  * call WDI_close and free the WDA context
@@ -1599,29 +1404,24 @@
    WDI_Status wstatus;
    VOS_STATUS vstatus;
    tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
-
    if (NULL == wdaContext)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                  "%s: Invoked with invalid wdaContext", __FUNCTION__ );
       return VOS_STATUS_E_FAILURE;
    }
-
    if((WDA_INIT_STATE != wdaContext->wdaState) && 
                               (WDA_STOP_STATE != wdaContext->wdaState))
    {
       VOS_ASSERT(0);
    }
-
    /*call WDI close*/
    wstatus = WDI_Close();
    if ( wstatus != WDI_STATUS_SUCCESS )
    {
       status = VOS_STATUS_E_FAILURE;
    }
-
    wdaContext->wdaState = WDA_CLOSE_STATE;
-
    /* Destroy the events */
    vstatus = vos_event_destroy(&wdaContext->wdaWdiEvent);
    if(!VOS_IS_STATUS_SUCCESS(vstatus)) 
@@ -1632,30 +1432,29 @@
    }
 
    vstatus = vos_event_destroy(&wdaContext->txFrameEvent);
-   if(!VOS_IS_STATUS_SUCCESS(status))
+   if(!VOS_IS_STATUS_SUCCESS(vstatus))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                   "VOS Event destroy failed - status = %d\n", status);
       status = VOS_STATUS_E_FAILURE;
    }
    vstatus = vos_event_destroy(&wdaContext->suspendDataTxEvent);
-   if(!VOS_IS_STATUS_SUCCESS(status))
+   if(!VOS_IS_STATUS_SUCCESS(vstatus))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                   "VOS Event destroy failed - status = %d\n", status);
       status = VOS_STATUS_E_FAILURE;
    }
    vstatus = vos_event_destroy(&wdaContext->waitOnWdiIndicationCallBack);
-   if(!VOS_IS_STATUS_SUCCESS(status))
+   if(!VOS_IS_STATUS_SUCCESS(vstatus))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                   "VOS Event destroy failed - status = %d\n", status);
       status = VOS_STATUS_E_FAILURE;
    }
-
    /* free WDA context */
    vstatus = vos_free_context(pVosContext, VOS_MODULE_ID_WDA, wdaContext);
-   if ( !VOS_IS_STATUS_SUCCESS(status) )
+   if ( !VOS_IS_STATUS_SUCCESS(vstatus) )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                                   "error in WDA close " );
@@ -1663,7 +1462,6 @@
    }
    return status;
 }
-
 /*
  * FUNCTION: WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual
  * returns 1 if the compiled version is greater than or equal to the input version
@@ -1674,9 +1472,7 @@
     VOS_STATUS status = VOS_STATUS_SUCCESS;
     v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
     tSirVersionType compiledVersion;
-
     status = WDA_GetWcnssWlanCompiledVersion(vosContext, &compiledVersion);
-
     if ((compiledVersion.major > major) || ((compiledVersion.major == major)&& (compiledVersion.minor > minor)) ||
         ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version > version)) ||
         ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version == version) &&
@@ -1685,20 +1481,16 @@
     else
         return 0;
 }
-
 /*
  * FUNCTION: WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual
  * returns 1 if the compiled version is greater than or equal to the input version
  */ 
-
 uint8 WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision)
 {    
     VOS_STATUS status = VOS_STATUS_SUCCESS;
     v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
     tSirVersionType reportedVersion;
-
     status = WDA_GetWcnssWlanReportedVersion(vosContext, &reportedVersion);
-
     if ((reportedVersion.major > major) || ((reportedVersion.major == major)&& (reportedVersion.minor > minor)) ||
         ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version > version)) ||
         ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version == version) &&
@@ -1707,7 +1499,6 @@
     else
         return 0;
 }
-
 /*
  * FUNCTION: WDA_GetWcnssWlanCompiledVersion
  * Returns the version of the WCNSS WLAN API with which the HOST
@@ -1717,10 +1508,8 @@
                                            tSirVersionType *pVersion)
 {
    tWDA_CbContext *pWDA;
-
    VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
              "%s: Entered", __FUNCTION__);
-
    if ((NULL == pvosGCtx) || (NULL == pVersion))
    {
       VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -1728,7 +1517,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
    if (NULL == pWDA )
    {
@@ -1737,11 +1525,9 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    *pVersion = pWDA->wcnssWlanCompiledVersion;
    return VOS_STATUS_SUCCESS;
 }
-
 /*
  * FUNCTION: WDA_GetWcnssWlanReportedVersion
  * Returns the version of the WCNSS WLAN API with which the WCNSS
@@ -1751,10 +1537,8 @@
                                            tSirVersionType *pVersion)
 {
    tWDA_CbContext *pWDA;
-
    VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
              "%s: Entered", __FUNCTION__);
-
    if ((NULL == pvosGCtx) || (NULL == pVersion))
    {
       VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -1762,7 +1546,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
    if (NULL == pWDA )
    {
@@ -1771,11 +1554,9 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    *pVersion = pWDA->wcnssWlanReportedVersion;
    return VOS_STATUS_SUCCESS;
 }
-
 /*
  * FUNCTION: WDA_GetWcnssSoftwareVersion
  * Returns the WCNSS Software version string
@@ -1785,10 +1566,8 @@
                                        tANI_U32 versionBufferSize)
 {
    tWDA_CbContext *pWDA;
-
    VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
              "%s: Entered", __FUNCTION__);
-
    if ((NULL == pvosGCtx) || (NULL == pVersion))
    {
       VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -1796,7 +1575,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
    if (NULL == pWDA )
    {
@@ -1805,11 +1583,9 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    wpalMemoryCopy(pVersion, pWDA->wcnssSoftwareVersionString, versionBufferSize);
    return VOS_STATUS_SUCCESS;
 }
-
 /*
  * FUNCTION: WDA_GetWcnssHardwareVersion
  * Returns the WCNSS Hardware version string
@@ -1819,10 +1595,8 @@
                                        tANI_U32 versionBufferSize)
 {
    tWDA_CbContext *pWDA;
-
    VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
              "%s: Entered", __FUNCTION__);
-
    if ((NULL == pvosGCtx) || (NULL == pVersion))
    {
       VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -1830,7 +1604,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
    if (NULL == pWDA )
    {
@@ -1839,11 +1612,9 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    wpalMemoryCopy(pVersion, pWDA->wcnssHardwareVersionString, versionBufferSize);
    return VOS_STATUS_SUCCESS;
 }
-
 /*
  * FUNCTION: WDA_WniCfgDnld
  * Trigger CFG Download
@@ -1851,17 +1622,13 @@
 VOS_STATUS WDA_WniCfgDnld(tWDA_CbContext *pWDA) 
 {
    tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
-
    VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
-
    v_VOID_t *pFileImage = NULL;
    v_SIZE_t cbFileImageSize = 0;
-
    v_VOID_t *pCfgBinary = NULL;
    v_SIZE_t cbCfgBinarySize = 0;
    
    v_BOOL_t bStatus = VOS_FALSE;
-
    if (NULL == pMac )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -1869,7 +1636,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    /* get the number of bytes in the CFG Binary... */
    vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, NULL, 
                                                 &cbFileImageSize );
@@ -1879,16 +1645,13 @@
                  "Error obtaining binary size" );
       goto fail;
    }
-
    // malloc a buffer to read in the Configuration binary file.
    pFileImage = vos_mem_malloc( cbFileImageSize );
-
    if ( NULL == pFileImage )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
               "Unable to allocate memory for the CFG binary [size= %d bytes]",
                  cbFileImageSize );
-
       vosStatus = VOS_STATUS_E_NOMEM;
       goto fail;
    }
@@ -1917,13 +1680,11 @@
       vosStatus = VOS_STATUS_E_FAILURE;
       goto fail;
    }
-
    /*
     * TODO: call the config download function 
     * for now calling the existing cfg download API 
     */
    processCfgDownloadReq(pMac,cbCfgBinarySize,pCfgBinary);
-
    if( pFileImage != NULL )
    {
       vos_mem_free( pFileImage );
@@ -1936,12 +1697,10 @@
    
    return vosStatus;
 }
-
 /* -----------------------------------------------------------------
  * WDI interface 
  * -----------------------------------------------------------------
  */
-
 /*
  * FUNCTION: WDA_suspendDataTxCallback
  * call back function called from TL after suspend Transmission
@@ -1951,10 +1710,8 @@
                                             VOS_STATUS     vosStatus)
 {
    tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                       "%s: Entered " ,__FUNCTION__);
-
    if (NULL == pWDA )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -1970,7 +1727,6 @@
    {
       pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;        
    }
-
    /* Trigger the event to bring the WDA TL suspend function to come 
     * out of wait*/
    vosStatus = vos_event_set(&pWDA->suspendDataTxEvent);
@@ -1979,7 +1735,6 @@
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, 
                       "NEW VOS Event Set failed - status = %d \n", vosStatus);
    }
-
    /* If TL suspended had timedout before this callback was called, resume back 
    * TL.*/
    if (pWDA->txSuspendTimedOut) 
@@ -1989,10 +1744,8 @@
       WDA_ResumeDataTx(pWDA);
       pWDA->txSuspendTimedOut = FALSE;
    }
-
    return VOS_STATUS_SUCCESS;
 }
-
 /*
  * FUNCTION: WDA_suspendDataTx
  * Update TL to suspend the data Transmission
@@ -2005,16 +1758,13 @@
 
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                       "%s: Entered " ,__FUNCTION__);
-
    pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;
-
    if (pWDA->txSuspendTimedOut) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
          "TL suspend timedout previously, CB not called yet\n");
         return status;
    }
-
    /* Reset the event to be not signalled */
    status = vos_event_reset(&pWDA->suspendDataTxEvent);
    if(!VOS_IS_STATUS_SUCCESS(status))
@@ -2023,7 +1773,6 @@
                             "VOS Event reset failed - status = %d\n",status);
       return VOS_STATUS_E_FAILURE;
    }
-
    /*Indicate TL to suspend transmission for all Sta Id */
    ucSTAId = WLAN_ALL_STA;
    status = WLANTL_SuspendDataTx(pWDA->pVosContext, &ucSTAId,
@@ -2032,7 +1781,6 @@
    {
       return status;
    }
-
    /* Wait for the event to be set by the TL, to get the response of 
     * suspending the TX queues, this event should be set by the Callback 
     * function called by TL*/
@@ -2052,15 +1800,12 @@
    {
       pWDA->txSuspendTimedOut = FALSE;
    }
-
    if(WDA_TL_TX_SUSPEND_SUCCESS == pWDA->txStatus)
    {
       status = VOS_STATUS_SUCCESS;
    }
-
    return status;
 }
-
 /*
  * FUNCTION: WDA_resumeDataTx
  * Update TL to resume the data Transmission
@@ -2076,7 +1821,6 @@
    status = WLANTL_ResumeDataTx(pWDA->pVosContext, &ucSTAId);
    return status;
 }
-
 /*
  * FUNCTION: WDA_InitScanReqCallback
  * Trigger Init SCAN callback
@@ -2087,7 +1831,6 @@
    tWDA_CbContext *pWDA; 
    tInitScanParams *pWDA_ScanParam ;
    VOS_STATUS      status;      
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
    if(NULL == pWdaParams)
@@ -2099,38 +1842,33 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    pWDA_ScanParam = (tInitScanParams *)pWdaParams->wdaMsgParam;
-
    if(NULL == pWDA_ScanParam)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                   "%s: pWDA_ScanParam received NULL", __FUNCTION__);
-      VOS_ASSERT(0) ;
+      VOS_ASSERT(0);
+	  vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+	  vos_mem_free(pWdaParams);
       return ;
    }
-
    if(WDI_STATUS_SUCCESS != wdiStatus)
    {
       status = WDA_ResumeDataTx(pWDA) ;
-
       if(VOS_STATUS_SUCCESS != status)
       {
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                                   "%s error in Resume Tx ", __FUNCTION__ );
       }
    }
-
    /* free WDI command buffer */
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
-
    vos_mem_free(pWdaParams) ;
-
+   
    
    /* assign status to scan params */
    pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
-
    /* send SCAN RSP message back to PE */
    WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
-
    return ;
 }
   
@@ -2150,7 +1888,6 @@
    
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiInitScanParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2158,7 +1895,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if(NULL == pWdaParams)
    {
@@ -2185,7 +1921,6 @@
 #endif
    wdiInitScanParam->wdiReqInfo.wdiScanEntry.activeBSScnt = 
                                      initScanParams->scanEntry.activeBSScnt ;
-
    for (i=0; i < initScanParams->scanEntry.activeBSScnt; i++)
    {
        wdiInitScanParam->wdiReqInfo.wdiScanEntry.bssIdx[i] = 
@@ -2200,52 +1935,41 @@
    } 
    wdiInitScanParam->wdiReqStatusCB = NULL ;
 
-
    /* Store Init Req pointer, as this will be used for response */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = initScanParams;
    pWdaParams->wdaWdiApiMsgParam = wdiInitScanParam;
-
    /* first try to suspend TX */
    status = WDA_SuspendDataTx(pWDA) ;
-
    if(WDI_STATUS_SUCCESS != status)
    {
       goto handleWdiFailure;
    }
-
    /* call DAL API to pass init scan request to DAL */
    status = WDI_InitScanReq(wdiInitScanParam, 
                         WDA_InitScanReqCallback, pWdaParams) ;
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                                "error in WDA Init Scan, Resume Tx " );
       status = WDA_ResumeDataTx(pWDA) ;
-
       VOS_ASSERT(0) ;
   
       goto handleWdiFailure;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
-
 handleWdiFailure:
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                       "Failure in WDI Api, free all the memory " );
    /* free WDI command buffer */
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    /* send Failure to PE */
    initScanParams->status = eSIR_FAILURE ;
    WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)initScanParams, 0) ;
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
 
-
 /*
  * FUNCTION: WDA_StartScanReqCallback
  * send Start SCAN RSP back to PE
@@ -2258,7 +1982,6 @@
    tStartScanParams *pWDA_ScanParam;
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2268,38 +1991,33 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    pWDA_ScanParam = (tStartScanParams *)pWdaParams->wdaMsgParam;
-
    if(NULL == pWDA_ScanParam)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                    "%s: pWDA_ScanParam received NULL", __FUNCTION__);
       VOS_ASSERT(0) ;
+	  vos_mem_free(pWdaParams);
       return ;
    }
-
    if(NULL == pWdaParams->wdaWdiApiMsgParam)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                   "%s: wdaWdiApiMsgParam is NULL", __FUNCTION__);
       VOS_ASSERT(0) ;
+	  vos_mem_free(pWdaParams);
       return ;
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
+   
    
    /* assign status to scan params */
    pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(pScanRsp->wdiStatus) ;
-
    /* send SCAN RSP message back to PE */
    WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
-
    return ;
 }
 
-
-
 /*
  * FUNCTION: WDA_ProcessStartScanReq
  * Trigger start SCAN in WDI
@@ -2312,10 +2030,8 @@
                             (WDI_StartScanReqParamsType *)vos_mem_malloc(
                                           sizeof(WDI_StartScanReqParamsType)) ;
    tWDA_ReqParams *pWdaParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiStartScanParams) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2332,22 +2048,18 @@
       vos_mem_free(wdiStartScanParams);
       return VOS_STATUS_E_NOMEM;
    }
-
    /* Copy init Scan params to WDI structure */
    wdiStartScanParams->ucChannel = startScanParams->scanChannel ;
    wdiStartScanParams->wdiReqStatusCB = NULL ;
 
-
    /* Store Init Req pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = startScanParams;
    pWdaParams->wdaWdiApiMsgParam = wdiStartScanParams;
-
    /* call DAL API to pass init scan request to DAL */
    status = WDI_StartScanReq(wdiStartScanParams, 
                               WDA_StartScanReqCallback, pWdaParams) ;
-
    /* failure returned by WDI API */
    if(IS_WDI_STATUS_FAILURE(status))
    {
@@ -2359,10 +2071,8 @@
       startScanParams->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)startScanParams, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_EndScanReqCallback
  * END SCAN callback
@@ -2374,7 +2084,6 @@
    tEndScanParams *endScanParam;
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                              "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2384,28 +2093,26 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    endScanParam = (tEndScanParams *)pWdaParams->wdaMsgParam;
-
    if(NULL == endScanParam)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                    "%s: endScanParam received NULL", __FUNCTION__);
       VOS_ASSERT(0) ;
+	  vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+	  vos_mem_free(pWdaParams);
       return ;
    } 
    
    /* Free WDI command buffer */
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    /* assign status to scan params */
    endScanParam->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    /* send response back to PE */
    WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParam, 0) ;
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessEndScanReq
  * Trigger END SCAN in WDI
@@ -2418,10 +2125,8 @@
                             (WDI_EndScanReqParamsType *)vos_mem_malloc(
                                           sizeof(WDI_EndScanReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                              "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiEndScanParams) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2438,21 +2143,17 @@
       vos_mem_free(wdiEndScanParams);
       return VOS_STATUS_E_NOMEM;
    }
-
    /* Copy init Scan params to WDI structure */
    wdiEndScanParams->ucChannel = endScanParams->scanChannel ;
    wdiEndScanParams->wdiReqStatusCB = NULL ;
-
    /* Store Init Req pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = endScanParams;
    pWdaParams->wdaWdiApiMsgParam = wdiEndScanParams;
-
    /* call DAL API to pass init scan request to DAL */
    status = WDI_EndScanReq(wdiEndScanParams, 
                               WDA_EndScanReqCallback, pWdaParams) ;
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2463,10 +2164,8 @@
       endScanParams->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParams, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_FinishScanReqCallback
  * Trigger Finish SCAN callback
@@ -2477,10 +2176,8 @@
    tWDA_CbContext *pWDA; 
    tFinishScanParams *finishScanParam; 
    VOS_STATUS      status;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2491,18 +2188,17 @@
    
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    finishScanParam = (tFinishScanParams *)pWdaParams->wdaMsgParam;
-
    if(NULL == finishScanParam)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                   "%s: finishScanParam is NULL", __FUNCTION__);
       VOS_ASSERT(0) ;
+	  vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+	  vos_mem_free(pWdaParams);
       return ;
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    /* 
     * Now Resume TX, if we reached here means, TX is already suspended, we 
     * have to resume it unconditionaly
@@ -2514,13 +2210,10 @@
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                                   "%s error in Resume Tx ", __FUNCTION__ );
    }
-
    finishScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
-
    WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParam, 0) ;
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessFinshScanReq
  * Trigger Finish SCAN in WDI
@@ -2536,7 +2229,6 @@
    tANI_U8 i = 0;
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                              "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiFinishScanParams) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2553,12 +2245,10 @@
       vos_mem_free(wdiFinishScanParams);
       return VOS_STATUS_E_NOMEM;
    }
-
    /* Copy init Scan params to WDI structure */
    wdiFinishScanParams->wdiReqInfo.wdiScanMode = finishScanParams->scanMode ;
    vos_mem_copy(wdiFinishScanParams->wdiReqInfo.macBSSID, 
                               finishScanParams->bssid, sizeof(tSirMacAddr)) ;
-
    wdiFinishScanParams->wdiReqInfo.bNotifyBSS = finishScanParams->notifyBss ;
    wdiFinishScanParams->wdiReqInfo.ucFrameType = finishScanParams->frameType ;
    wdiFinishScanParams->wdiReqInfo.ucFrameLength = 
@@ -2568,7 +2258,6 @@
    wdiFinishScanParams->wdiReqInfo.wdiCBState = finishScanParams->cbState ;
    wdiFinishScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt = 
                                      finishScanParams->scanEntry.activeBSScnt ;
-
    for (i = 0; i < finishScanParams->scanEntry.activeBSScnt; i++)
    {
        wdiFinishScanParams->wdiReqInfo.wdiScanEntry.bssIdx[i] = 
@@ -2576,7 +2265,6 @@
    }
    
  
-
    /* if Frame length, copy macMgmtHdr ro WDI structure */ 
    if(0 != wdiFinishScanParams->wdiReqInfo.ucFrameLength)
    {
@@ -2585,17 +2273,15 @@
                                                      sizeof(WDI_MacMgmtHdr)) ;
    } 
    wdiFinishScanParams->wdiReqStatusCB = NULL ;
-
    /* Store Init Req pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = finishScanParams;
    pWdaParams->wdaWdiApiMsgParam = wdiFinishScanParams;
-
    /* call DAL API to pass init scan request to DAL */
    status = WDI_FinishScanReq(wdiFinishScanParams, 
                               WDA_FinishScanReqCallback, pWdaParams) ;
-
+   
    
    /* 
     * WDI API returns failure..
@@ -2606,19 +2292,15 @@
                      "Failure in Finish Scan WDI API, free all the memory " );
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
-
       finishScanParams->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParams, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*---------------------------------------------------------------------
  * ASSOC API's
  *---------------------------------------------------------------------
  */
-
 /*
  * FUNCTION: WDA_JoinReqCallback
  * Trigger Init SCAN callback
@@ -2628,10 +2310,8 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA; 
    tSwitchChannelParams *joinReqParam;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2641,41 +2321,30 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    joinReqParam = (tSwitchChannelParams *)pWdaParams->wdaMsgParam;
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    vos_mem_free(pWdaParams) ;
-
    /* reset macBSSID */
    vos_mem_set(pWDA->macBSSID, sizeof(pWDA->macBSSID),0 );
-
    /* reset macSTASelf */
    vos_mem_set(pWDA->macSTASelf, sizeof(pWDA->macSTASelf),0 );
-
    joinReqParam->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam , 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessJoinReq
  * Trigger Join REQ in WDI
  */ 
-
 VOS_STATUS WDA_ProcessJoinReq(tWDA_CbContext *pWDA, 
                                             tSwitchChannelParams* joinReqParam)
 {
    WDI_Status status = WDI_STATUS_SUCCESS ;
-
    WDI_JoinReqParamsType *wdiJoinReqParam = 
                              (WDI_JoinReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_JoinReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiJoinReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2692,14 +2361,11 @@
       vos_mem_free(wdiJoinReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    /* copy the BSSID for pWDA */
    vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macBSSID, pWDA->macBSSID, 
                                              sizeof(tSirMacAddr)) ;
-
    vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macSTASelf, 
                 pWDA->macSTASelf, sizeof(tSirMacAddr)) ;
-
    wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucChannel = 
                                                  joinReqParam->channelNumber ;
 #ifndef WLAN_FEATURE_VOWIFI
@@ -2711,16 +2377,13 @@
    wdiJoinReqParam->wdiReqInfo.linkState = pWDA->linkState;
    
    wdiJoinReqParam->wdiReqStatusCB = NULL ;
-
    /* Store Init Req pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = joinReqParam;
    pWdaParams->wdaWdiApiMsgParam = wdiJoinReqParam;
-
    status = WDI_JoinReq(wdiJoinReqParam, 
                                (WDI_JoinRspCb )WDA_JoinReqCallback, pWdaParams) ;
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2730,10 +2393,8 @@
       joinReqParam->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_SwitchChannelReqCallback
  * send Switch channel RSP back to PE
@@ -2744,7 +2405,6 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; 
    tWDA_CbContext *pWDA; 
    tSwitchChannelParams *pSwitchChanParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
    if(NULL == pWdaParams)
@@ -2760,18 +2420,13 @@
 #ifdef WLAN_FEATURE_VOWIFI
    pSwitchChanParams->txMgmtPower  =  wdiSwitchChanRsp->ucTxMgmtPower;
 #endif
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    pSwitchChanParams->status = 
                           CONVERT_WDI2SIR_STATUS(wdiSwitchChanRsp->wdiStatus) ;
-
    WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams , 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessChannelSwitchReq
  * Request to WDI to switch channel REQ params.
@@ -2784,10 +2439,8 @@
                          (WDI_SwitchChReqParamsType *)vos_mem_malloc(
                                          sizeof(WDI_SwitchChReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiSwitchChanParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2804,7 +2457,6 @@
       vos_mem_free(wdiSwitchChanParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiSwitchChanParam->wdiChInfo.ucChannel = pSwitchChanParams->channelNumber;
 #ifndef WLAN_FEATURE_VOWIFI
    wdiSwitchChanParam->wdiChInfo.ucLocalPowerConstraint = 
@@ -2813,13 +2465,11 @@
    wdiSwitchChanParam->wdiChInfo.wdiSecondaryChannelOffset = 
                                      pSwitchChanParams->secondaryChannelOffset;
    wdiSwitchChanParam->wdiReqStatusCB = NULL ;
-
    /* Store req pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pSwitchChanParams;
    pWdaParams->wdaWdiApiMsgParam = wdiSwitchChanParam;
-
 #ifdef WLAN_FEATURE_VOWIFI
    wdiSwitchChanParam->wdiChInfo.cMaxTxPower 
                                      = pSwitchChanParams->maxTxPower;
@@ -2833,7 +2483,6 @@
 
    status = WDI_SwitchChReq(wdiSwitchChanParam, 
                      (WDI_SwitchChRspCb)WDA_SwitchChannelReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -2843,10 +2492,8 @@
       pSwitchChanParams->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_ConfigBssReqCallback
  * config BSS Req Callback, called by WDI
@@ -2858,7 +2505,6 @@
    tWDA_CbContext *pWDA; 
    tAddBssParams *configBssReqParam;
    tAddStaParams *staConfigBssParam;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
    if(NULL == pWdaParams)
@@ -2871,15 +2517,12 @@
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    configBssReqParam = (tAddBssParams *)pWdaParams->wdaMsgParam;
    staConfigBssParam = &configBssReqParam->staContext ;
-
    configBssReqParam->status = 
                      CONVERT_WDI2SIR_STATUS(wdiConfigBssRsp->wdiStatus);
-
    if(WDI_STATUS_SUCCESS == wdiConfigBssRsp->wdiStatus)
    {
       vos_mem_copy(configBssReqParam->bssId, wdiConfigBssRsp->macBSSID, 
                                                     sizeof(tSirMacAddr));
-
       configBssReqParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
       configBssReqParam->bcastDpuSignature = wdiConfigBssRsp->ucBcastSig;
       configBssReqParam->mgmtDpuSignature = wdiConfigBssRsp->ucUcastSig;
@@ -2933,18 +2576,13 @@
       }
       
       staConfigBssParam->staIdx = wdiConfigBssRsp->ucSTAIdx;
-
       staConfigBssParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
-
       staConfigBssParam->ucUcastSig = wdiConfigBssRsp->ucUcastSig;
-
       staConfigBssParam->ucBcastSig = wdiConfigBssRsp->ucBcastSig;
-
       vos_mem_copy(staConfigBssParam->staMac, wdiConfigBssRsp->macSTA,
                                                     sizeof(tSirMacAddr));
       staConfigBssParam->txChannelWidthSet = 
                                configBssReqParam->txChannelWidthSet;
-
       if(staConfigBssParam->staType == STA_ENTRY_PEER && 
                                     staConfigBssParam->htCapable)
       {
@@ -2953,7 +2591,6 @@
          pWDA->wdaStaInfo[staConfigBssParam->staIdx].ucValidStaIndex = 
                                                          WDA_VALID_STA_INDEX ;
       }
-
       if(WDI_DS_SetStaIdxPerBssIdx(pWDA->pWdiContext,
                                    wdiConfigBssRsp->ucBSSIdx,
                                    wdiConfigBssRsp->ucSTAIdx))
@@ -2962,27 +2599,21 @@
                     "%s: fail to set STA idx associated with BSS index", __FUNCTION__);
          VOS_ASSERT(0) ;
       }
-
       if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigBssRsp->ucSTAIdx))
       {
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                     "%s: add BSS into mempool fail", __FUNCTION__);
          VOS_ASSERT(0) ;
       }
-
 #ifdef WLAN_FEATURE_VOWIFI
       configBssReqParam->txMgmtPower = wdiConfigBssRsp->ucTxMgmtPower;
 #endif
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam , 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_UpdateEdcaParamsForAC
  * Update WDI EDCA params with PE edca params
@@ -2998,7 +2629,6 @@
    wdiEdcaParam->wdiCW.max = macEdcaParam->cw.max;
    wdiEdcaParam->usTXOPLimit = macEdcaParam->txoplimit;
 }
-
 /*
  * FUNCTION: WDA_ProcessConfigBssReq
  * Configure BSS before starting Assoc with AP
@@ -3007,15 +2637,12 @@
                                          tAddBssParams* configBssReqParam)
 {
    WDI_Status status = WDI_STATUS_SUCCESS ;
-
    WDI_ConfigBSSReqParamsType *wdiConfigBssReqParam =
                              (WDI_ConfigBSSReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_ConfigBSSReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiConfigBssReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -3032,36 +2659,27 @@
       vos_mem_free(wdiConfigBssReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    vos_mem_set(wdiConfigBssReqParam, sizeof(WDI_ConfigBSSReqParamsType), 0);
-
    WDA_UpdateBSSParams(pWDA, &wdiConfigBssReqParam->wdiReqInfo, 
                        configBssReqParam) ;
-
    /* Store Init Req pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = configBssReqParam;
    pWdaParams->wdaWdiApiMsgParam = wdiConfigBssReqParam;
-
    status = WDI_ConfigBSSReq(wdiConfigBssReqParam, 
                         (WDI_ConfigBSSRspCb )WDA_ConfigBssReqCallback, pWdaParams) ;
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                    "Failure in Config BSS WDI API, free all the memory " );
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
-
       configBssReqParam->status = eSIR_FAILURE ;
-
       WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 #ifdef ENABLE_HAL_COMBINED_MESSAGES
 /*
  * FUNCTION: WDA_PostAssocReqCallback
@@ -3079,13 +2697,10 @@
    /*STA Params for self STA*/
    tAddStaParams *selfStaPostAssocParam = 
       &postAssocReqParam->addStaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    postAssocReqParam->status = 
                    CONVERT_WDI2SIR_STATUS(wdiPostAssocRsp->wdiStatus) ;
-
    if(WDI_STATUS_SUCCESS == wdiPostAssocRsp->wdiStatus)
    {
       staPostAssocParam->staIdx = wdiPostAssocRsp->bssParams.ucSTAIdx ;
@@ -3094,18 +2709,14 @@
       staPostAssocParam->ucUcastSig = wdiPostAssocRsp->bssParams.ucUcastSig ;
       staPostAssocParam->ucBcastSig = wdiPostAssocRsp->bssParams.ucBcastSig ;
       staPostAssocParam->bssIdx = wdiPostAssocRsp->bssParams.ucBSSIdx;
-
       selfStaPostAssocParam->staIdx = wdiPostAssocRsp->staParams.ucSTAIdx;
    }
    vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
    pWDA->wdaWdiApiMsgParam = NULL;
    pWDA->wdaMsgParam = NULL;
-
    WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessPostAssocReq
  * Trigger POST ASSOC processing in WDI
@@ -3113,7 +2724,6 @@
 VOS_STATUS WDA_ProcessPostAssocReq(tWDA_CbContext *pWDA, 
                                     tPostAssocParams *postAssocReqParam)
 {
-
    WDI_Status status = WDI_STATUS_SUCCESS ;
    
    WDI_PostAssocReqParamsType *wdiPostAssocReqParam =
@@ -3122,7 +2732,6 @@
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
 
-
    if(NULL == wdiPostAssocReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -3139,7 +2748,6 @@
       return VOS_STATUS_E_FAILURE;
    }
 
-
    /* update BSS params into WDI structure */
    WDA_UpdateBSSParams(pWDA, &wdiPostAssocReqParam->wdiBSSParams, 
                        &postAssocReqParam->addBssParams) ;
@@ -3161,16 +2769,12 @@
    WDA_UpdateEdcaParamsForAC(pWDA, 
                         &wdiPostAssocReqParam->wdiBSSParams.wdiVOEDCAParams,
                         &postAssocReqParam->addBssParams.acvo);
-
    /* Store Init Req pointer, as this will be used for response */
    pWDA->wdaMsgParam = (void *)postAssocReqParam ;
-
    /* store Params pass it to WDI */
    pWDA->wdaWdiApiMsgParam = (void *)wdiPostAssocReqParam ;
-
    status = WDI_PostAssocReq(wdiPostAssocReqParam, 
                         (WDI_PostAssocRspCb )WDA_PostAssocReqCallback, pWDA) ;
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -3178,16 +2782,12 @@
       vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
       pWDA->wdaWdiApiMsgParam = NULL;
       pWDA->wdaMsgParam = NULL;
-
       postAssocReqParam->status = eSIR_FAILURE ;
-
       WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
 #endif
-
 /*
  * FUNCTION: WDA_AddStaReqCallback
  * ADD STA req callback, send RSP back to PE
@@ -3198,10 +2798,8 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA; 
    tAddStaParams *addStaReqParam;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,"%s: pWdaParams is NULL", __FUNCTION__);
@@ -3210,10 +2808,8 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    addStaReqParam = (tAddStaParams *)pWdaParams->wdaMsgParam;
-
    addStaReqParam->status = 
                    CONVERT_WDI2SIR_STATUS(wdiConfigStaRsp->wdiStatus) ;
-
    if(WDI_STATUS_SUCCESS == wdiConfigStaRsp->wdiStatus)
    {
       addStaReqParam->staIdx = wdiConfigStaRsp->ucSTAIdx;
@@ -3239,15 +2835,11 @@
          return ;
       }
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    vos_mem_free(pWdaParams) ;
-
    WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ConfigStaReq
  * Trigger Config STA processing in WDI
@@ -3255,17 +2847,13 @@
 VOS_STATUS WDA_ProcessAddStaReq(tWDA_CbContext *pWDA, 
                                     tAddStaParams *addStaReqParam)
 {
-
    WDI_Status status = WDI_STATUS_SUCCESS ;
-
    WDI_ConfigSTAReqParamsType *wdiConfigStaReqParam =
                            (WDI_ConfigSTAReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_ConfigSTAReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiConfigStaReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -3282,37 +2870,28 @@
       vos_mem_free(wdiConfigStaReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    vos_mem_set(wdiConfigStaReqParam, sizeof(WDI_ConfigSTAReqParamsType), 0);
-
    /* update STA params into WDI structure */
    WDA_UpdateSTAParams(pWDA, &wdiConfigStaReqParam->wdiReqInfo, 
                        addStaReqParam) ;
-
    /* Store Init Req pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = addStaReqParam;
    pWdaParams->wdaWdiApiMsgParam = wdiConfigStaReqParam;
-
    status = WDI_ConfigSTAReq(wdiConfigStaReqParam, 
                         (WDI_ConfigSTARspCb )WDA_AddStaReqCallback, pWdaParams) ;
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                    "Failure in Config STA WDI API, free all the memory " );
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
-
       addStaReqParam->status = eSIR_FAILURE ;
-
       WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_DelBSSReqCallback
  * Dens DEL BSS RSP back to PE
@@ -3324,10 +2903,8 @@
    tWDA_CbContext *pWDA; 
    tDeleteBssParams *delBssReqParam;
    tANI_U8  staIdx,tid;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -3337,39 +2914,32 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    delBssReqParam = (tDeleteBssParams *)pWdaParams->wdaMsgParam;
-
    delBssReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelBssRsp->wdiStatus) ;
-
    if(WDI_STATUS_SUCCESS == wdiDelBssRsp->wdiStatus)
    {
       vos_mem_copy(delBssReqParam->bssid, wdiDelBssRsp->macBSSID, 
                                              sizeof(tSirMacAddr)) ;
    }
-
    if(WDI_DS_GetStaIdxFromBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, &staIdx))
    {
      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                  "%s: Get STA index from BSS index Fail", __FUNCTION__);
      VOS_ASSERT(0) ;
    }
-
    if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, staIdx))
    {
      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                  "%s: DEL STA from MemPool Fail", __FUNCTION__);
      VOS_ASSERT(0) ;
    }
-
    if(WDI_DS_ClearStaIdxPerBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, staIdx))
    {
      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                  "%s: Clear STA index form table Fail", __FUNCTION__);
      VOS_ASSERT(0) ;
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    /* reset the the system role*/
    pWDA->wdaGlobalSystemRole = eSYSTEM_UNKNOWN_ROLE;
    
@@ -3387,13 +2957,10 @@
          }
       }
    }
-
    WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssReqParam , 0) ;
-
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessDelBssReq
  * Init DEL BSS req with WDI
@@ -3402,15 +2969,12 @@
                                         tDeleteBssParams *delBssParam)
 {
    WDI_Status status = WDI_STATUS_SUCCESS ;
-
    WDI_DelBSSReqParamsType *wdiDelBssReqParam = 
                              (WDI_DelBSSReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_DelBSSReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiDelBssReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -3427,7 +2991,6 @@
       vos_mem_free(wdiDelBssReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiDelBssReqParam->ucBssIdx = delBssParam->bssIdx;
    wdiDelBssReqParam->wdiReqStatusCB = NULL ;
    
@@ -3436,10 +2999,8 @@
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = delBssParam;
    pWdaParams->wdaWdiApiMsgParam = wdiDelBssReqParam;
-
    status = WDI_DelBSSReq(wdiDelBssReqParam, 
                         (WDI_DelBSSRspCb )WDA_DelBSSReqCallback, pWdaParams) ;
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -3449,10 +3010,8 @@
       delBssParam->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssParam, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_DelSTAReqCallback
  * Dens DEL STA RSP back to PE
@@ -3463,10 +3022,8 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA; 
    tDeleteStaParams *delStaReqParam;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -3476,9 +3033,7 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    delStaReqParam = (tDeleteStaParams *)pWdaParams->wdaMsgParam;
-
    delStaReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelStaRsp->wdiStatus) ;
-
    if(WDI_STATUS_SUCCESS == wdiDelStaRsp->wdiStatus)
    {
       if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, wdiDelStaRsp->ucSTAIdx))
@@ -3491,17 +3046,14 @@
    }
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    /*Reset the BA information corresponding to this STAIdx */
    pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucValidStaIndex = 
                                                       WDA_INVALID_STA_INDEX;
    pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucUseBaBitmap = 0;
    
    WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaReqParam , 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessDelStaReq
  * Init DEL STA req with WDI
@@ -3510,15 +3062,12 @@
                                       tDeleteStaParams *delStaParam)
 {
    WDI_Status status = WDI_STATUS_SUCCESS ;
-
    WDI_DelSTAReqParamsType *wdiDelStaReqParam = 
                              (WDI_DelSTAReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_DelSTAReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiDelStaReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -3535,19 +3084,15 @@
       vos_mem_free(wdiDelStaReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiDelStaReqParam->ucSTAIdx = delStaParam->staIdx ;
    wdiDelStaReqParam->wdiReqStatusCB = NULL ;
-
    /* Store Init Req pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = delStaParam;
    pWdaParams->wdaWdiApiMsgParam = wdiDelStaReqParam;
-
    status = WDI_DelSTAReq(wdiDelStaReqParam, 
                         (WDI_DelSTARspCb )WDA_DelSTAReqCallback, pWdaParams) ;
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -3558,10 +3103,8 @@
       delStaParam->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaParam, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 void WDA_ProcessAddStaSelfRsp(WDI_AddSTASelfRspParamsType* pwdiAddSTASelfRsp, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
@@ -3578,20 +3121,15 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    pAddStaSelfRsp = (tAddStaSelfParams*)pWdaParams->wdaMsgParam;
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams);
-
    pAddStaSelfRsp->status = CONVERT_WDI2SIR_STATUS(pwdiAddSTASelfRsp->wdiStatus);
    vos_mem_copy(pAddStaSelfRsp->selfMacAddr, 
                 pwdiAddSTASelfRsp->macSelfSta, 
                 sizeof(pAddStaSelfRsp->selfMacAddr));
-
    WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfRsp, 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessAddStaSelfReq
  * 
@@ -3604,7 +3142,6 @@
       (WDI_AddSTASelfReqParamsType *)vos_mem_malloc(
          sizeof(WDI_AddSTASelfReqParamsType)) ;
    tWDA_ReqParams *pWdaParams; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
    if( NULL == wdiAddStaSelfReq )
@@ -3614,9 +3151,7 @@
                                           "%s: Unable to allocate memory " ,__FUNCTION__);
       return( VOS_STATUS_E_NOMEM );
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
-
    if( NULL == pWdaParams )
    {
       VOS_ASSERT( 0 );
@@ -3625,16 +3160,13 @@
       vos_mem_free(wdiAddStaSelfReq) ;
       return( VOS_STATUS_E_NOMEM );
    }
-
    wdiAddStaSelfReq->wdiReqStatusCB = NULL;
-
    vos_mem_copy( wdiAddStaSelfReq->wdiAddSTASelfInfo.selfMacAddr, pAddStaSelfReq->selfMacAddr, 6);
    /* Store Init Req pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pAddStaSelfReq;
    pWdaParams->wdaWdiApiMsgParam = wdiAddStaSelfReq; 
-
    wstatus = WDI_AddSTASelfReq( wdiAddStaSelfReq, WDA_ProcessAddStaSelfRsp, pWdaParams);
 
    if(IS_WDI_STATUS_FAILURE(wstatus))
@@ -3648,10 +3180,8 @@
       pAddStaSelfReq->status = eSIR_FAILURE ;
       WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfReq, 0) ;
    }
-
    return status;
 }
-
 /*
  * FUNCTION: WDA_DelSTASelfRespCallback
  * 
@@ -3662,10 +3192,8 @@
    tWDA_ReqParams        *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext        *pWDA; 
    tDelStaSelfParams     *delStaSelfParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if (NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -3673,10 +3201,8 @@
       VOS_ASSERT(0);
       return;
    }
-
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam;
-
    delStaSelfParams->status = 
                CONVERT_WDI2SIR_STATUS(wdiDelStaSelfRspParams->wdiStatus) ;
    
@@ -3684,10 +3210,8 @@
    vos_mem_free(pWdaParams) ;
    
    WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_DelSTASelfReqCallback
  * 
@@ -3741,7 +3265,6 @@
                 (WDI_DelSTASelfReqParamsType *)vos_mem_malloc(
                               sizeof(WDI_DelSTASelfReqParamsType)) ;
 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
    if( NULL == wdiDelStaSelfReq )
@@ -3761,13 +3284,11 @@
       vos_mem_free(wdiDelStaSelfReq) ;
       return( VOS_STATUS_E_NOMEM );
    }
-
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pDelStaSelfReqParam;
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelStaSelfReq;
-
    vos_mem_copy( wdiDelStaSelfReq->wdiDelStaSelfInfo.selfMacAddr, 
                  pDelStaSelfReqParam->selfMacAddr, sizeof(tSirMacAddr));
    
@@ -3788,12 +3309,9 @@
       pDelStaSelfReqParam->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)pDelStaSelfReqParam, 0) ;
    }
-
    return status;
 }
 
-
-
 /*
  * FUNCTION: WDA_SendMsg
  * Send Message back to PE
@@ -3804,13 +3322,10 @@
    tSirMsgQ msg = {0} ;
    tANI_U32 status = VOS_STATUS_SUCCESS ;
    tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
-
    msg.type        = msgType;
    msg.bodyval     = bodyVal;
    msg.bodyptr     = pBodyptr;
-
    status = limPostMsgApi(pMac, &msg);
-
    if (VOS_STATUS_SUCCESS != status)
    {
       if(NULL != pBodyptr)
@@ -3821,10 +3336,8 @@
                       "%s: limPostMsgApi is failed " ,__FUNCTION__);
       VOS_ASSERT(0) ;
    }
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_UpdateBSSParams
  * Translated WDA/PE BSS info into WDI BSS info..
@@ -3834,7 +3347,6 @@
                          tAddBssParams *wdaBssParams)
 {
    v_U8_t keyIndex = 0;
-
    /* copy bssReq Params to WDI structure */
    vos_mem_copy(wdiBssParams->macBSSID,
                            wdaBssParams->bssId, sizeof(tSirMacAddr)) ;
@@ -3843,10 +3355,8 @@
    wdiBssParams->wdiBSSType = wdaBssParams->bssType ;
    wdiBssParams->ucOperMode = wdaBssParams->operMode ;
    wdiBssParams->wdiNWType   = wdaBssParams->nwType ;
-
    wdiBssParams->ucShortSlotTimeSupported = 
                                   wdaBssParams->shortSlotTimeSupported ;
-
    wdiBssParams->ucllaCoexist  = wdaBssParams->llaCoexist ;
    wdiBssParams->ucllbCoexist  = wdaBssParams->llbCoexist ;
    wdiBssParams->ucllgCoexist  = wdaBssParams->llgCoexist ;
@@ -3856,12 +3366,9 @@
    wdiBssParams->ucllnNonGFCoexist = wdaBssParams->llnNonGFCoexist ;
    wdiBssParams->ucTXOPProtectionFullSupport =
                            wdaBssParams->fLsigTXOPProtectionFullSupport ;
-
    wdiBssParams->ucRIFSMode = wdaBssParams->fRIFSMode ;
    wdiBssParams->usBeaconInterval = wdaBssParams->beaconInterval ;
-
    wdiBssParams->ucDTIMPeriod = wdaBssParams->dtimPeriod ;
-
    wdiBssParams->ucTXChannelWidthSet = wdaBssParams->txChannelWidthSet ;
    wdiBssParams->ucCurrentOperChannel = wdaBssParams->currentOperChannel ;
    wdiBssParams->ucCurrentExtChannel = wdaBssParams->currentExtChannel ;
@@ -3871,23 +3378,16 @@
    wdiBssParams->wdiSSID.ucLength = wdaBssParams->ssId.length ;
    vos_mem_copy(wdiBssParams->wdiSSID.sSSID,
                  wdaBssParams->ssId.ssId, wdaBssParams->ssId.length) ;
-
    WDA_UpdateSTAParams(pWDA, &wdiBssParams->wdiSTAContext, 
                        &wdaBssParams->staContext) ;
-
    wdiBssParams->wdiAction = wdaBssParams->updateBss;
-
 #ifdef WLAN_FEATURE_VOWIFI
    wdiBssParams->cMaxTxPower = wdaBssParams->maxTxPower;
 #endif
-
    wdiBssParams->ucPersona = wdaBssParams->halPersona;
-
    wdiBssParams->bSpectrumMgtEn = wdaBssParams->bSpectrumMgtEnabled;
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
    wdiBssParams->bExtSetStaKeyParamValid = wdaBssParams->extSetStaKeyParamValid;
-
    if(wdiBssParams->bExtSetStaKeyParamValid)
    {
       /* copy set STA key params to WDI structure */
@@ -3899,7 +3399,6 @@
          wdaBssParams->extSetStaKeyParam.wepType;
       wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx = 
          wdaBssParams->extSetStaKeyParam.defWEPIdx;
-
       if(wdaBssParams->extSetStaKeyParam.encType != eSIR_ED_NONE)
       {
          if( (wdiBssParams->wdiExtSetKeyParam.wdiWEPType == WDI_WEP_STATIC) && 
@@ -3923,7 +3422,6 @@
                   wdaBssParams->extSetStaKeyParam.key[keyIndex].unicast;
                wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyDirection =
                   wdaBssParams->extSetStaKeyParam.key[keyIndex].keyDirection;
-
                vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyRsc, 
                             wdaBssParams->extSetStaKeyParam.key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
                wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].paeRole =
@@ -3933,7 +3431,6 @@
                vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].key, 
                             wdaBssParams->extSetStaKeyParam.key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
             }
-
             wdiBssParams->wdiExtSetKeyParam.ucNumKeys = 
                SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
 #else
@@ -3964,10 +3461,13 @@
                     sizeof(wdaBssParams->extSetStaKeyParam) );
    }
 #endif /*WLAN_FEATURE_VOWIFI_11R*/
+#ifdef WLAN_FEATURE_11AC
+   wdiBssParams->ucVhtCapableSta = wdaBssParams->vhtCapable;
+   wdiBssParams->ucVhtTxChannelWidthSet = wdaBssParams->vhtTxChannelWidthSet;
+#endif
 
    return ;
 }
-
 /*
  * FUNCTION: WDA_UpdateSTAParams
  * Translated WDA/PE BSS info into WDI BSS info..
@@ -4001,10 +3501,8 @@
    
    wdiStaParams->ucShortGI40Mhz = wdaStaParams->fShortGI40Mhz;
    wdiStaParams->ucShortGI20Mhz = wdaStaParams->fShortGI20Mhz;
-
    wdiStaParams->wdiSupportedRates.opRateMode = 
                                 wdaStaParams->supportedRates.opRateMode;
-
    for(i = 0;i < WDI_NUM_11B_RATES;i++)
    {
      wdiStaParams->wdiSupportedRates.llbRates[i] = 
@@ -4022,6 +3520,12 @@
    }
    wdiStaParams->wdiSupportedRates.uEnhancedRateBitmap = 
                             wdaStaParams->supportedRates.aniEnhancedRateBitmap;
+#ifdef WLAN_FEATURE_11AC
+   wdiStaParams->wdiSupportedRates.vhtRxMCSMap = wdaStaParams->supportedRates.vhtRxMCSMap;
+   wdiStaParams->wdiSupportedRates.vhtRxHighestDataRate = wdaStaParams->supportedRates.vhtRxHighestDataRate;
+   wdiStaParams->wdiSupportedRates.vhtTxMCSMap = wdaStaParams->supportedRates.vhtTxMCSMap;
+   wdiStaParams->wdiSupportedRates.vhtTxHighestDataRate = wdaStaParams->supportedRates.vhtTxHighestDataRate;
+#endif
    for(i = 0;i <SIR_MAC_MAX_SUPPORTED_MCS_SET;i++)
    {
      wdiStaParams->wdiSupportedRates.aSupportedMCSSet[i] = 
@@ -4045,9 +3549,12 @@
 #ifdef WLAN_FEATURE_P2P
    wdiStaParams->ucP2pCapableSta = wdaStaParams->p2pCapableSta;
 #endif
+#ifdef WLAN_FEATURE_11AC
+   wdiStaParams->ucVhtCapableSta = wdaStaParams->vhtCapable;
+   wdiStaParams->ucVhtTxChannelWidthSet = wdaStaParams->vhtTxChannelWidthSet;
+#endif
    return ;
 }
-
 /*
  * -------------------------------------------------------------------------
  * CFG update to WDI
@@ -4058,7 +3565,7 @@
  * FUNCTION: WDA_ConvertWniCfgIdToHALCfgId
  * Convert the WNI CFG ID to HAL CFG ID
  */ 
-static inline v_U8_t WDA_ConvertWniCfgIdToHALCfgId(v_U8_t wniCfgId)
+static inline v_U8_t WDA_ConvertWniCfgIdToHALCfgId(v_U32_t wniCfgId)
 {
    switch(wniCfgId)
    {
@@ -4167,7 +3674,6 @@
       }
    }
 }
-
 /*
  * FUNCTION: WDA_UpdateCfgCallback
  * 
@@ -4177,10 +3683,8 @@
    tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; 
    WDI_UpdateCfgReqParamsType *wdiCfgParam = 
                   (WDI_UpdateCfgReqParamsType *)pWDA->wdaWdiCfgApiMsgParam ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    /*
     * currently there is no response message is expected between PE and
     * WDA, Failure return from WDI is a ASSERT condition
@@ -4195,10 +3699,8 @@
    vos_mem_free(wdiCfgParam->pConfigBuffer) ;
    vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
    pWDA->wdaWdiCfgApiMsgParam = NULL;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_UpdateCfg
  * 
@@ -4212,17 +3714,14 @@
    tHalCfg *configData;
    WDI_UpdateCfgReqParamsType *wdiCfgReqParam = NULL ;
    tANI_U8        *configDataValue;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if (NULL == pMac )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                  "%s: Invoked with invalid MAC context ", __FUNCTION__ );
       return VOS_STATUS_E_FAILURE;
    }
-
    if(WDA_START_STATE != pWDA->wdaState)
    {
       return VOS_STATUS_E_FAILURE;
@@ -4238,7 +3737,6 @@
    
    wdiCfgReqParam = (WDI_UpdateCfgReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_UpdateCfgReqParamsType)) ;
-
    if(NULL == wdiCfgReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4246,10 +3744,8 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiCfgReqParam->pConfigBuffer =  vos_mem_malloc(sizeof(tHalCfg) + 
                                                             sizeof(tANI_U32)) ;
-
    if(NULL == wdiCfgReqParam->pConfigBuffer)
    {
       VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4273,7 +3769,6 @@
        vos_mem_free(wdiCfgReqParam);
        return eSIR_FAILURE;
    }
-
    ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->length = sizeof(tANI_U32);
    configData =((tHalCfg *)wdiCfgReqParam->pConfigBuffer) ;
    configDataValue = ((tANI_U8 *)configData + sizeof(tHalCfg));
@@ -4282,11 +3777,9 @@
    
    /* store Params pass it to WDI */
    pWDA->wdaWdiCfgApiMsgParam = (void *)wdiCfgReqParam ;
-
 #ifdef FEATURE_HAL_SUPPORT_DYNAMIC_UPDATE_CFG
    status = WDI_UpdateCfgReq(wdiCfgReqParam, 
                    (WDI_UpdateCfgRspCb )WDA_UpdateCfgCallback, pWDA) ;
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4305,7 +3798,6 @@
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
 
-
 VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA, 
                                                       v_U8_t *pDefaultKeyId,
                                                       v_U8_t *pNumKeys,
@@ -4315,14 +3807,12 @@
    v_U32_t val = SIR_MAC_KEY_LENGTH;
    VOS_STATUS status = WDI_STATUS_SUCCESS;
    tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
-
    if (NULL == pMac )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                  "%s: Invoked with invalid MAC context ", __FUNCTION__ );
       return VOS_STATUS_E_FAILURE;
    }
-
    if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_WEP_DEFAULT_KEYID,
                                                                     &defKeyId ))
    {
@@ -4331,7 +3821,6 @@
    }
    
   *pDefaultKeyId = (v_U8_t)defKeyId;
-
    /* Need to extract ALL of the configured WEP Keys */
    for( i = 0, j = 0; i < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; i++ )
    {
@@ -4360,15 +3849,12 @@
          pWdiKeys[j].paeRole = 0;
          /* Determined from wlan_cfgGetStr() above.*/
          pWdiKeys[j].keyLength = (tANI_U16) val;
-
          j++;
          *pNumKeys = (tANI_U8) j;
       }
    }
-
    return status;
 }
-
 /*
  * FUNCTION: WDA_SetBssKeyReqCallback
  * send SET BSS key RSP back to PE
@@ -4378,7 +3864,6 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA; 
    tSetBssKeyParams *setBssKeyParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
    if(NULL == pWdaParams)
@@ -4390,16 +3875,12 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    setBssKeyParams = (tSetBssKeyParams *)pWdaParams->wdaMsgParam;
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
    setBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams , 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessSetBssKeyReq
  * Request to WDI for programming the BSS key( key for 
@@ -4413,12 +3894,9 @@
                   (WDI_SetBSSKeyReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_SetBSSKeyReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    v_U8_t keyIndex;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiSetBssKeyParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4435,14 +3913,11 @@
       vos_mem_free(wdiSetBssKeyParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    vos_mem_zero(wdiSetBssKeyParam, sizeof(WDI_SetBSSKeyReqParamsType));
-
    /* copy set BSS params to WDI structure */
    wdiSetBssKeyParam->wdiBSSKeyInfo.ucBssIdx = setBssKeyParams->bssIdx;
    wdiSetBssKeyParam->wdiBSSKeyInfo.wdiEncType = setBssKeyParams->encType;
    wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys = setBssKeyParams->numKeys;
-
    if(setBssKeyParams->encType != eSIR_ED_NONE)
    {
       if( setBssKeyParams->numKeys == 0 && 
@@ -4450,7 +3925,6 @@
                                 setBssKeyParams->encType == eSIR_ED_WEP104))
       {
          tANI_U8 defaultKeyId = 0;
-
          WDA_GetWepKeysFromCfg( pWDA, &defaultKeyId, 
             &wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys,
             wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys );
@@ -4477,17 +3951,14 @@
          }
       }
    }
-
    wdiSetBssKeyParam->wdiBSSKeyInfo.ucSingleTidRc = 
                                       setBssKeyParams->singleTidRc;
    wdiSetBssKeyParam->wdiReqStatusCB = NULL ;
-
    /* Store set key pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = setBssKeyParams;
    pWdaParams->wdaWdiApiMsgParam = wdiSetBssKeyParam;
-
    status = WDI_SetBSSKeyReq(wdiSetBssKeyParam, 
                            (WDI_SetBSSKeyRspCb)WDA_SetBssKeyReqCallback ,pWdaParams);
    
@@ -4500,10 +3971,8 @@
       setBssKeyParams->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_RemoveBssKeyReqCallback
  * send SET BSS key RSP back to PE
@@ -4513,10 +3982,8 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA; 
    tRemoveBssKeyParams *removeBssKeyParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4526,17 +3993,13 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    removeBssKeyParams = (tRemoveBssKeyParams *)pWdaParams->wdaMsgParam;
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
    
    removeBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams , 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessRemoveBssKeyReq
  * Request to WDI to remove the BSS key( key for broadcast/multicast 
@@ -4550,10 +4013,8 @@
                   (WDI_RemoveBSSKeyReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_RemoveBSSKeyReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiRemoveBssKeyParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4570,23 +4031,19 @@
       vos_mem_free(wdiRemoveBssKeyParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    /* copy Remove BSS key params to WDI structure*/
    wdiRemoveBssKeyParam->wdiKeyInfo.ucBssIdx = removeBssKeyParams->bssIdx;
    wdiRemoveBssKeyParam->wdiKeyInfo.wdiEncType = removeBssKeyParams->encType;
    wdiRemoveBssKeyParam->wdiKeyInfo.ucKeyId = removeBssKeyParams->keyId;
    wdiRemoveBssKeyParam->wdiKeyInfo.wdiWEPType = removeBssKeyParams->wepType;
    wdiRemoveBssKeyParam->wdiReqStatusCB = NULL ;
-
    /* Store remove key pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = removeBssKeyParams;
    pWdaParams->wdaWdiApiMsgParam = wdiRemoveBssKeyParam;
-
    status = WDI_RemoveBSSKeyReq(wdiRemoveBssKeyParam, 
                      (WDI_RemoveBSSKeyRspCb)WDA_RemoveBssKeyReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4596,10 +4053,8 @@
       removeBssKeyParams->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_SetBssKeyReqCallback
  * send SET BSS key RSP back to PE
@@ -4609,7 +4064,6 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA; 
    tSetStaKeyParams *setStaKeyParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
    if(NULL == pWdaParams)
@@ -4621,17 +4075,12 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams , 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessSetStaKeyReq
  * Request to WDI for programming the STA key( key for Unicast frames 
@@ -4645,12 +4094,9 @@
                   (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_SetSTAKeyReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    v_U8_t keyIndex;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiSetStaKeyParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4667,17 +4113,13 @@
       vos_mem_free(wdiSetStaKeyParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
-
    vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
-
    /* copy set STA key params to WDI structure */
    wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
    wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
    wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
    wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
-
    if(setStaKeyParams->encType != eSIR_ED_NONE)
    {
       if( (wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType == WDI_WEP_STATIC) && 
@@ -4701,7 +4143,6 @@
                                   setStaKeyParams->key[keyIndex].unicast;
             wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
                                   setStaKeyParams->key[keyIndex].keyDirection;
-
             vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc, 
                   setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
             wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
@@ -4716,7 +4157,6 @@
                 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = keyIndex;
             }
          }
-
          wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 
                                           SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
 #else
@@ -4741,16 +4181,13 @@
    }
    wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
    wdiSetStaKeyParam->wdiReqStatusCB = NULL ;
-
    /* Store set key pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = setStaKeyParams;
    pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
-
    status = WDI_SetSTAKeyReq(wdiSetStaKeyParam, 
                           (WDI_SetSTAKeyRspCb)WDA_SetStaKeyReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4760,10 +4197,8 @@
       setStaKeyParams->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_SetBcastStaKeyReqCallback
  * send SET Bcast STA key RSP back to PE
@@ -4773,10 +4208,8 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA; 
    tSetStaKeyParams *setStaKeyParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4786,18 +4219,13 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams , 0) ;
-
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessSetBcastStaKeyReq
  * Request to WDI for programming the Bcast STA key( key for Broadcast frames 
@@ -4811,12 +4239,9 @@
                   (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_SetSTAKeyReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    v_U8_t keyIndex;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiSetStaKeyParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4833,17 +4258,13 @@
       vos_mem_free(wdiSetStaKeyParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
-
    vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
-
    /* copy set STA key params to WDI structure */
    wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
    wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
    wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
    wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
-
    if(setStaKeyParams->encType != eSIR_ED_NONE)
    {
 #ifdef WLAN_SOFTAP_FEATURE
@@ -4856,7 +4277,6 @@
                                setStaKeyParams->key[keyIndex].unicast;
          wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
                                setStaKeyParams->key[keyIndex].keyDirection;
-
          vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc, 
                setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
          wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
@@ -4866,7 +4286,6 @@
          vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key, 
                setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
       }
-
       wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 
                                        SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
 #else
@@ -4889,16 +4308,13 @@
 #endif
    }
    wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
-
    /* Store set key pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = setStaKeyParams;
    pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
-
    status = WDI_SetSTABcastKeyReq(wdiSetStaKeyParam, 
                           (WDI_SetSTAKeyRspCb)WDA_SetBcastStaKeyReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4908,10 +4324,8 @@
       setStaKeyParams->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_RemoveStaKeyReqCallback
  * send SET BSS key RSP back to PE
@@ -4921,10 +4335,8 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA; 
    tRemoveStaKeyParams *removeStaKeyParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4934,18 +4346,13 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    removeStaKeyParams = (tRemoveStaKeyParams *)pWdaParams->wdaMsgParam;
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    removeStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams , 0) ;
-
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessRemoveStaKeyReq
  * Request to WDI to remove the STA key( key for Unicast frames Encryption)
@@ -4958,10 +4365,8 @@
                   (WDI_RemoveSTAKeyReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_RemoveSTAKeyReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiRemoveStaKeyParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -4978,23 +4383,19 @@
       vos_mem_free(wdiRemoveStaKeyParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    /* copy remove STA key params to WDI structure*/
    wdiRemoveStaKeyParam->wdiKeyInfo.ucSTAIdx = removeStaKeyParams->staIdx;
    wdiRemoveStaKeyParam->wdiKeyInfo.wdiEncType = removeStaKeyParams->encType;
    wdiRemoveStaKeyParam->wdiKeyInfo.ucKeyId = removeStaKeyParams->keyId;
    wdiRemoveStaKeyParam->wdiKeyInfo.ucUnicast = removeStaKeyParams->unicast;
    wdiRemoveStaKeyParam->wdiReqStatusCB = NULL ;
-
    /* Store remove key pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = removeStaKeyParams;
    pWdaParams->wdaWdiApiMsgParam = wdiRemoveStaKeyParam;
-
    status = WDI_RemoveSTAKeyReq(wdiRemoveStaKeyParam, 
                      (WDI_RemoveSTAKeyRspCb)WDA_RemoveStaKeyReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5004,21 +4405,17 @@
       removeStaKeyParams->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_IsHandleSetLinkStateReq
  * Update the WDA state and return the status to handle this message or not
  */ 
-
 WDA_processSetLinkStateStatus WDA_IsHandleSetLinkStateReq(
                                           tWDA_CbContext *pWDA,
                                           tLinkStateParams *linkStateParams)
 {
    WDA_processSetLinkStateStatus status = WDA_PROCESS_SET_LINK_STATE;
-
    switch(linkStateParams->state)
    {
       case eSIR_LINK_PREASSOC_STATE:
@@ -5030,7 +4427,6 @@
          */
          vos_mem_copy(pWDA->macBSSID,linkStateParams->bssid, 
                                                    sizeof(tSirMacAddr));
-
          vos_mem_copy(pWDA->macSTASelf,linkStateParams->selfMacAddr, 
                                                    sizeof(tSirMacAddr));
          /* UMAC is issuing the setlink state with PREASSOC twice (before set 
@@ -5050,7 +4446,6 @@
          pWDA->linkState = linkStateParams->state;
          status = WDA_IGNORE_SET_LINK_STATE;
          break;
-
       default:
          if(pWDA->wdaState != WDA_READY_STATE)
          {
@@ -5063,7 +4458,6 @@
    
    return status;
 }
-
 /*
  * FUNCTION: WDA_SetLinkStateCallback
  * call back function for set link state from WDI
@@ -5073,7 +4467,6 @@
    tWDA_CbContext *pWDA;
    tLinkStateParams *linkStateParams;
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
    if(NULL == pWdaParams)
@@ -5083,11 +4476,8 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
-
    linkStateParams = (tLinkStateParams *)pWdaParams->wdaMsgParam ;
-
    /*
     * In STA mode start the BA activity check timer after association
     * and in AP mode start BA activity check timer after BSS start */
@@ -5097,9 +4487,7 @@
    {
       WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
    }
-
    WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams , 0) ;
-
    /* 
     * No respone required for WDA_SET_LINK_STATE so free the request 
     * param here
@@ -5114,7 +4502,6 @@
    }
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessSetLinkState
  * Request to WDI to set the link status.
@@ -5135,12 +4522,12 @@
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                            "%s:pMac is NULL", __FUNCTION__);
       VOS_ASSERT(0);
+	  vos_mem_free(wdiSetLinkStateParam);
       return VOS_STATUS_E_FAILURE;
    }
 
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiSetLinkStateParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5157,7 +4544,6 @@
       vos_mem_free(wdiSetLinkStateParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    if(WDA_IGNORE_SET_LINK_STATE == 
                   WDA_IsHandleSetLinkStateReq(pWDA,linkStateParams))
    {
@@ -5167,17 +4553,13 @@
    {
       vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macBSSID, 
                                   linkStateParams->bssid, sizeof(tSirMacAddr));
-
       vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macSelfStaMacAddr, 
                                   linkStateParams->selfMacAddr, sizeof(tSirMacAddr));
-
       wdiSetLinkStateParam->wdiLinkInfo.wdiLinkState = linkStateParams->state;
       wdiSetLinkStateParam->wdiReqStatusCB = NULL ;
-
       pWdaParams->pWdaContext = pWDA;
       /* Store remove key pointer, as this will be used for response */
       pWdaParams->wdaMsgParam = (void *)linkStateParams ;
-
       /* store Params pass it to WDI */
       pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetLinkStateParam ;
       /* Stop Timer only other than GO role and concurrent session */
@@ -5187,27 +4569,22 @@
       {
          WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
       }
-
       status = WDI_SetLinkStateReq(wdiSetLinkStateParam, 
                         (WDI_SetLinkStateRspCb)WDA_SetLinkStateCallback, pWdaParams);
-
       if(IS_WDI_STATUS_FAILURE(status))
       {
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
              "Failure in set link state Req WDI API, free all the memory " );
       }
    }
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       vos_mem_free(wdiSetLinkStateParam) ;
-      vos_mem_free(linkStateParams);
+      WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams, 0);
       vos_mem_free(pWdaParams);
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_GetStatsReqParamsCallback
  * send the response to PE with Stats received from WDI
@@ -5221,7 +4598,6 @@
 
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    pGetPEStatsRspParams = 
        (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp) +
        (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType)));
@@ -5233,7 +4609,6 @@
       VOS_ASSERT(0);
       return;
    }
-
    vos_mem_set(pGetPEStatsRspParams, wdiGetStatsRsp->usMsgLen, 0);
    pGetPEStatsRspParams->msgType = wdiGetStatsRsp->usMsgType;
    pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp) + 
@@ -5246,18 +4621,15 @@
                       CONVERT_WDI2VOS_STATUS(wdiGetStatsRsp->wdiStatus);
    pGetPEStatsRspParams->staId   = wdiGetStatsRsp->ucSTAIdx;
    pGetPEStatsRspParams->statsMask = wdiGetStatsRsp->uStatsMask;
-
    vos_mem_copy( pGetPEStatsRspParams + 1,
                   wdiGetStatsRsp + 1,
                   wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
-
   /* send response to UMAC*/
    WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, pGetPEStatsRspParams , 0) ;
    
    return;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessGetStatsReq
  * Request to WDI to get the statistics
@@ -5268,20 +4640,15 @@
    WDI_Status status = WDI_STATUS_SUCCESS ;
    WDI_GetStatsReqParamsType wdiGetStatsParam;
    tAniGetPEStatsRsp *pGetPEStatsRspParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    wdiGetStatsParam.wdiGetStatsParamsInfo.ucSTAIdx = 
                                           pGetStatsParams->staId;
    wdiGetStatsParam.wdiGetStatsParamsInfo.uStatsMask = 
                                           pGetStatsParams->statsMask;
-
    wdiGetStatsParam.wdiReqStatusCB = NULL ;
-
    status = WDI_GetStatsReq(&wdiGetStatsParam, 
        (WDI_GetStatsRspCb)WDA_GetStatsReqParamsCallback, pWDA);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5293,9 +4660,9 @@
           VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                            "%s: VOS MEM Alloc Failure", __FUNCTION__); 
           VOS_ASSERT(0);
+		  vos_mem_free(pGetStatsParams);
           return VOS_STATUS_E_NOMEM;
       }
-
       pGetPEStatsRspParams->msgType = WDA_GET_STATISTICS_RSP;
       pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp);
       pGetPEStatsRspParams->staId = pGetStatsParams->staId;
@@ -5303,12 +4670,10 @@
       WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, 
                                  (void *)pGetPEStatsRspParams, 0) ;
    }
-
    /* Free the request message */
    vos_mem_free(pGetStatsParams);
    return CONVERT_WDI2VOS_STATUS(status);
 }
-
 /*
  * FUNCTION: WDA_UpdateEDCAParamCallback
  * call back function for Update EDCA params from WDI
@@ -5320,7 +4685,6 @@
    
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5329,14 +4693,11 @@
       return ;
    }
    pEdcaParams = (tEdcaParams *)pWdaParams->wdaMsgParam ;
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    vos_mem_free(pWdaParams);
    vos_mem_free(pEdcaParams);
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessUpdateEDCAParamReq
  * Request to WDI to Update the EDCA params.
@@ -5349,15 +4710,14 @@
                      (WDI_UpdateEDCAParamsType *)vos_mem_malloc(
                                              sizeof(WDI_UpdateEDCAParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiEdcaParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                            "%s: VOS MEM Alloc Failure", __FUNCTION__); 
       VOS_ASSERT(0);
+	  vos_mem_free(pEdcaParams);
       return VOS_STATUS_E_NOMEM;
    }
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
@@ -5367,9 +4727,9 @@
                            "%s: VOS MEM Alloc Failure", __FUNCTION__); 
       VOS_ASSERT(0);
       vos_mem_free(wdiEdcaParam);
+	  vos_mem_free(pEdcaParams);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiEdcaParam->wdiEDCAInfo.ucBssIdx = pEdcaParams->bssIdx;
    wdiEdcaParam->wdiEDCAInfo.ucEDCAParamsValid = pEdcaParams->highPerformance;
    WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBEInfo,
@@ -5381,17 +4741,13 @@
    WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVOInfo,
                                                            &pEdcaParams->acvo);
    wdiEdcaParam->wdiReqStatusCB = NULL ;
-
    pWdaParams->pWdaContext = pWDA;
    /* Store remove key pointer, as this will be used for response */
    pWdaParams->wdaMsgParam = (void *)pEdcaParams ;
-
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiEdcaParam ;
-
    status = WDI_UpdateEDCAParams(wdiEdcaParam, 
                (WDI_UpdateEDCAParamsRspCb)WDA_UpdateEDCAParamCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5400,10 +4756,8 @@
       vos_mem_free(pWdaParams);
       vos_mem_free(pEdcaParams);
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_AddBAReqCallback
  * send ADD BA RSP back to PE
@@ -5414,10 +4768,8 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA;
    tAddBAParams *pAddBAReqParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5427,18 +4779,13 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    vos_mem_free(pWdaParams);
-
    pAddBAReqParams->status = CONVERT_WDI2SIR_STATUS(pAddBARspParams->wdiStatus) ;
-
    WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
-
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessAddBAReq
  * Request to WDI to Update the ADDBA REQ params.
@@ -5451,10 +4798,8 @@
                      (WDI_AddBAReqParamsType *)vos_mem_malloc(
                                              sizeof(WDI_AddBAReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiAddBAReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5471,23 +4816,18 @@
       vos_mem_free(wdiAddBAReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    do
    {
       WDI_AddBAReqinfoType *wdiAddBaInfo = &wdiAddBAReqParam->wdiBAInfoType ;
-
       wdiAddBaInfo->ucSTAIdx = staIdx ;
       wdiAddBaInfo->ucBaSessionID = baSessionID ;
       wdiAddBaInfo->ucWinSize     = WDA_BA_MAX_WINSIZE ;
-
    } while(0) ;
    wdiAddBAReqParam->wdiReqStatusCB = NULL ;
-
    pWdaParams->pWdaContext = pWDA;
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBAReqParam ;
    pWdaParams->wdaMsgParam = pAddBAReqParams;
-
    wstatus = WDI_AddBAReq(wdiAddBAReqParam, 
                           (WDI_AddBARspCb)WDA_AddBAReqCallback, pWdaParams);
 
@@ -5501,11 +4841,8 @@
       pAddBAReqParams->status = eSIR_FAILURE;
       WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
    }
-
    return status;
-
 }
-
 /*
  * FUNCTION: WDA_AddBASessionReqCallback
  * send ADD BA SESSION RSP back to PE/(or TL)
@@ -5517,7 +4854,6 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA; 
    tAddBAParams *pAddBAReqParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
    if(NULL == pWdaParams)
@@ -5529,19 +4865,17 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
-
    if( NULL == pAddBAReqParams )
    {
-
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                                           "%s: pAddBAReqParams received NULL " ,__FUNCTION__);
       VOS_ASSERT( 0 );
+	  vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
+	  vos_mem_free(pWdaParams);
       return ;
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    vos_mem_free(pWdaParams);
-
    /* 
     * if WDA in update TL state, update TL with BA session parama and send
     * another request to HAL(/WDI) (ADD_BA_REQ)
@@ -5559,7 +4893,6 @@
                                         wdiAddBaSession->ucBaBufferSize,
                                         wdiAddBaSession->ucWinSize,
                                         wdiAddBaSession->usBaSSN );
-
       WDA_ProcessAddBAReq(pWDA, status, wdiAddBaSession->usBaSessionID, 
                                       wdiAddBaSession->ucSTAIdx, pAddBAReqParams) ;
    }
@@ -5578,14 +4911,11 @@
       pWDA->wdaMsgParam = NULL;
       WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
    }
-
    /*Reset the WDA state to READY */
    pWDA->wdaState = WDA_READY_STATE;
-
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessAddBASessionReq
  * Request to WDI to Update the ADDBA REQ params.
@@ -5598,10 +4928,8 @@
                      (WDI_AddBASessionReqParamsType *)vos_mem_malloc(
                           sizeof(WDI_AddBASessionReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiAddBASessionReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5618,7 +4946,6 @@
       vos_mem_free(wdiAddBASessionReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    /*
     * Populate ADD BA parameters and pass these paarmeters to WDI.
     * ADD BA SESSION REQ will update HAL with BA params, WDA, will changes
@@ -5634,15 +4961,12 @@
       wdiBAInfoType->ucSTAIdx = pAddBAReqParams->staIdx;
       vos_mem_copy(wdiBAInfoType->macPeerAddr,
                        pAddBAReqParams->peerMacAddr, sizeof(tSirMacAddr));
-
       wdiBAInfoType->ucBaTID = pAddBAReqParams->baTID;
-
       wdiBAInfoType->ucBaPolicy = pAddBAReqParams->baPolicy;
       wdiBAInfoType->usBaBufferSize = pAddBAReqParams->baBufferSize;
       wdiBAInfoType->usBaTimeout = pAddBAReqParams->baTimeout;
       wdiBAInfoType->usBaSSN = pAddBAReqParams->baSSN;
       wdiBAInfoType->ucBaDirection = pAddBAReqParams->baDirection;
-
       /* check the BA direction and update state accordingly */
       (eBA_RECIPIENT == wdiBAInfoType->ucBaDirection) 
                                  ? (pWDA->wdaState = WDA_BA_UPDATE_TL_STATE)
@@ -5650,16 +4974,13 @@
  
    }while(0) ;
    wdiAddBASessionReqParam->wdiReqStatusCB = NULL ;
-
    pWdaParams->pWdaContext = pWDA;
    /* Store ADD BA pointer, as this will be used for response */
    pWdaParams->wdaMsgParam = (void *)pAddBAReqParams ;
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBASessionReqParam ;
-
    status = WDI_AddBASessionReq(wdiAddBASessionReqParam, 
               (WDI_AddBASessionRspCb)WDA_AddBASessionReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5668,11 +4989,8 @@
       vos_mem_free(pWdaParams->wdaMsgParam);
       vos_mem_free(pWdaParams);
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
-
 }
-
 /*
  * FUNCTION: WDA_DelBANotifyTL
  * send DEL BA IND to TL
@@ -5684,7 +5002,6 @@
    //tSirMsgQ msg;
    vos_msg_t vosMsg;
    VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
-
    if(NULL == pDelBAInd) 
    { 
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5692,12 +5009,11 @@
       VOS_ASSERT(0) ; 
       return; 
    } 
-
    pDelBAInd->mesgType = WDA_DELETEBA_IND;
    pDelBAInd->staIdx = (tANI_U8) pDelBAReqParams->staIdx;
    pDelBAInd->baTID = (tANI_U8) pDelBAReqParams->baTID;
    pDelBAInd->mesgLen = sizeof( tDelBAInd );
-
+ 
  
    vosMsg.type = WDA_DELETEBA_IND;
    vosMsg.bodyptr = pDelBAInd;
@@ -5707,7 +5023,6 @@
       vosStatus = VOS_STATUS_E_BADMSG;
    }
 }
-
 /*
  * FUNCTION: WDA_DelBAReqCallback
  * send DEL BA RSP back to PE
@@ -5717,10 +5032,8 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA; 
    tDelBAParams *pDelBAReqParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5730,14 +5043,12 @@
    }
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
    pDelBAReqParams = (tDelBAParams *)pWdaParams->wdaMsgParam ;
-
    /* Notify TL about DEL BA in case of recipinet */
    if((VOS_STATUS_SUCCESS == CONVERT_WDI2VOS_STATUS(status)) && 
                              (eBA_RECIPIENT == pDelBAReqParams->baDirection))
    {
       WDA_DelBANotifyTL(pWDA, pDelBAReqParams);
    }
-
    /* 
     * No respone required for WDA_DELBA_IND so just free the request 
     * param here
@@ -5748,7 +5059,6 @@
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessDelBAReq
  * Request to WDI to Update the DELBA REQ params.
@@ -5763,10 +5073,8 @@
    tWDA_ReqParams *pWdaParams ;
    tANI_U16 staIdx = 0;
    tANI_U8 tid = 0;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiDelBAReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5783,29 +5091,23 @@
       vos_mem_free(wdiDelBAReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiDelBAReqParam->wdiBAInfo.ucSTAIdx = pDelBAReqParams->staIdx;
    wdiDelBAReqParam->wdiBAInfo.ucBaTID = pDelBAReqParams->baTID;
    wdiDelBAReqParam->wdiBAInfo.ucBaDirection = pDelBAReqParams->baDirection;
    wdiDelBAReqParam->wdiReqStatusCB = NULL ;
-
    pWdaParams->pWdaContext = pWDA;
    /* Store DEL BA pointer, as this will be used for response */
    pWdaParams->wdaMsgParam = (void *)pDelBAReqParams ;
-
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelBAReqParam ;
-
    /* if BA exchange over the air is failed, clear this tid in BaBitmap
     * maintained in WDA, so that WDA can retry for another BA session
     */
    staIdx = pDelBAReqParams->staIdx;
    tid = pDelBAReqParams->baTID;
    WDA_CLEAR_BA_TXFLAG(pWDA, staIdx, tid);
-
    status = WDI_DelBAReq(wdiDelBAReqParam, 
                          (WDI_DelBARspCb)WDA_DelBAReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5814,11 +5116,8 @@
       vos_mem_free(pWdaParams->wdaMsgParam);
       vos_mem_free(pWdaParams);
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
-
 }
-
 /*
  * FUNCTION: WDA_AddTSReqCallback
  * send ADD TS RSP back to PE
@@ -5831,7 +5130,6 @@
    
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5845,14 +5143,10 @@
    vos_mem_free(pWdaParams);
    
    pAddTsReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
-
    return ;
 }
 
-
-
 /*
  * FUNCTION: WDA_ProcessAddTSReq
  * Request to WDI to Update the ADD TS  REQ params.
@@ -5865,10 +5159,8 @@
                      (WDI_AddTSReqParamsType *)vos_mem_malloc(
                                              sizeof(WDI_AddTSReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiAddTSReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5885,10 +5177,8 @@
       vos_mem_free(wdiAddTSReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiAddTSReqParam->wdiTsInfo.ucSTAIdx = pAddTsReqParams->staIdx;
    wdiAddTSReqParam->wdiTsInfo.ucTspecIdx = pAddTsReqParams->tspecIdx;
-
    //TS IE
    wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucType = pAddTsReqParams->tspec.type;
    wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucLength = 
@@ -5917,7 +5207,6 @@
                            pAddTsReqParams->tspec.tsinfo.schedule.schedule;
    wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.rsvd = 
                            pAddTsReqParams->tspec.tsinfo.schedule.rsvd;
-
    //TS IE
    wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usNomMsduSz = 
                            pAddTsReqParams->tspec.nomMsduSz;
@@ -5949,7 +5238,6 @@
                            pAddTsReqParams->tspec.surplusBw;
    wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMediumTime = 
                            pAddTsReqParams->tspec.mediumTime;
-
    /* TODO: tAddTsParams doesn't have the following fields */
 #if 0 
    wdiAddTSReqParam->wdiTsInfo.ucUapsdFlags = 
@@ -5962,13 +5250,10 @@
    pWdaParams->pWdaContext = pWDA;
    /* Store ADD TS pointer, as this will be used for response */
    pWdaParams->wdaMsgParam = (void *)pAddTsReqParams ;
-
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddTSReqParam ;
-
    status = WDI_AddTSReq(wdiAddTSReqParam, 
                    (WDI_AddTsRspCb)WDA_AddTSReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5978,12 +5263,9 @@
       pAddTsReqParams->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
-
 }
 
-
 /*
  * FUNCTION: WDA_DelTSReqCallback
  * send DEL TS RSP back to PE
@@ -5991,23 +5273,18 @@
 void WDA_DelTSReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    vos_mem_free(pWdaParams->wdaMsgParam) ;
    vos_mem_free(pWdaParams);
-
    /* 
     * No respone required for WDA_DEL_TS_REQ so just free the request 
     * param here
     */
-
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessDelTSReq
  * Request to WDI to Update the DELTS REQ params.
@@ -6020,10 +5297,8 @@
                      (WDI_DelTSReqParamsType *)vos_mem_malloc(
                                              sizeof(WDI_DelTSReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiDelTSReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6040,23 +5315,18 @@
       vos_mem_free(wdiDelTSReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    vos_mem_copy(wdiDelTSReqParam->wdiDelTSInfo.macBSSID, 
                                   pDelTSReqParams->bssId, sizeof(tSirMacAddr));
    wdiDelTSReqParam->wdiDelTSInfo.ucSTAIdx = pDelTSReqParams->staIdx;
    wdiDelTSReqParam->wdiDelTSInfo.ucTspecIdx = pDelTSReqParams->tspecIdx;
    wdiDelTSReqParam->wdiReqStatusCB = NULL ;
-
    pWdaParams->pWdaContext = pWDA;
    /* Store DEL TS pointer, as this will be used for response */
    pWdaParams->wdaMsgParam = (void *)pDelTSReqParams ;
-
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelTSReqParam ;
-
    status = WDI_DelTSReq(wdiDelTSReqParam, 
                        (WDI_DelTsRspCb)WDA_DelTSReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6065,11 +5335,8 @@
       vos_mem_free(pWdaParams->wdaMsgParam);
       vos_mem_free(pWdaParams);
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
-
 }
-
 /*
  * FUNCTION: WDA_UpdateBeaconParamsCallback
  *  Free the memory. No need to send any response to PE in this case
@@ -6077,10 +5344,8 @@
 void WDA_UpdateBeaconParamsCallback(WDI_Status status, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6095,10 +5360,8 @@
     * No respone required for WDA_UPDATE_BEACON_IND so just free the request 
     * param here
     */
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessUpdateBeaconParams
  * Request to WDI to send  the beacon parameters to HAL to update the Hardware
@@ -6111,10 +5374,8 @@
                      (WDI_UpdateBeaconParamsType *)vos_mem_malloc(
                                              sizeof(WDI_UpdateBeaconParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiUpdateBeaconParams) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6131,7 +5392,6 @@
       vos_mem_free(wdiUpdateBeaconParams);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucBssIdx = 
                            pUpdateBeaconParams->bssIdx;
    wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortPreamble = 
@@ -6161,14 +5421,11 @@
    pWdaParams->pWdaContext = pWDA;
    /* Store UpdateBeacon Req pointer, as this will be used for response */
    pWdaParams->wdaMsgParam = (void *)pUpdateBeaconParams ;
-
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiUpdateBeaconParams ;
-
    status = WDI_UpdateBeaconParamsReq(wdiUpdateBeaconParams, 
                  (WDI_UpdateBeaconParamsRspCb)WDA_UpdateBeaconParamsCallback,
                  pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6177,13 +5434,9 @@
       vos_mem_free(pWdaParams->wdaMsgParam);
       vos_mem_free(pWdaParams);
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
-
 }
-
 #ifdef FEATURE_WLAN_CCX
-
 /*
  * FUNCTION: WDA_TSMStatsReqCallback
  * send TSM Stats RSP back to PE
@@ -6196,7 +5449,6 @@
  
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ Entering: %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6206,7 +5458,6 @@
    }
    pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
    pTsmRspParams = (tTSMStats *)pWdaParams->wdaMsgParam ;
-
    if( NULL == pTsmRspParams )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6214,7 +5465,6 @@
       VOS_ASSERT( 0 );
       return ;
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    vos_mem_free(pWdaParams);
    
@@ -6228,15 +5478,11 @@
    pTsmRspParams->tsmMetrics.UplinkPktCount = pwdiTSMStatsRspParams->UplinkPktCount;
    pTsmRspParams->tsmMetrics.RoamingCount = pwdiTSMStatsRspParams->RoamingCount;
    pTsmRspParams->tsmMetrics.RoamingDly = pwdiTSMStatsRspParams->RoamingDly;
-
    WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void *)pTsmRspParams , 0) ;
-
    return ;
 }
 
 
-
-
 /*
  * FUNCTION: WDA_ProcessTsmStatsReq
  * Request to WDI to get the TSM Stats params.
@@ -6247,10 +5493,8 @@
    WDI_Status status = WDI_STATUS_SUCCESS ;
    WDI_TSMStatsReqParamsType *wdiTSMReqParam = NULL;
    tWDA_ReqParams *pWdaParams = NULL;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> Entering: %s " ,__FUNCTION__);
-
    if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6258,7 +5502,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    wdiTSMReqParam = (WDI_TSMStatsReqParamsType *)vos_mem_malloc(
                                  sizeof(WDI_TSMStatsReqParamsType));
    if(NULL == wdiTSMReqParam) 
@@ -6268,7 +5511,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if(NULL == pWdaParams)
    {
@@ -6278,7 +5520,6 @@
       vos_mem_free(wdiTSMReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiTSMReqParam->wdiTsmStatsParamsInfo.ucTid = pTsmStats->tid;
    vos_mem_copy(wdiTSMReqParam->wdiTsmStatsParamsInfo.bssid,
                                            pTsmStats->bssId,
@@ -6288,13 +5529,10 @@
    pWdaParams->pWdaContext = pWDA;
    /* Store TSM Stats pointer, as this will be used for response */
    pWdaParams->wdaMsgParam = (void *)pTsmStats ;
-
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiTSMReqParam ;
-
    status = WDI_TSMStatsReq(wdiTSMReqParam,
                            (WDI_TsmRspCb)WDA_TSMStatsReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6302,7 +5540,6 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
       vos_mem_free(pWdaParams) ;
    }
-
   return CONVERT_WDI2VOS_STATUS(status) ;
 } 
 #endif
@@ -6313,13 +5550,10 @@
 void WDA_SendBeaconParamsCallback(WDI_Status status, void* pUserData)
 {
 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessSendBeacon
  * Request to WDI to send the beacon template to HAL to update the TPE memory and 
@@ -6330,10 +5564,8 @@
 {
    WDI_Status status = WDI_STATUS_SUCCESS ;
    WDI_SendBeaconParamsType wdiSendBeaconReqParam; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.macBSSID, 
                               pSendbeaconParams->bssId, sizeof(tSirMacAddr));
    wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beaconLength = 
@@ -6346,41 +5578,32 @@
    wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.usP2PIeOffset = 
                               pSendbeaconParams->p2pIeOffset;
 #endif
-
    /* Copy the beacon template to local buffer */
    vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beacon, 
                  pSendbeaconParams->beacon, pSendbeaconParams->beaconLength);
    wdiSendBeaconReqParam.wdiReqStatusCB = NULL ;
 
-
    status = WDI_SendBeaconParamsReq(&wdiSendBeaconReqParam, 
             (WDI_SendBeaconParamsRspCb)WDA_SendBeaconParamsCallback, pWDA);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
           "Failure in SEND BEACON REQ Params WDI API" );
    }
-
    vos_mem_free(pSendbeaconParams);
    return CONVERT_WDI2VOS_STATUS(status);
-
 }
-
 /*
  * FUNCTION: WDA_UpdateProbeRspParamsCallback
  * No need to send any response to PE in this case
  */ 
 void WDA_UpdateProbeRspParamsCallback(WDI_Status status, void* pUserData)
 {
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessUpdateProbeRspTemplate
  * Request to WDI to send the probe response template to HAL to update the TPE memory and 
@@ -6393,13 +5616,11 @@
    WDI_UpdateProbeRspTemplateParamsType wdiSendProbeRspParam; 
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    /*Copy update probe response parameters*/
    vos_mem_copy(wdiSendProbeRspParam.wdiProbeRspTemplateInfo.macBSSID, 
                               pSendProbeRspParams->bssId, sizeof(tSirMacAddr));
    wdiSendProbeRspParam.wdiProbeRspTemplateInfo.uProbeRespTemplateLen = 
                               pSendProbeRspParams->probeRespTemplateLen;
-
    /* Copy the Probe Response template to local buffer */
    vos_mem_copy(
            wdiSendProbeRspParam.wdiProbeRspTemplateInfo.pProbeRespTemplate,
@@ -6412,21 +5633,16 @@
    
    wdiSendProbeRspParam.wdiReqStatusCB = NULL ;
    
-
    status = WDI_UpdateProbeRspTemplateReq(&wdiSendProbeRspParam, 
      (WDI_UpdateProbeRspTemplateRspCb)WDA_UpdateProbeRspParamsCallback, pWDA);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
           "Failure in SEND Probe RSP Params WDI API" );
    }
-
    vos_mem_free(pSendProbeRspParams);
    return CONVERT_WDI2VOS_STATUS(status);
-
 }
-
 #if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
 /*
  * FUNCTION: WDA_SetMaxTxPowerCallBack
@@ -6448,34 +5664,31 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
    pMaxTxPowerParams = (tMaxTxPowerParams *)pWdaParams->wdaMsgParam ;
-
    if( NULL == pMaxTxPowerParams )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                                           "%s: pMaxTxPowerParams received NULL " ,__FUNCTION__);
-      VOS_ASSERT( 0 );
+      VOS_ASSERT(0);
+	  vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+	  vos_mem_free(pWdaParams);
       return ;
    }
-
+  
   
   /*need to free memory for the pointers used in the 
     WDA Process.Set Max Tx Power Req function*/
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    vos_mem_free(pWdaParams);
-
    pMaxTxPowerParams->power = pwdiSetMaxTxPowerRsp->ucPower;
-
+  
   
   /* send response to UMAC*/
    WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_RSP, pMaxTxPowerParams , 0) ;
    
    return;
 }
-
 /*
  * FUNCTION: WDA_SetMaxTxPowerCallBack
  * Request to WDI to send set Max Tx Power Request
@@ -6486,10 +5699,8 @@
    WDI_Status status = WDI_STATUS_SUCCESS;
    WDI_SetMaxTxPowerParamsType *wdiSetMaxTxPowerParams = NULL;
    tWDA_ReqParams *pWdaParams = NULL;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if((NULL != pWDA->wdaMsgParam) ||(NULL != pWDA->wdaWdiApiMsgParam))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6497,7 +5708,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    wdiSetMaxTxPowerParams = (WDI_SetMaxTxPowerParamsType *)vos_mem_malloc(
                                  sizeof(WDI_SetMaxTxPowerParamsType));
    if(NULL == wdiSetMaxTxPowerParams) 
@@ -6507,7 +5717,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if(NULL == pWdaParams)
    {
@@ -6517,30 +5726,22 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    /* Copy.Max.Tx.Power Params to WDI structure */
    vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macBSSId,
                  MaxTxPowerParams->bssId, 
                  sizeof(tSirMacAddr));
-
    vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macSelfStaMacAddr,
                  MaxTxPowerParams->selfStaMacAddr, 
                  sizeof(tSirMacAddr));
-
    wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.ucPower = 
                                               MaxTxPowerParams->power;
-
    wdiSetMaxTxPowerParams->wdiReqStatusCB = NULL ;
-
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = (void *)MaxTxPowerParams ;
-
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetMaxTxPowerParams ;
-
    status = WDI_SetMaxTxPowerReq(wdiSetMaxTxPowerParams,
                        (WDA_SetMaxTxPowerRspCb)WDA_SetMaxTxPowerCallBack, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6551,11 +5752,8 @@
    return CONVERT_WDI2VOS_STATUS(status);
    
 }
-
 #endif
-
 #ifdef WLAN_FEATURE_P2P
-
 /*
  * FUNCTION: WDA_SetP2PGONOAReqParamsCallback
  *  Free the memory. No need to send any response to PE in this case
@@ -6563,24 +5761,19 @@
 void WDA_SetP2PGONOAReqParamsCallback(WDI_Status status, void* pUserData)
 {
    tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
    pWDA->wdaWdiApiMsgParam = NULL;
    vos_mem_free(pWDA->wdaMsgParam) ;
    pWDA->wdaMsgParam = NULL;
-
    /* 
     * No respone required for SIR_HAL_SET_P2P_GO_NOA_REQ 
     * so just free the request param here
     */
-
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessSetP2PGONOAReq
  * Request to WDI to set the P2P Group Owner Notice of Absence Req 
@@ -6592,10 +5785,8 @@
    WDI_SetP2PGONOAReqParamsType *wdiSetP2PGONOAReqParam = 
                 (WDI_SetP2PGONOAReqParamsType *)vos_mem_malloc(
                                    sizeof(WDI_SetP2PGONOAReqParamsType)) ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiSetP2PGONOAReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6603,7 +5794,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucOpp_ps = 
                                     pP2pPsConfigParams->opp_ps;
    wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uCtWindow = 
@@ -6618,7 +5808,6 @@
                                     pP2pPsConfigParams->single_noa_duration;
    wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucPsSelection = 
                                     pP2pPsConfigParams->psSelection;
-
    if((NULL != pWDA->wdaMsgParam) ||
                              (NULL != pWDA->wdaWdiApiMsgParam))
    {
@@ -6628,17 +5817,13 @@
       vos_mem_free(wdiSetP2PGONOAReqParam);
       return VOS_STATUS_E_FAILURE;
    }
-
    wdiSetP2PGONOAReqParam->wdiReqStatusCB = NULL ;
    /* Store msg pointer from PE, as this will be used for response */
    pWDA->wdaMsgParam = (void *)pP2pPsConfigParams ;
-
    /* store Params pass it to WDI */
    pWDA->wdaWdiApiMsgParam = (void *)wdiSetP2PGONOAReqParam ;
-
    status = WDI_SetP2PGONOAReq(wdiSetP2PGONOAReqParam, 
        (WDI_SetP2PGONOAReqParamsRspCb)WDA_SetP2PGONOAReqParamsCallback, pWDA);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6648,13 +5833,10 @@
       pWDA->wdaWdiApiMsgParam = NULL;
       pWDA->wdaMsgParam = NULL;
    }
-
    return CONVERT_WDI2VOS_STATUS(status);
 
-
 }
 #endif
-
 #ifdef WLAN_FEATURE_VOWIFI_11R
 /*
  * FUNCTION: WDA_AggrAddTSReqCallback
@@ -6666,10 +5848,8 @@
    tAggrAddTsParams *pAggrAddTsReqParams = 
                            (tAggrAddTsParams *)pWDA->wdaMsgParam ;
    int i;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
    pWDA->wdaWdiApiMsgParam = NULL;
    pWDA->wdaMsgParam = NULL;
@@ -6678,12 +5858,9 @@
    {
       pAggrAddTsReqParams->status[i] = CONVERT_WDI2SIR_STATUS(status) ;
    }
-
    WDA_SendMsg(pWDA, WDA_AGGR_QOS_RSP, (void *)pAggrAddTsReqParams , 0) ;
-
    return ;
 }/* WLAN_FEATURE_VOWIFI_11R */
-
 /*
  * FUNCTION: WDA_ProcessAddTSReq
  * Request to WDI to send an update with AGGREGATED ADD TS REQ params.
@@ -6694,7 +5871,6 @@
    WDI_Status status = WDI_STATUS_SUCCESS ;
    int i;
    WDI_AggrAddTSReqParamsType *wdiAggrAddTSReqParam;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
    if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
@@ -6714,17 +5890,14 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiAggrAddTSReqParam->wdiAggrTsInfo.ucSTAIdx = pAggrAddTsReqParams->staIdx;
    wdiAggrAddTSReqParam->wdiAggrTsInfo.ucTspecIdx = 
       pAggrAddTsReqParams->tspecIdx;
-
    for( i = 0; i < WDI_MAX_NO_AC; i++ )
    {
       wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucType = pAggrAddTsReqParams->tspec[i].type;
       wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucLength = 
                                                    pAggrAddTsReqParams->tspec[i].length;
-
       wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.ackPolicy =
                               pAggrAddTsReqParams->tspec[i].tsinfo.traffic.ackPolicy;
       wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.userPrio =
@@ -6741,10 +5914,8 @@
                               pAggrAddTsReqParams->tspec[i].tsinfo.traffic.tsid;
       wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.trafficType =
                               pAggrAddTsReqParams->tspec[i].tsinfo.traffic.trafficType;
-
       wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiSchedule.schedule = 
                               pAggrAddTsReqParams->tspec[i].tsinfo.schedule.schedule;
-
       wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usNomMsduSz = 
                               pAggrAddTsReqParams->tspec[i].nomMsduSz;
       wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMaxMsduSz = 
@@ -6788,13 +5959,10 @@
    
    /* Store ADD TS pointer, as this will be used for response */
    pWDA->wdaMsgParam = (void *)pAggrAddTsReqParams ;
-
    /* store Params pass it to WDI */
    pWDA->wdaWdiApiMsgParam = (void *)wdiAggrAddTSReqParam ;
-
    status = WDI_AggrAddTSReq(wdiAggrAddTSReqParam, 
                              (WDI_AggrAddTsRspCb)WDA_AggrAddTSReqCallback, pWDA);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6804,11 +5972,9 @@
       pWDA->wdaWdiApiMsgParam = NULL;
       pWDA->wdaMsgParam = NULL;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
 #endif
-
 /*
  * FUNCTION: WDA_EnterImpsReqCallback
  * send Enter IMPS RSP back to PE
@@ -6816,15 +5982,11 @@
 void WDA_EnterImpsReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessEnterImpsReq
  * Request to WDI to Enter IMPS power state.
@@ -6832,12 +5994,9 @@
 VOS_STATUS WDA_ProcessEnterImpsReq(tWDA_CbContext *pWDA)
 {
    WDI_Status status = WDI_STATUS_SUCCESS ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    status = WDI_EnterImpsReq((WDI_EnterImpsRspCb)WDA_EnterImpsReqCallback, pWDA);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6845,10 +6004,8 @@
       pWDA->wdaWdiApiMsgParam = NULL;
       pWDA->wdaMsgParam = NULL;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_ExitImpsReqCallback
  * send Exit IMPS RSP back to PE
@@ -6856,15 +6013,11 @@
 void WDA_ExitImpsReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessExitImpsReq
  * Request to WDI to Exit IMPS power state.
@@ -6872,12 +6025,9 @@
 VOS_STATUS WDA_ProcessExitImpsReq(tWDA_CbContext *pWDA)
 {
    WDI_Status status = WDI_STATUS_SUCCESS ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    status = WDI_ExitImpsReq((WDI_ExitImpsRspCb)WDA_ExitImpsReqCallback, pWDA);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6885,10 +6035,8 @@
       pWDA->wdaWdiApiMsgParam = NULL;
       pWDA->wdaMsgParam = NULL;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_EnterBmpsReqCallback
  * send Enter BMPS RSP back to PE
@@ -6899,7 +6047,6 @@
    tWDA_CbContext *pWDA;
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6907,16 +6054,12 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessEnterBmpsReq
  * Request to WDI to Enter BMPS power state.
@@ -6927,10 +6070,8 @@
    WDI_Status status = WDI_STATUS_SUCCESS;
    WDI_EnterBmpsReqParamsType *wdiEnterBmpsReqParams;
    tWDA_ReqParams *pWdaParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if ((NULL == pWDA) || (NULL == pEnterBmpsReqParams))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6938,7 +6079,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    wdiEnterBmpsReqParams = vos_mem_malloc(sizeof(WDI_EnterBmpsReqParamsType));
    if (NULL == wdiEnterBmpsReqParams)
    {
@@ -6947,7 +6087,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
    if (NULL == pWdaParams)
    {
@@ -6957,30 +6096,24 @@
       vos_mem_free(wdiEnterBmpsReqParams);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucBssIdx = pEnterBmpsReqParams->bssIdx;
    wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimCount = pEnterBmpsReqParams->dtimCount;
    wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimPeriod = pEnterBmpsReqParams->dtimPeriod;
    wdiEnterBmpsReqParams->wdiEnterBmpsInfo.uTbtt = pEnterBmpsReqParams->tbtt;
-
    // For CCX and 11R Roaming
    wdiEnterBmpsReqParams->wdiEnterBmpsInfo.rssiFilterPeriod = (wpt_uint32)pEnterBmpsReqParams->rssiFilterPeriod;
    wdiEnterBmpsReqParams->wdiEnterBmpsInfo.numBeaconPerRssiAverage = (wpt_uint32)pEnterBmpsReqParams->numBeaconPerRssiAverage;
    wdiEnterBmpsReqParams->wdiEnterBmpsInfo.bRssiFilterEnable = (wpt_uint8)pEnterBmpsReqParams->bRssiFilterEnable;
    wdiEnterBmpsReqParams->wdiReqStatusCB = NULL;
-
    // we are done with the input
    vos_mem_free(pEnterBmpsReqParams);
-
    /* Store param pointer as passed in by caller */
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = wdiEnterBmpsReqParams;
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = NULL;
-
    status = WDI_EnterBmpsReq(wdiEnterBmpsReqParams,
                     (WDI_EnterBmpsRspCb)WDA_EnterBmpsReqCallback, pWdaParams);
-
    if (IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6988,10 +6121,8 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams);
    }
-
    return CONVERT_WDI2VOS_STATUS(status);
 }
-
 /*
  * FUNCTION: WDA_ExitBmpsReqCallback
  * send Exit BMPS RSP back to PE
@@ -7001,10 +6132,8 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
    tWDA_CbContext *pWDA;
    tExitBmpsParams *pExitBmpsReqParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7012,22 +6141,16 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
    pExitBmpsReqParams = (tExitBmpsParams *)pWdaParams->wdaMsgParam ;
 
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
 
-
    pExitBmpsReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsReqParams , 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessExitBmpsReq
  * Request to WDI to Exit BMPS power state.
@@ -7040,10 +6163,8 @@
       (WDI_ExitBmpsReqParamsType *)vos_mem_malloc(
          sizeof(WDI_ExitBmpsReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiExitBmpsReqParams) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7060,9 +6181,10 @@
       vos_mem_free(wdiExitBmpsReqParams);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiExitBmpsReqParams->wdiExitBmpsInfo.ucSendDataNull = pExitBmpsReqParams->sendDataNull;
-      
+
+   wdiExitBmpsReqParams->wdiExitBmpsInfo.bssIdx = pExitBmpsReqParams->bssIdx;
+
    wdiExitBmpsReqParams->wdiReqStatusCB = NULL;
       
    /* Store param pointer as passed in by caller */
@@ -7070,10 +6192,8 @@
    pWdaParams->wdaWdiApiMsgParam = wdiExitBmpsReqParams;
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pExitBmpsReqParams;
-
    status = WDI_ExitBmpsReq(wdiExitBmpsReqParams,
                              (WDI_ExitBmpsRspCb)WDA_ExitBmpsReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7082,10 +6202,8 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_EnterUapsdReqCallback
  * send Enter UAPSD RSP back to PE
@@ -7095,10 +6213,8 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
    tWDA_CbContext *pWDA;
    tUapsdParams *pEnterUapsdReqParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7106,21 +6222,14 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
-
    pEnterUapsdReqParams = (tUapsdParams *)pWdaParams->wdaMsgParam ;
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    pEnterUapsdReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    WDA_SendMsg(pWDA, WDA_ENTER_UAPSD_RSP, (void *)pEnterUapsdReqParams , 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessEnterUapsdReq
  * Request to WDI to Enter UAPSD power state.
@@ -7133,10 +6242,8 @@
       (WDI_EnterUapsdReqParamsType *)vos_mem_malloc(
          sizeof(WDI_EnterUapsdReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiEnterUapsdReqParams) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7153,7 +6260,6 @@
       vos_mem_free(wdiEnterUapsdReqParams);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeDeliveryEnabled = 
       pEnterUapsdReqParams->beDeliveryEnabled;
    wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeTriggerEnabled = 
@@ -7170,19 +6276,17 @@
       pEnterUapsdReqParams->voDeliveryEnabled;
    wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoTriggerEnabled = 
       pEnterUapsdReqParams->voTriggerEnabled;
+   wdiEnterUapsdReqParams->wdiEnterUapsdInfo.bssIdx = pEnterUapsdReqParams->bssIdx;
 
    wdiEnterUapsdReqParams->wdiReqStatusCB = NULL; 
 
-
    /* Store param pointer as passed in by caller */
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = wdiEnterUapsdReqParams;
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pEnterUapsdReqParams;
-
    status = WDI_EnterUapsdReq(wdiEnterUapsdReqParams,
                               (WDI_EnterUapsdRspCb)WDA_EnterUapsdReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7191,10 +6295,8 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_ExitUapsdReqCallback
  * send Exit UAPSD RSP back to PE
@@ -7202,15 +6304,11 @@
 void WDA_ExitUapsdReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    WDA_SendMsg(pWDA, WDA_EXIT_UAPSD_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessExitUapsdReq
  * Request to WDI to Exit UAPSD power state.
@@ -7218,12 +6316,9 @@
 VOS_STATUS WDA_ProcessExitUapsdReq(tWDA_CbContext *pWDA)
 {
    WDI_Status status = WDI_STATUS_SUCCESS ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    status = WDI_ExitUapsdReq((WDI_ExitUapsdRspCb)WDA_ExitUapsdReqCallback, pWDA);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7231,11 +6326,9 @@
       pWDA->wdaWdiApiMsgParam = NULL;
       pWDA->wdaMsgParam = NULL;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
 
-
 /*
  * FUNCTION: WDA_SetPwrSaveCfgReqCallback
  * 
@@ -7243,10 +6336,8 @@
 void WDA_SetPwrSaveCfgReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7254,7 +6345,6 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    if( pWdaParams != NULL )
    {
       if( pWdaParams->wdaWdiApiMsgParam != NULL )
@@ -7267,10 +6357,8 @@
       }
       vos_mem_free(pWdaParams) ;
    }
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessSetPwrSaveCfgReq
  * Request to WDI to set the power save params at start.
@@ -7286,24 +6374,23 @@
    tANI_U32       *configDataValue;
    WDI_UpdateCfgReqParamsType *wdiPowerSaveCfg;
    tWDA_ReqParams *pWdaParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if ((NULL == pWDA) || (NULL == pPowerSaveCfg))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                            "%s: invalid param", __FUNCTION__);
       VOS_ASSERT(0);
+	  vos_mem_free(pPowerSaveCfg);
       return VOS_STATUS_E_FAILURE;
    }
-
    wdiPowerSaveCfg = vos_mem_malloc(sizeof(WDI_UpdateCfgReqParamsType));
    if (NULL == wdiPowerSaveCfg)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                            "%s: VOS MEM Alloc Failure", __FUNCTION__);
       VOS_ASSERT(0);
+	  vos_mem_free(pPowerSaveCfg);
       return VOS_STATUS_E_NOMEM;
    }
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
@@ -7313,90 +6400,74 @@
                            "%s: VOS MEM Alloc Failure", __FUNCTION__); 
       VOS_ASSERT(0);
       vos_mem_free(wdiPowerSaveCfg);
+	  vos_mem_free(pPowerSaveCfg);
       return VOS_STATUS_E_NOMEM;
    }
-
    configParamSize = (sizeof(tHalCfg) + (sizeof(tANI_U32))) * WDA_NUM_PWR_SAVE_CFG;
    configParam = vos_mem_malloc(configParamSize);
-
    if(NULL == configParam)
    {
       VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
+	  VOS_ASSERT(0);
       vos_mem_free(pWdaParams);
       vos_mem_free(wdiPowerSaveCfg);
-      VOS_ASSERT(0);
+	  vos_mem_free(pPowerSaveCfg);
       return VOS_STATUS_E_NOMEM;
    }
-
    vos_mem_set(configParam, configParamSize, 0);
    wdiPowerSaveCfg->pConfigBuffer = configParam;
    tlvStruct = (tHalCfg *)configParam;
    tlvStructStart = (tANI_U8 *)configParam;
-
    /* QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE */
    tlvStruct->type = QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE;
    tlvStruct->length = sizeof(tANI_U32);
    configDataValue = (tANI_U32 *)(tlvStruct + 1);
    *configDataValue = (tANI_U32)pPowerSaveCfg->broadcastFrameFilter;
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD */
    tlvStruct->type = QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD;
    tlvStruct->length = sizeof(tANI_U32);
    configDataValue = (tANI_U32 *)(tlvStruct + 1);
    *configDataValue = (tANI_U32)pPowerSaveCfg->HeartBeatCount;
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_PS_IGNORE_DTIM */
    tlvStruct->type = QWLAN_HAL_CFG_PS_IGNORE_DTIM;
    tlvStruct->length = sizeof(tANI_U32);
    configDataValue = (tANI_U32 *)(tlvStruct + 1);
    *configDataValue = (tANI_U32)pPowerSaveCfg->ignoreDtim;
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_PS_LISTEN_INTERVAL */
    tlvStruct->type = QWLAN_HAL_CFG_PS_LISTEN_INTERVAL;
    tlvStruct->length = sizeof(tANI_U32);
    configDataValue = (tANI_U32 *)(tlvStruct + 1);
    *configDataValue = (tANI_U32)pPowerSaveCfg->listenInterval;
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_PS_MAX_PS_POLL */
    tlvStruct->type = QWLAN_HAL_CFG_PS_MAX_PS_POLL;
    tlvStruct->length = sizeof(tANI_U32);
    configDataValue = (tANI_U32 *)(tlvStruct + 1);
    *configDataValue = (tANI_U32)pPowerSaveCfg->maxPsPoll;
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD */
    tlvStruct->type = QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD;
    tlvStruct->length = sizeof(tANI_U32);
    configDataValue = (tANI_U32 *)(tlvStruct + 1);
    *configDataValue = (tANI_U32)pPowerSaveCfg->minRssiThreshold;
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER */
    tlvStruct->type = QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER;
    tlvStruct->length = sizeof(tANI_U32);
    configDataValue = (tANI_U32 *)(tlvStruct + 1);
    *configDataValue = (tANI_U32)pPowerSaveCfg->nthBeaconFilter;
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM */
    tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM;
    tlvStruct->length = sizeof(tANI_U32);
@@ -7404,7 +6475,6 @@
    *configDataValue = (tANI_U32)pPowerSaveCfg->fEnableBeaconEarlyTermination;
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL */
    tlvStruct->type = QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL;
    tlvStruct->length = sizeof(tANI_U32);
@@ -7412,37 +6482,28 @@
    *configDataValue = (tANI_U32)pPowerSaveCfg->bcnEarlyTermWakeInterval;
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */
    tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
    tlvStruct->length = sizeof(tANI_U32);
    configDataValue = (tANI_U32 *)(tlvStruct + 1);
    *configDataValue = (tANI_U32)pPowerSaveCfg->numBeaconPerRssiAverage;
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    /* QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD */
    tlvStruct->type = QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD;
    tlvStruct->length = sizeof(tANI_U32);
    configDataValue = (tANI_U32 *)(tlvStruct + 1);
    *configDataValue = (tANI_U32)pPowerSaveCfg->rssiFilterPeriod;
-
    tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct 
                             + sizeof(tHalCfg) + tlvStruct->length)) ; 
-
    wdiPowerSaveCfg->uConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
-
    wdiPowerSaveCfg->wdiReqStatusCB = NULL;
-
    /* store Params pass it to WDI */
    pWdaParams->wdaMsgParam = configParam;
    pWdaParams->wdaWdiApiMsgParam = wdiPowerSaveCfg;
    pWdaParams->pWdaContext = pWDA;
-
    status = WDI_SetPwrSaveCfgReq(wdiPowerSaveCfg, 
                                  (WDI_SetPwrSaveCfgCb)WDA_SetPwrSaveCfgReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7451,12 +6512,9 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams);
    }
-
    vos_mem_free(pPowerSaveCfg);
-
    return CONVERT_WDI2VOS_STATUS(status);
 }
-
 /*
  * FUNCTION: WDA_SetUapsdAcParamsReqCallback
  * 
@@ -7464,17 +6522,13 @@
 void WDA_SetUapsdAcParamsReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    vos_mem_free(pWdaParams);
 
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_SetUapsdAcParamsReq
  * Request to WDI to set the UAPSD params for an ac (sta mode).
@@ -7488,10 +6542,8 @@
       (WDI_SetUapsdAcParamsReqParamsType *)vos_mem_malloc(
          sizeof(WDI_SetUapsdAcParamsReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiUapsdParams) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7508,28 +6560,22 @@
       vos_mem_free(wdiUapsdParams);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiUapsdParams->wdiUapsdInfo.ucAc = pUapsdInfo->ac;
    wdiUapsdParams->wdiUapsdInfo.uDelayInterval = pUapsdInfo->delayInterval;
    wdiUapsdParams->wdiUapsdInfo.uSrvInterval = pUapsdInfo->srvInterval;
    wdiUapsdParams->wdiUapsdInfo.ucSTAIdx = pUapsdInfo->staidx;
    wdiUapsdParams->wdiUapsdInfo.uSusInterval = pUapsdInfo->susInterval;
    wdiUapsdParams->wdiUapsdInfo.ucUp = pUapsdInfo->up;
-
    wdiUapsdParams->wdiReqStatusCB = NULL;
-
    pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
-
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pUapsdInfo;
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiUapsdParams;
-
    status = WDI_SetUapsdAcParamsReq(wdiUapsdParams, 
               (WDI_SetUapsdAcParamsCb)WDA_SetUapsdAcParamsReqCallback,
               pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7537,14 +6583,11 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
       vos_mem_free(pWdaParams);
    }
-
    if((WDI_STATUS_SUCCESS == status) || (WDI_STATUS_PENDING == status))
      return VOS_STATUS_SUCCESS;
    else
      return VOS_STATUS_E_FAILURE;
 
-
-
 }
 /* 
  * FUNCTION: WDA_ClearUapsdAcParamsReq 
@@ -7559,7 +6602,6 @@
    /* do nothing */
    return VOS_STATUS_SUCCESS;
 }
-
 /*
  * FUNCTION: WDA_UpdateUapsdParamsReqCallback
  * 
@@ -7567,22 +6609,17 @@
 void WDA_UpdateUapsdParamsReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
    pWDA->wdaWdiApiMsgParam = NULL;
    pWDA->wdaMsgParam = NULL;
 
-
    //print a msg, nothing else to do
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
            "WDA_UpdateUapsdParamsReqCallback invoked " );
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_UpdateUapsdParamsReq
  * Request to WDI to update UAPSD params (in softAP mode) for a station.
@@ -7595,10 +6632,8 @@
    WDI_UpdateUapsdReqParamsType *wdiUpdateUapsdParams = 
       (WDI_UpdateUapsdReqParamsType *)vos_mem_malloc(
          sizeof(WDI_UpdateUapsdReqParamsType)) ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiUpdateUapsdParams) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7606,11 +6641,9 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiUpdateUapsdParams->wdiUpdateUapsdInfo.uMaxSpLen = pUpdateUapsdInfo->maxSpLen;
    wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucSTAIdx = pUpdateUapsdInfo->staIdx;
    wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucUapsdACMask = pUpdateUapsdInfo->uapsdACMask;
-
    if((NULL != pWDA->wdaMsgParam) ||
                   (NULL != pWDA->wdaWdiApiMsgParam))
    {
@@ -7620,12 +6653,10 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    /* Store param pointer as passed in by caller */
    pWDA->wdaMsgParam = pUpdateUapsdInfo;
    /* store Params pass it to WDI */
    pWDA->wdaWdiApiMsgParam = (void *)wdiUpdateUapsdParams;
-
    wstatus = WDI_UpdateUapsdParamsReq(wdiUpdateUapsdParams, 
                                       (WDI_UpdateUapsdParamsCb)WDA_UpdateUapsdParamsReqCallback, pWDA);
 
@@ -7639,10 +6670,8 @@
       pWDA->wdaWdiApiMsgParam = NULL;
       pWDA->wdaMsgParam = NULL;
    }
-
    return status;
 }
-
 /*
  * FUNCTION: WDA_ConfigureRxpFilterCallback
  * 
@@ -7650,16 +6679,13 @@
 void WDA_ConfigureRxpFilterCallback(WDI_Status   wdiStatus, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(WDI_STATUS_SUCCESS != wdiStatus)
    {
       VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                   "%s: RXP config filter failure \n", __FUNCTION__ );
    }
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7667,13 +6693,11 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    vos_mem_free(pWdaParams->wdaMsgParam);
    vos_mem_free(pWdaParams);
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessConfigureRxpFilterReq
  * 
@@ -7687,10 +6711,8 @@
       (WDI_ConfigureRxpFilterReqParamsType *)vos_mem_malloc(
          sizeof(WDI_ConfigureRxpFilterReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiRxpFilterParams) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7709,22 +6731,18 @@
       vos_mem_free(pWlanSuspendParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilter = 
              pWlanSuspendParam->setMcstBcstFilter;
    wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilterSetting = 
              pWlanSuspendParam->configuredMcstBcstFilterSetting;
    
    wdiRxpFilterParams->wdiReqStatusCB = NULL;
-
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pWlanSuspendParam;
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiRxpFilterParams;
-
    wstatus = WDI_ConfigureRxpFilterReq(wdiRxpFilterParams, 
                       (WDI_ConfigureRxpFilterCb)WDA_ConfigureRxpFilterCallback,
                       pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(wstatus))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7734,10 +6752,8 @@
       vos_mem_free(pWdaParams->wdaMsgParam);
       vos_mem_free(pWdaParams);
    }
-
    return status;
 }
-
 /*
  * FUNCTION: WDA_WdiIndicationCallback
  * 
@@ -7747,9 +6763,7 @@
 {
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
 }
-
 /*
  * FUNCTION: WDA_ProcessWlanSuspendInd
  * 
@@ -7759,37 +6773,28 @@
 {
    WDI_Status wdiStatus;
    WDI_SuspendParamsType wdiSuspendParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    wdiSuspendParams.wdiSuspendParams.ucConfiguredMcstBcstFilterSetting =
                           pWlanSuspendParam->configuredMcstBcstFilterSetting;
    wdiSuspendParams.wdiReqStatusCB = WDA_WdiIndicationCallback;
    wdiSuspendParams.pUserData = pWDA;
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanSuspendParam->configuredMcstBcstFilterSetting);
-
-   WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
-
    wdiStatus = WDI_HostSuspendInd(&wdiSuspendParams);
    if(WDI_STATUS_PENDING == wdiStatus)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
               "Pending received for %s:%d ",__FUNCTION__,__LINE__ );
-
    }
    else if( WDI_STATUS_SUCCESS_SYNC != wdiStatus )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
               "Failure in %s:%d ",__FUNCTION__,__LINE__ );
    }
-
    vos_mem_free(pWlanSuspendParam);
    return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
 }
 
-
-
 /*
  * FUNCTION: WDA_ProcessWlanResumeCallback
  * 
@@ -7799,7 +6804,6 @@
                         void*        pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
    if(NULL == pWdaParams)
@@ -7809,20 +6813,16 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    if(WDI_STATUS_SUCCESS != resumeRspParams->wdiStatus)
    {
       VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                   "%s: Process Wlan Resume failure \n", __FUNCTION__ );
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    vos_mem_free(pWdaParams->wdaMsgParam);
    vos_mem_free(pWdaParams);
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessWlanResumeReq
  * 
@@ -7835,10 +6835,8 @@
             (WDI_ResumeParamsType *)vos_mem_malloc(
                                  sizeof(WDI_ResumeParamsType) ) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiResumeParams) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7855,22 +6853,16 @@
       vos_mem_free(wdiResumeParams);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiResumeParams->wdiResumeParams.ucConfiguredMcstBcstFilterSetting =
                           pWlanResumeParam->configuredMcstBcstFilterSetting;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanResumeParam->configuredMcstBcstFilterSetting);
    wdiResumeParams->wdiReqStatusCB = NULL;
    pWdaParams->wdaMsgParam = pWlanResumeParam;
    pWdaParams->wdaWdiApiMsgParam = wdiResumeParams;
    pWdaParams->pWdaContext = pWDA;
-
-   WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr) ;
-
    wdiStatus = WDI_HostResumeReq(wdiResumeParams, 
                       (WDI_HostResumeEventRspCb)WDA_ProcessWlanResumeCallback,
                       pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(wdiStatus))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7880,12 +6872,9 @@
       vos_mem_free(pWdaParams->wdaMsgParam);
       vos_mem_free(pWdaParams);
    }
-
    return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
 }
 
-
-
 /*
  * FUNCTION: WDA_SetBeaconFilterReqCallback
  * 
@@ -7893,10 +6882,8 @@
 void WDA_SetBeaconFilterReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7913,10 +6900,8 @@
     * param here
     */
 
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_SetBeaconFilterReq
  * Request to WDI to send the beacon filtering related information.
@@ -7931,10 +6916,8 @@
             (WDI_BeaconFilterReqParamsType *)vos_mem_malloc(
                                  sizeof(WDI_BeaconFilterReqParamsType) ) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiBeaconFilterInfo) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7951,7 +6934,6 @@
       vos_mem_free(wdiBeaconFilterInfo);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiBeaconFilterInfo->wdiBeaconFilterInfo.usBeaconInterval = 
       pBeaconFilterInfo->beaconInterval;
    wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityInfo = 
@@ -7959,7 +6941,6 @@
    wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityMask = 
       pBeaconFilterInfo->capabilityMask;
    wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum = pBeaconFilterInfo->ieNum;
-
    //Fill structure with info contained in the beaconFilterTable
    dstPtr = (tANI_U8 *)wdiBeaconFilterInfo + sizeof(WDI_BeaconFilterInfoType);
    srcPtr = (tANI_U8 *)pBeaconFilterInfo + sizeof(tBeaconFilterMsg);
@@ -7969,7 +6950,6 @@
       filterLength = WDI_BEACON_FILTER_LEN;
    }
    vos_mem_copy(dstPtr, srcPtr, filterLength);
-
    wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
    /* Store param pointer as passed in by caller */
    /* store Params pass it to WDI */
@@ -7977,10 +6957,8 @@
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pBeaconFilterInfo;
 
-
    status = WDI_SetBeaconFilterReq(wdiBeaconFilterInfo, 
                                    (WDI_SetBeaconFilterCb)WDA_SetBeaconFilterReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -7989,10 +6967,8 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_RemBeaconFilterReqCallback
  * 
@@ -8000,27 +6976,21 @@
 void WDA_RemBeaconFilterReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
    pWDA->wdaWdiApiMsgParam = NULL;
    pWDA->wdaMsgParam = NULL;
    
-
    //print a msg, nothing else to do
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
               "WDA_RemBeaconFilterReqCallback invoked " );
-
    return ;
 }
-
     // TODO: PE does not have this feature for now implemented,
     // but the support for removing beacon filter exists between
     // HAL and FW. This function can be called whenever PE defines
     // a new message for beacon filter removal
-
 /*
  * FUNCTION: WDA_RemBeaconFilterReq
  * Request to WDI to send the removal of beacon filtering related information.
@@ -8033,10 +7003,8 @@
    WDI_RemBeaconFilterReqParamsType *wdiBeaconFilterInfo = 
       (WDI_RemBeaconFilterReqParamsType *)vos_mem_malloc(
          sizeof(WDI_RemBeaconFilterReqParamsType) + pBeaconFilterInfo->ucIeCount) ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiBeaconFilterInfo) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8044,16 +7012,13 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount = 
       pBeaconFilterInfo->ucIeCount;
-
    //Fill structure with info contained in the ucRemIeId
    vos_mem_copy(wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucRemIeId, 
                 pBeaconFilterInfo->ucRemIeId,
                 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount);
    wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
-
    if((NULL != pWDA->wdaMsgParam) ||
                   (NULL != pWDA->wdaWdiApiMsgParam))
    {
@@ -8068,10 +7033,8 @@
    pWDA->wdaMsgParam = pBeaconFilterInfo;
    /* store Params pass it to WDI */
    pWDA->wdaWdiApiMsgParam = (void *)wdiBeaconFilterInfo;
-
    wstatus = WDI_RemBeaconFilterReq(wdiBeaconFilterInfo, 
                                    (WDI_RemBeaconFilterCb)WDA_RemBeaconFilterReqCallback, pWDA);
-
    if(IS_WDI_STATUS_FAILURE(wstatus))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8082,10 +7045,8 @@
       pWDA->wdaWdiApiMsgParam = NULL;
       pWDA->wdaMsgParam = NULL;
    }
-
    return status;
 }
-
 /*
  * FUNCTION: WDA_SetRSSIThresholdsReqCallback
  * 
@@ -8093,10 +7054,8 @@
 void WDA_SetRSSIThresholdsReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8108,10 +7067,8 @@
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
 
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_SetRSSIThresholdsReq
  * Request to WDI to set the RSSI thresholds (sta mode).
@@ -8126,10 +7083,8 @@
       (WDI_SetRSSIThresholdsReqParamsType *)vos_mem_malloc(
          sizeof(WDI_SetRSSIThresholdsReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiRSSIThresholdsInfo) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8146,36 +7101,27 @@
       vos_mem_free(wdiRSSIThresholdsInfo);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bReserved10 = pBmpsThresholds->bReserved10;
-
    wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold1 = pBmpsThresholds->ucRssiThreshold1;
    wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold2 = pBmpsThresholds->ucRssiThreshold2;
    wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold3 = pBmpsThresholds->ucRssiThreshold3;
-
    wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1NegNotify = pBmpsThresholds->bRssiThres1NegNotify;
    wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2NegNotify = pBmpsThresholds->bRssiThres2NegNotify;
    wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3NegNotify = pBmpsThresholds->bRssiThres3NegNotify;
-
    wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1PosNotify = pBmpsThresholds->bRssiThres1PosNotify;
    wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2PosNotify = pBmpsThresholds->bRssiThres2PosNotify;
    wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3PosNotify = pBmpsThresholds->bRssiThres3PosNotify;
-
    wdiRSSIThresholdsInfo->wdiReqStatusCB = NULL;
-
    pVosContext = vos_get_global_context(VOS_MODULE_ID_PE, (void *)pMac);
    pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
 
-
    /* Store param pointer as passed in by caller */
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = wdiRSSIThresholdsInfo;
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pBmpsThresholds;
-
    wstatus = WDI_SetRSSIThresholdsReq(wdiRSSIThresholdsInfo, 
                                      (WDI_SetRSSIThresholdsCb)WDA_SetRSSIThresholdsReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(wstatus))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8184,11 +7130,9 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
    }
-
    return status;
 
 }/*WDA_SetRSSIThresholdsReq*/
-
 /*
  * FUNCTION: WDA_HostOffloadReqCallback
  * 
@@ -8199,7 +7143,6 @@
 
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8215,10 +7158,8 @@
    //print a msg, nothing else to do
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
               "WDA_HostOffloadReqCallback invoked " );
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessHostOffloadReq
  * Request to WDI to set the filter to minimize unnecessary host wakeup due 
@@ -8244,7 +7185,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if(NULL == pWdaParams)
    {
@@ -8260,6 +7200,8 @@
    wdiHostOffloadInfo->wdiHostOffloadInfo.ucEnableOrDisable = 
       pHostOffloadParams->enableOrDisable;
 
+   wdiHostOffloadInfo->wdiHostOffloadInfo.bssIdx = 
+                                    pHostOffloadParams->bssIdx;
    switch (wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType)
    {
       case SIR_IPV4_ARP_REPLY_OFFLOAD:
@@ -8331,9 +7273,7 @@
          //WDA_VOS_ASSERT(0) ;
       }
    }
-
    wdiHostOffloadInfo->wdiReqStatusCB = NULL;
-
    if((NULL != pWDA->wdaMsgParam) ||
                   (NULL != pWDA->wdaWdiApiMsgParam))
    {
@@ -8343,7 +7283,6 @@
       vos_mem_free(wdiHostOffloadInfo);
       return VOS_STATUS_E_FAILURE;
    }
-
    /* Store param pointer as passed in by caller */
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = wdiHostOffloadInfo;
@@ -8362,11 +7301,9 @@
       vos_mem_free(pWdaParams->wdaMsgParam);
       vos_mem_free(pWdaParams) ;
    }
-
    return status;
 
 }/*WDA_HostOffloadReq*/
-
 /*
  * FUNCTION: WDA_KeepAliveReqCallback
  * 
@@ -8374,23 +7311,18 @@
 void WDA_KeepAliveReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    vos_mem_free(pWDA->wdaWdiApiMsgParam);
    vos_mem_free(pWDA->wdaMsgParam);
    pWDA->wdaWdiApiMsgParam = NULL;
    pWDA->wdaMsgParam = NULL; 
    
-
    //print a msg, nothing else to do
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
               "WDA_KeepAliveReqCallback invoked " );
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessKeepAliveReq
  * Request to WDI to send Keep Alive packets to minimize unnecessary host 
@@ -8404,10 +7336,8 @@
     WDI_KeepAliveReqParamsType *wdiKeepAliveInfo = 
       (WDI_KeepAliveReqParamsType *)vos_mem_malloc(
          sizeof(WDI_KeepAliveReqParamsType)) ;
-
     VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
     if(NULL == wdiKeepAliveInfo) 
     {
         VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8415,11 +7345,12 @@
         VOS_ASSERT(0);
         return VOS_STATUS_E_NOMEM;
     }
-
     wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType = 
       pKeepAliveParams->packetType;
     wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod = 
       pKeepAliveParams->timePeriod;
+    wdiKeepAliveInfo->wdiKeepAliveInfo.bssIdx = 
+                                pKeepAliveParams->bssIdx;
 
     if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_UNSOLICIT_ARP_RSP)
     {
@@ -8445,9 +7376,7 @@
                     SIR_MAC_ADDR_LEN,
                     0);
     }
-
     wdiKeepAliveInfo->wdiReqStatusCB = NULL;
-
     if((NULL != pWDA->wdaMsgParam) ||
        (NULL != pWDA->wdaWdiApiMsgParam))
     {
@@ -8457,12 +7386,10 @@
       vos_mem_free(wdiKeepAliveInfo);
       return VOS_STATUS_E_FAILURE;
     }
-
     /* Store param pointer as passed in by caller */
     pWDA->wdaMsgParam = pKeepAliveParams;
     /* store Params pass it to WDI */
     pWDA->wdaWdiApiMsgParam = (void *)wdiKeepAliveInfo;
-
     VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA HIP : %d.%d.%d.%d",
               wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[0],
               wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[1],
@@ -8485,10 +7412,8 @@
               "TimePeriod %d PacketType %d", 
               wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod,
               wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType); 
-
     wstatus = WDI_KeepAliveReq(wdiKeepAliveInfo, 
                              (WDI_KeepAliveCb)WDA_KeepAliveReqCallback, pWDA);
-
     if(IS_WDI_STATUS_FAILURE(wstatus))
     {
         VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8499,11 +7424,9 @@
         pWDA->wdaWdiApiMsgParam = NULL;
         pWDA->wdaMsgParam = NULL;
     }
-
     return status;
 
 }/*WDA_KeepAliveReq*/
-
 /*
  * FUNCTION: WDA_WowlAddBcPtrnReqCallback
  * 
@@ -8511,10 +7434,8 @@
 void WDA_WowlAddBcPtrnReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8522,14 +7443,11 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams->wdaMsgParam);
    vos_mem_free(pWdaParams) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessWowlAddBcPtrnReq
  * Request to WDI to add WOWL Bcast pattern
@@ -8543,10 +7461,8 @@
       (WDI_WowlAddBcPtrnReqParamsType *)vos_mem_malloc(
          sizeof(WDI_WowlAddBcPtrnReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiWowlAddBcPtrnInfo) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8563,7 +7479,6 @@
       vos_mem_free(wdiWowlAddBcPtrnInfo);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternId = 
       pWowlAddBcPtrnParams->ucPatternId;
    wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternByteOffset = 
@@ -8572,7 +7487,6 @@
       pWowlAddBcPtrnParams->ucPatternMaskSize;
    wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize = 
       pWowlAddBcPtrnParams->ucPatternSize;
-
    if (wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize <= WDI_WOWL_BCAST_PATTERN_MAX_SIZE)
    {
        vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
@@ -8600,16 +7514,13 @@
    }
 
    wdiWowlAddBcPtrnInfo->wdiReqStatusCB = NULL;
-
    /* Store param pointer as passed in by caller */
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = wdiWowlAddBcPtrnInfo;
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pWowlAddBcPtrnParams;
-
    wstatus = WDI_WowlAddBcPtrnReq(wdiWowlAddBcPtrnInfo, 
                                  (WDI_WowlAddBcPtrnCb)WDA_WowlAddBcPtrnReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(wstatus))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8619,11 +7530,9 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
    }
-
    return status;
 
 }/*WDA_ProcessWowlAddBcPtrnReq*/
-
 /*
  * FUNCTION: WDA_WowlDelBcPtrnReqCallback
  * 
@@ -8631,10 +7540,8 @@
 void WDA_WowlDelBcPtrnReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8642,14 +7549,11 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams->wdaMsgParam);
    vos_mem_free(pWdaParams) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessWowlDelBcPtrnReq
  * Request to WDI to delete WOWL Bcast pattern
@@ -8663,10 +7567,8 @@
       (WDI_WowlDelBcPtrnReqParamsType *)vos_mem_malloc(
          sizeof(WDI_WowlDelBcPtrnReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiWowlDelBcPtrnInfo) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8683,21 +7585,16 @@
       vos_mem_free(wdiWowlDelBcPtrnInfo);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.ucPatternId = 
       pWowlDelBcPtrnParams->ucPatternId;
-
    wdiWowlDelBcPtrnInfo->wdiReqStatusCB = NULL;
-
    /* Store param pointer as passed in by caller */
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = wdiWowlDelBcPtrnInfo;
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pWowlDelBcPtrnParams;
-
    wstatus = WDI_WowlDelBcPtrnReq(wdiWowlDelBcPtrnInfo, 
                                  (WDI_WowlDelBcPtrnCb)WDA_WowlDelBcPtrnReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(wstatus))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8707,11 +7604,9 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
    }
-
    return status;
 
 }/*WDA_ProcessWowlDelBcPtrnReq*/
-
 /*
  * FUNCTION: WDA_WowlEnterReqCallback
  * 
@@ -8721,10 +7616,8 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
    tWDA_CbContext *pWDA;
    tSirHalWowlEnterParams *pWowlEnterParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8732,22 +7625,16 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
    pWowlEnterParams =  (tSirHalWowlEnterParams *)pWdaParams->wdaMsgParam ;
 
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
 
-
    pWowlEnterParams->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    WDA_SendMsg(pWDA, WDA_WOWL_ENTER_RSP, (void *)pWowlEnterParams , 0) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessWowlEnterReq
  * Request to WDI to enter WOWL 
@@ -8761,10 +7648,8 @@
       (WDI_WowlEnterReqParamsType *)vos_mem_malloc(
          sizeof(WDI_WowlEnterReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiWowlEnterInfo) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8781,35 +7666,25 @@
       vos_mem_free(wdiWowlEnterInfo);
       return VOS_STATUS_E_NOMEM;
    }
-
    vos_mem_copy(wdiWowlEnterInfo->wdiWowlEnterInfo.magicPtrn,
                 pWowlEnterParams->magicPtrn,
                 sizeof(tSirMacAddr));
-
    wdiWowlEnterInfo->wdiWowlEnterInfo.ucMagicPktEnable = 
       pWowlEnterParams->ucMagicPktEnable;
-
    wdiWowlEnterInfo->wdiWowlEnterInfo.ucPatternFilteringEnable = 
       pWowlEnterParams->ucPatternFilteringEnable;
-
    wdiWowlEnterInfo->wdiWowlEnterInfo.ucUcastPatternFilteringEnable = 
       pWowlEnterParams->ucUcastPatternFilteringEnable;
-
    wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowChnlSwitchRcv = 
       pWowlEnterParams->ucWowChnlSwitchRcv;
-
    wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDeauthRcv = 
       pWowlEnterParams->ucWowDeauthRcv;
-
    wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDisassocRcv = 
       pWowlEnterParams->ucWowDisassocRcv;
-
    wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxMissedBeacons = 
       pWowlEnterParams->ucWowMaxMissedBeacons;
-
    wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxSleepUsec = 
       pWowlEnterParams->ucWowMaxSleepUsec;
-
 #ifdef WLAN_WAKEUP_EVENTS
    wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPIDRequestEnable = 
       pWowlEnterParams->ucWoWEAPIDRequestEnable;
@@ -8828,16 +7703,13 @@
 #endif // WLAN_WAKEUP_EVENTS
 
    wdiWowlEnterInfo->wdiReqStatusCB = NULL;
-
    /* Store param pointer as passed in by caller */
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = wdiWowlEnterInfo;
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pWowlEnterParams;
-
    wstatus = WDI_WowlEnterReq(wdiWowlEnterInfo, 
                              (WDI_WowlEnterReqCb)WDA_WowlEnterReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(wstatus))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8847,11 +7719,9 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
    }
-
    return status;
 
 }/*WDA_ProcessWowlEnterReq*/
-
 /*
  * FUNCTION: WDA_WowlExitReqCallback
  * 
@@ -8859,15 +7729,11 @@
 void WDA_WowlExitReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    WDA_SendMsg(pWDA, WDA_WOWL_EXIT_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessWowlExitReq
  * Request to WDI to add WOWL Bcast pattern
@@ -8879,7 +7745,6 @@
 
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    wstatus = WDI_WowlExitReq((WDI_WowlExitReqCb)WDA_WowlExitReqCallback, pWDA);
 
    if(IS_WDI_STATUS_FAILURE(wstatus))
@@ -8892,11 +7757,8 @@
       pWDA->wdaWdiApiMsgParam = NULL;
       pWDA->wdaMsgParam = NULL;
    }
-
    return status;
-
 }/*WDA_ProcessWowlExitReq*/
-
 /*
  * FUNCTION: WDA_IsHwFrameTxTranslationCapable
  * Request to WDI to determine whether a given station is capable of 
@@ -8907,7 +7769,6 @@
 {
    return WDI_IsHwFrameTxTranslationCapable(staIdx);
 }
-
 /*
  * FUNCTION: WDA_NvDownloadReqCallback
  * send NV Download RSP back to PE
@@ -8915,22 +7776,16 @@
 void WDA_NvDownloadReqCallback(WDI_NvDownloadRspInfoType *pNvDownloadRspParams, 
                                                             void* pUserData)
 {
-
    tWDA_CbContext *pWDA= ( tWDA_CbContext *)pUserData;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    /*Cleaning */
    vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
    pWDA->wdaWdiApiMsgParam = NULL;
    pWDA->wdaMsgParam = NULL;
-
    vos_WDAComplete_cback(pWDA->pVosContext);
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessNvDownloadReq
  * Read the NV blob to a buffer and send a request to WDI to download the blob to NV memory.
@@ -8943,10 +7798,8 @@
    v_SIZE_t bufferSize = 0;
    WDI_Status status = WDI_STATUS_E_FAILURE;
    WDI_NvDownloadReqParamsType * wdiNvDownloadReqParam =NULL;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == pWDA) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8962,10 +7815,8 @@
    
    /* Get the NV structure base address and size from VOS */
    vos_nv_getNVBuffer(&pNvBuffer,&bufferSize);
-
    wdiNvDownloadReqParam = (WDI_NvDownloadReqParamsType *)vos_mem_malloc(
                                           sizeof(WDI_NvDownloadReqParamsType)) ;
-
    if(NULL == wdiNvDownloadReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8973,19 +7824,14 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    /* Copy Params to wdiNvDownloadReqParam*/
    wdiNvDownloadReqParam->wdiBlobInfo.pBlobAddress = pNvBuffer;
    wdiNvDownloadReqParam->wdiBlobInfo.uBlobSize = bufferSize;
-
    /* store Params pass it to WDI */
    pWDA->wdaWdiApiMsgParam = (void *)wdiNvDownloadReqParam ;
-
    wdiNvDownloadReqParam->wdiReqStatusCB = NULL ;
-
    status = WDI_NvDownloadReq(wdiNvDownloadReqParam, 
                     (WDI_NvDownloadRspCb)WDA_NvDownloadReqCallback,(void *)pWDA);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -8993,9 +7839,7 @@
       vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
       pWDA->wdaWdiApiMsgParam = NULL;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
-
 }
 /*
  * FUNCTION: WDA_FlushAcReqCallback
@@ -9007,7 +7851,6 @@
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tFlushACReq *pFlushACReqParams;
    tFlushACRsp *pFlushACRspParams;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
    if(NULL == pWdaParams)
@@ -9025,6 +7868,7 @@
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                            "%s: VOS MEM Alloc Failure", __FUNCTION__); 
       VOS_ASSERT(0);
+	  vos_mem_free(pWdaParams);
       return ;
    }
    vos_mem_zero(pFlushACRspParams,sizeof(tFlushACRsp));   
@@ -9033,20 +7877,16 @@
    pFlushACRspParams->ucSTAId = pFlushACReqParams->ucSTAId;
    pFlushACRspParams->ucTid = pFlushACReqParams->ucTid;
    pFlushACRspParams->status = CONVERT_WDI2SIR_STATUS(status) ;
-
    vos_mem_free(pWdaParams->wdaMsgParam) ;
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams);
-
    wdaMsg.type = WDA_TL_FLUSH_AC_RSP ; 
    wdaMsg.bodyptr = (void *)pFlushACRspParams;
    // POST message to TL
    vos_mq_post_message(VOS_MQ_ID_TL, (vos_msg_t *) &wdaMsg);
 
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessFlushAcReq
  * Request to WDI to Update the DELBA REQ params.
@@ -9059,7 +7899,6 @@
                (WDI_FlushAcReqParamsType *)vos_mem_malloc(
                                        sizeof(WDI_FlushAcReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    if(NULL == wdiFlushAcReqParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -9076,24 +7915,19 @@
       vos_mem_free(wdiFlushAcReqParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    wdiFlushAcReqParam->wdiFlushAcInfo.ucSTAId = pFlushAcReqParams->ucSTAId;
    wdiFlushAcReqParam->wdiFlushAcInfo.ucTid = pFlushAcReqParams->ucTid;
    wdiFlushAcReqParam->wdiFlushAcInfo.usMesgLen = pFlushAcReqParams->mesgLen;
    wdiFlushAcReqParam->wdiFlushAcInfo.usMesgType = pFlushAcReqParams->mesgType;
-
    /* Store Flush AC pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pFlushAcReqParams;
    pWdaParams->wdaWdiApiMsgParam = wdiFlushAcReqParam;
-
    status = WDI_FlushAcReq(wdiFlushAcReqParam, 
                            (WDI_FlushAcRspCb)WDA_FlushAcReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -9103,11 +7937,8 @@
       vos_mem_free(pWdaParams) ;
       //TODO: respond to TL with failure
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
-
 }
-
 /*
  * FUNCTION: WDA_BtAmpEventReqCallback
  * 
@@ -9116,11 +7947,10 @@
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA; 
-   WDI_BtAmpEventParamsType *wdiBtAmpEventParam; 
+   WDI_BtAmpEventParamsType *wdiBtAmpEventParam;
 
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -9135,7 +7965,6 @@
    {
       pWDA->wdaAmpSessionOn = VOS_FALSE;
    }
-
    vos_mem_free(pWdaParams->wdaMsgParam) ;
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
@@ -9143,11 +7972,9 @@
     * No respone required for WDA_SIGNAL_BTAMP_EVENT so just free the request 
     * param here
     */
-
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessBtAmpEventReq
  * Request to WDI to Update with BT AMP events.
@@ -9160,10 +7987,8 @@
             (WDI_BtAmpEventParamsType *)vos_mem_malloc(
                                  sizeof(WDI_BtAmpEventParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiBtAmpEventParam) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -9180,21 +8005,16 @@
       vos_mem_free(wdiBtAmpEventParam);
       return VOS_STATUS_E_NOMEM;
    }
-
    wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType = 
       pBtAmpEventParams->btAmpEventType;
-
    wdiBtAmpEventParam->wdiReqStatusCB = NULL;
-
    /* Store BT AMP event pointer, as this will be used for response */
    /* store Params pass it to WDI */
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pBtAmpEventParams;
    pWdaParams->wdaWdiApiMsgParam = wdiBtAmpEventParam;
-
    status = WDI_BtAmpEventReq(wdiBtAmpEventParam, 
                               (WDI_BtAmpEventRspCb)WDA_BtAmpEventReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -9203,16 +8023,13 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
    }
-
    if(BTAMP_EVENT_CONNECTION_START == wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
    {
       pWDA->wdaAmpSessionOn = VOS_TRUE;
    }
    return CONVERT_WDI2VOS_STATUS(status) ;
-
 }
 
-
 #ifdef ANI_MANF_DIAG
 /*
  * FUNCTION: WDA_FTMCommandReqCallback
@@ -9223,26 +8040,21 @@
                                void *usrData)
 {
    tWDA_CbContext *pWDA = (tWDA_CbContext *)usrData ;
-
    if((NULL == pWDA) || (NULL == ftmCmdRspData))
    {
       VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                 "%s, invalid input 0x%x, 0x%x",__FUNCTION__,  pWDA, ftmCmdRspData);
       return;
    }
-
    /* Release Current FTM Command Request */
    vos_mem_free(pWDA->wdaFTMCmdReq);
    pWDA->wdaFTMCmdReq = NULL;
-
 #ifndef WLAN_FTM_STUB
    /* Post FTM Responce to HDD FTM */
    wlan_sys_ftm(ftmCmdRspData);
 #endif /* WLAN_FTM_STUB */
-
    return;
 }
-
 /*
  * FUNCTION: WDA_ProcessFTMCommand
  * Send FTM command to WDI
@@ -9252,7 +8064,6 @@
 {
    WDI_Status             status = WDI_STATUS_SUCCESS;
    WDI_FTMCommandReqType *ftmCMDReq = NULL;
-
    ftmCMDReq = (WDI_FTMCommandReqType *)
                 vos_mem_malloc(sizeof(WDI_FTMCommandReqType));
    if(NULL == ftmCMDReq)
@@ -9261,19 +8072,121 @@
                 "WDA FTM Command buffer alloc fail");
       return VOS_STATUS_E_NOMEM;
    }
-
    ftmCMDReq->bodyLength     = pPTTFtmCmd->msgBodyLength;
    ftmCMDReq->FTMCommandBody = (void *)pPTTFtmCmd;
-
    pWDA->wdaFTMCmdReq        = (void *)ftmCMDReq;
-
    /* Send command to WDI */
    status = WDI_FTMCommandReq(ftmCMDReq, WDA_FTMCommandReqCallback, pWDA);
-
    return status;
 }
 #endif /* ANI_MANF_DIAG */
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/*
+ * FUNCTION: WDA_StartOemDataReqCallback
+ * 
+ */
+void WDA_StartOemDataReqCallback(
+                   WDI_oemDataRspParamsType *wdiOemDataRspParams, 
+                                                        void* pUserData)
+{
+   VOS_STATUS status = VOS_STATUS_E_FAILURE;
+   tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; 
+   tStartOemDataRsp *pOemDataRspParams = NULL ;
 
+   VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+                                          "<------ %s " ,__FUNCTION__);
+   if(NULL == pWDA) 
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                           "%s:pWDA is NULL", __FUNCTION__); 
+      VOS_ASSERT(0);
+      return ;
+   }
+   
+   /* 
+    * Allocate memory for response params sent to PE
+    */
+   pOemDataRspParams = vos_mem_malloc(sizeof(tStartOemDataRsp));
+
+   // Check if memory is allocated for OemdataMeasRsp Params.
+   if(NULL == pOemDataRspParams)
+   {
+      VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                "OEM DATA WDA callback alloc fail");
+      VOS_ASSERT(0) ;
+      return;
+   }
+   // Free the memory allocated during request.
+   vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
+   vos_mem_free(pWDA->wdaMsgParam) ;
+   pWDA->wdaWdiApiMsgParam = NULL;
+   pWDA->wdaMsgParam = NULL;
+   /* 
+    * Now go ahead and copy other stuff for PE in incase of sucess only 
+    * Also, here success always means that we have atleast one BSSID.
+    */
+   vos_mem_copy(pOemDataRspParams->oemDataRsp, wdiOemDataRspParams->oemDataRsp, OEM_DATA_RSP_SIZE);
+ 
+   //enable Tx
+   status = WDA_ResumeDataTx(pWDA);
+   if(status != VOS_STATUS_SUCCESS)
+   {
+      VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, "WDA Resume Data Tx fail");
+   }
+   WDA_SendMsg(pWDA, WDA_START_OEM_DATA_RSP,  (void *)pOemDataRspParams, 0) ;
+   return ;
+}
+/*
+ * FUNCTION: WDA_ProcessStartOemDataReq
+ * Send Start Oem Data Req to WDI
+ */
+VOS_STATUS WDA_ProcessStartOemDataReq(tWDA_CbContext *pWDA, 
+                                 tStartOemDataReq  *pOemDataReqParams)
+{
+   WDI_Status             status = WDI_STATUS_SUCCESS;
+   WDI_oemDataReqParamsType     *wdiOemDataReqParams = NULL;
+
+   wdiOemDataReqParams = (WDI_oemDataReqParamsType*)vos_mem_malloc(sizeof(WDI_oemDataReqParamsType)) ;
+   
+   if(NULL == wdiOemDataReqParams)
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                           "%s: VOS MEM Alloc Failure", __FUNCTION__); 
+      VOS_ASSERT(0);
+      return VOS_STATUS_E_NOMEM;
+   }
+   
+   vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.selfMacAddr, pOemDataReqParams->selfMacAddr, sizeof(tSirMacAddr));
+   vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.oemDataReq, pOemDataReqParams->oemDataReq, OEM_DATA_REQ_SIZE);
+
+   wdiOemDataReqParams->wdiReqStatusCB = NULL;
+
+   if((NULL != pWDA->wdaMsgParam) ||
+                           (NULL != pWDA->wdaWdiApiMsgParam))
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                           "%s:wdaWdiApiMsgParam is Not NULL", __FUNCTION__); 
+      VOS_ASSERT(0);
+      vos_mem_free(wdiOemDataReqParams);
+      return VOS_STATUS_E_FAILURE;
+   }
+   pWDA->wdaMsgParam          =          (void *)pOemDataReqParams;
+   pWDA->wdaWdiApiMsgParam    =          (void *)wdiOemDataReqParams;
+
+   status = WDI_StartOemDataReq(wdiOemDataReqParams, (WDI_oemDataRspCb)WDA_StartOemDataReqCallback, pWDA);
+
+   if(IS_WDI_STATUS_FAILURE(status))
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+         "Failure in Start OEM DATA REQ Params WDI API, free all the memory " );
+      vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
+      vos_mem_free(pWDA->wdaMsgParam);
+      pWDA->wdaWdiApiMsgParam = NULL;
+      pWDA->wdaMsgParam = NULL;
+   }
+   return CONVERT_WDI2VOS_STATUS(status) ;
+}
+#endif /* FEATURE_OEM_DATA_SUPPORT */
 /*
  * FUNCTION: WDA_SetTxPerTrackingReqCallback
  * 
@@ -9281,10 +8194,8 @@
 void WDA_SetTxPerTrackingReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -9297,17 +8208,14 @@
    {
       vos_mem_free(pWdaParams->wdaMsgParam);
    }
-
    if(NULL != pWdaParams->wdaWdiApiMsgParam)
    {
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    }
    
    vos_mem_free(pWdaParams);
-
    return ;
 }
-
 #ifdef WLAN_FEATURE_GTK_OFFLOAD
 /*
  * FUNCTION: WDA_HostOffloadReqCallback
@@ -9468,10 +8376,8 @@
       (WDI_SetTxPerTrackingReqParamsType *)vos_mem_malloc(
          sizeof(WDI_SetTxPerTrackingReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == pwdiSetTxPerTrackingReqParams) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -9490,7 +8396,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingEnable = 
       pTxPerTrackingParams->ucTxPerTrackingEnable;
    pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingPeriod = 
@@ -9499,19 +8404,15 @@
       pTxPerTrackingParams->ucTxPerTrackingRatio;
    pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.uTxPerTrackingWatermark = 
       pTxPerTrackingParams->uTxPerTrackingWatermark;
-
    pwdiSetTxPerTrackingReqParams->wdiReqStatusCB = NULL;
-
    /* Store param pointer as passed in by caller */
    /* store Params pass it to WDI 
       Ideally, the memory allocated here will be free at WDA_SetTxPerTrackingReqCallback */
    pWdaParams->wdaWdiApiMsgParam = pwdiSetTxPerTrackingReqParams;
    pWdaParams->pWdaContext = pWDA;
    pWdaParams->wdaMsgParam = pTxPerTrackingParams;
-
    wstatus = WDI_SetTxPerTrackingReq(pwdiSetTxPerTrackingReqParams, 
                                     (WDI_SetTxPerTrackingRspCb)WDA_SetTxPerTrackingReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(wstatus))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -9521,11 +8422,9 @@
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       vos_mem_free(pWdaParams) ;
    }
-
    return status;
 
 }/*WDA_ProcessSetTxPerTrackingReq*/
-
 /*
  * FUNCTION: WDA_HALDumpCmdCallback
  * Send the VOS complete . 
@@ -9536,7 +8435,6 @@
    tANI_U8 *buffer = NULL;
    tWDA_CbContext *pWDA = NULL;
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -9547,23 +8445,19 @@
    
    pWDA = pWdaParams->pWdaContext;
    buffer = (tANI_U8 *)pWdaParams->wdaMsgParam;
-
    if(wdiRspParams->usBufferLen > 0)
    {
       /*Copy the Resp data to UMAC supplied buffer*/
       vos_mem_copy(buffer, wdiRspParams->pBuffer, wdiRspParams->usBufferLen);
    }
-
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams);
    
    /* Indicate VOSS about the start complete */
    vos_WDAComplete_cback(pWDA->pVosContext);
-
    return ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessHALDumpCmdReq
  * Send Dump command to WDI
@@ -9578,7 +8472,6 @@
    tWDA_ReqParams *pWdaParams ;
    pVosContextType pVosContext = NULL; 
    VOS_STATUS vStatus;
-
    pVosContext = (pVosContextType)vos_get_global_context(VOS_MODULE_ID_PE,
                                                            (void *)pMac);
    
@@ -9589,7 +8482,6 @@
                            "%s: VOS MEM Alloc Failure", __FUNCTION__); 
       return VOS_STATUS_E_NOMEM;
    }
-
    /* Allocate memory WDI request structure*/
    wdiHALDumpCmdReqParam = (WDI_HALDumpCmdReqParamsType *)
                 vos_mem_malloc(sizeof(WDI_HALDumpCmdReqParamsType));
@@ -9600,18 +8492,14 @@
       vos_mem_free(pWdaParams);
       return WDI_STATUS_E_FAILURE;
    }
-
    wdiHalDumpCmdInfo = &wdiHALDumpCmdReqParam->wdiHALDumpCmdInfoType;
-
    /* Extract the arguments */
    wdiHalDumpCmdInfo->command     = cmd;
    wdiHalDumpCmdInfo->argument1   = arg1;
    wdiHalDumpCmdInfo->argument2   = arg2;
    wdiHalDumpCmdInfo->argument3   = arg3;
    wdiHalDumpCmdInfo->argument4   = arg4;
-
    wdiHALDumpCmdReqParam->wdiReqStatusCB = NULL ;
-
    pWdaParams->pWdaContext = pVosContext->pWDAContext;
    
    /*  Response message will be passed through the buffer */
@@ -9619,12 +8507,9 @@
    
    /* store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)wdiHALDumpCmdReqParam ;
-
    /* Send command to WDI */
    status = WDI_HALDumpCmdReq(wdiHALDumpCmdReqParam, WDA_HALDumpCmdCallback, pWdaParams);
-
    vStatus = vos_wait_single_event( &(pVosContext->wdaCompleteEvent), 1000 );
-
    if ( vStatus != VOS_STATUS_SUCCESS )
    {
       if ( vStatus == VOS_STATUS_E_TIMEOUT )
@@ -9641,7 +8526,6 @@
    }
    return status;
 }
-
 #ifdef WLAN_FEATURE_GTK_OFFLOAD
 /*
  * FUNCTION: WDA_ProcessGTKOffloadgetInfoReq
@@ -9706,7 +8590,6 @@
  * DATA interface with WDI for Mgmt Frames
  * ------------------------------------------------------------------------- 
  */
-
 /*
  * FUNCTION: WDA_TxComplete
  * Callback function for the WDA_TxPacket
@@ -9726,7 +8609,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    /*check whether the callback is null or not,made null during WDA_TL_TX_FRAME_TIMEOUT timeout*/
    if( NULL!=wdaContext->pTxCbFunc) 
    {
@@ -9743,7 +8625,6 @@
          //Return from here since we reaching here because the packet already timeout
          return status;
       }
-
    }
 
    /* 
@@ -9759,10 +8640,8 @@
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, 
                       "NEW VOS Event Set failed - status = %d \n", status);
    }
-
    return status;
 }
-
 /*
  * FUNCTION: WDA_TxPacket
  * Forward TX management frame to WDI
@@ -9784,7 +8663,6 @@
    tANI_U8 eventIdx = 0;
    tBssSystemRole systemRole = eSYSTEM_UNKNOWN_ROLE;
    tpAniSirGlobal pMac;
-
    if((NULL == pWDA)||(NULL == pFrmBuf)) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -9796,7 +8674,6 @@
    
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH, 
                "Tx Mgmt Frame Subtype: %d alloc(%x)\n", pFc->subType, pFrmBuf);
-
    pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
    if(NULL == pMac)
    {
@@ -9813,30 +8690,38 @@
    /* store the call back for the function of ackTxComplete */
    if( pAckTxComp )
    {
-      if( NULL == pWDA->pAckTxCbFunc )
-      {
-         txFlag |= HAL_TXCOMP_REQUESTED_MASK;
-         pWDA->pAckTxCbFunc = pAckTxComp;
-         if( VOS_STATUS_SUCCESS !=
-                 WDA_START_TIMER(&pWDA->wdaTimers.TxCompleteTimer) ) 
-         {
-            VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
-                                "Tx Complete Timer Start Failed ");
-            pWDA->pAckTxCbFunc = NULL;
-            pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
-            return VOS_STATUS_E_FAILURE;
-         }
-      }
-      else
-      {
-         /* Already TxComp is active no need to active again */
-         VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, 
-                       "There is already one request pending for tx complete\n");
-         pCompFunc(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf);
-         return VOS_STATUS_E_FAILURE;
-      }
-   } 
+       if( NULL != pWDA->pAckTxCbFunc )
+       {
+           /* Already TxComp is active no need to active again */
+           VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, 
+                   "There is already one request pending for tx complete\n");
+           pWDA->pAckTxCbFunc( pMac, 0);
+           pWDA->pAckTxCbFunc = NULL;
 
+           if( VOS_STATUS_SUCCESS !=
+                   WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
+           {
+               VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                       "Tx Complete timeout Timer Stop Failed ");
+           }
+           else
+           {
+               VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                       "Tx Complete timeout Timer Stop Sucess ");
+           }
+       }
+
+       txFlag |= HAL_TXCOMP_REQUESTED_MASK;
+       pWDA->pAckTxCbFunc = pAckTxComp;
+       if( VOS_STATUS_SUCCESS !=
+               WDA_START_TIMER(&pWDA->wdaTimers.TxCompleteTimer) ) 
+       {
+           VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+                   "Tx Complete Timer Start Failed ");
+           pWDA->pAckTxCbFunc = NULL;
+           return eHAL_STATUS_FAILURE;
+       }
+   } 
    /* Reset the event to be not signalled */
    status = vos_event_reset(&pWDA->txFrameEvent);
    if(!VOS_IS_STATUS_SUCCESS(status))
@@ -9856,10 +8741,8 @@
       }
       return VOS_STATUS_E_FAILURE;
    }
-
    /* Get system role, use the self station if in unknown role or STA role */
    systemRole = wdaGetGlobalSystemRole(pMac);
-
    if (( eSYSTEM_UNKNOWN_ROLE == systemRole ) || 
        (( eSYSTEM_STA_ROLE == systemRole )
 #ifdef FEATURE_WLAN_CCX
@@ -9870,27 +8753,18 @@
        txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
    }
 
-   /* Do not divert Disassoc/Deauth frames through self station because a delay of
-    * 300ms is added beofre trigerring DEL STA so let deuath gets delivered at TIM */
-   if ((pFc->type == SIR_MAC_MGMT_FRAME)) 
+   /* Divert Disassoc/Deauth frames thru self station, as by the time unicast
+      disassoc frame reaches the HW, HAL has already deleted the peer station */
+   if ((pFc->type == SIR_MAC_MGMT_FRAME))
    {
-       if ((pFc->subType == SIR_MAC_MGMT_DISASSOC) || 
-               (pFc->subType == SIR_MAC_MGMT_DEAUTH) || 
-               (pFc->subType == SIR_MAC_MGMT_REASSOC_RSP) || 
-               (pFc->subType == SIR_MAC_MGMT_PROBE_REQ)) 
+       if ((pFc->subType == SIR_MAC_MGMT_DISASSOC) ||
+               (pFc->subType == SIR_MAC_MGMT_DEAUTH) ||
+               (pFc->subType == SIR_MAC_MGMT_REASSOC_RSP) ||
+               (pFc->subType == SIR_MAC_MGMT_PROBE_REQ))
        {
-           if( (systemRole == eSYSTEM_AP_ROLE) && ( (pFc->subType == SIR_MAC_MGMT_DEAUTH) ||
-                                                    (pFc->subType == SIR_MAC_MGMT_DISASSOC) ) )
-           {
-              /*Do not request self STA for deauth/disassoc let it go through peer STA and
-               *broadcast STA and get delivered at TIM for power save stations*/
-           }
-           else
-           {
              /*Send Probe request frames on self sta idx*/
              txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
-           }
-       } 
+       }
        /* Since we donot want probe responses to be retried, send probe responses
           through the NO_ACK queues */
        if (pFc->subType == SIR_MAC_MGMT_PROBE_RSP) 
@@ -9903,7 +8777,6 @@
           txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
        }
    }
-   
    vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)pFrmBuf);/*set VosPacket_freed to pFrmBuf*/
 
    /*Set frame tag to 0 
@@ -9932,7 +8805,6 @@
       } 
       return VOS_STATUS_E_FAILURE;
    }
-
    /* 
     * Wait for the event to be set by the TL, to get the response of TX 
     * complete, this event should be set by the Callback function called by TL 
@@ -9944,7 +8816,6 @@
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, 
                  "%s: Status %d when waiting for TX Frame Event",
                  __FUNCTION__, status);
-
       pWDA->pTxCbFunc = NULL;   /*To stop the limTxComplete being called again  , 
                                 after the packet gets completed(packet freed once)*/
 
@@ -9967,11 +8838,8 @@
       }
       status = VOS_STATUS_E_FAILURE;
    }
-
    return status;
 }
-
-
 /*
  * FUNCTION: WDA_McProcessMsg
  * Trigger DAL-AL to start CFG download 
@@ -9980,7 +8848,6 @@
 {
    VOS_STATUS status = VOS_STATUS_SUCCESS;
    tWDA_CbContext *pWDA = NULL ; 
-
    if(NULL == pMsg) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -9998,16 +8865,15 @@
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                            "%s:pWDA is NULL", __FUNCTION__); 
       VOS_ASSERT(0);
+	  vos_mem_free(pMsg->bodyptr);
       return VOS_STATUS_E_FAILURE;
    }
-
    /* Process all the WDA messages.. */
    switch( pMsg->type )
    {
       case WNI_CFG_DNLD_REQ:
       {
          status = WDA_WniCfgDnld(pWDA);
-
          /* call WDA complete event if config download success */
          if( VOS_IS_STATUS_SUCCESS(status) )
          {
@@ -10020,7 +8886,6 @@
          }
          break ;
       }
-
       /* 
        * Init SCAN request from PE, convert it into DAL format 
        * and send it to DAL 
@@ -10095,7 +8960,6 @@
                  VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                             "STA %d BSS %d TX RING empty %d", staIdx, bssIdx );
                  break;
-
              }
              else
              {
@@ -10104,6 +8968,13 @@
                      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
                                 "TX Ring could not empty, not normal" );
                      VOS_ASSERT(0);
+                     /* STA mode, stall detected, reload driver */
+                     if(VOS_STA_MODE == vos_get_conparam())
+                     {
+                        vos_mem_free(pMsg->bodyptr);
+                        vos_wlanRestart();
+                        return VOS_STATUS_E_FAILURE;
+                     }
                      break;
                  }
                  vos_sleep(WDA_WAIT_MSEC_TILL_RING_EMPTY);
@@ -10136,6 +9007,13 @@
                      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
                                 "TX Ring could not empty, not normal" );
                      VOS_ASSERT(0);
+                     /* STA mode, stall detected, reload driver */
+                     if(VOS_STA_MODE == vos_get_conparam())
+                     {
+                        vos_mem_free(pMsg->bodyptr);
+                        vos_wlanRestart();
+                        return VOS_STATUS_E_FAILURE;
+                     }
                      break;
                  }
                  vos_sleep(WDA_WAIT_MSEC_TILL_RING_EMPTY);
@@ -10333,7 +9211,6 @@
          }
          break;
       }
-
       case WDA_REGISTER_PE_CALLBACK :
       {
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
@@ -10414,7 +9291,6 @@
          WDA_ProcessAddStaSelfReq(pWDA, (tAddStaSelfParams *)pMsg->bodyptr);
          break;
       }
-
       case WDA_DEL_STA_SELF_REQ:
       {
          WDA_ProcessDelSTASelfReq(pWDA, (tDelStaSelfParams *)pMsg->bodyptr);
@@ -10503,7 +9379,6 @@
          break;
       }
 #endif /* WLAN_FEATURE_VOWIFI_11R */
-
 #ifdef ANI_MANF_DIAG
       case WDA_FTM_CMD_REQ:
       {
@@ -10511,8 +9386,13 @@
          break ;
       }
 #endif /* ANI_MANF_DIAG */
-
-
+#ifdef FEATURE_OEM_DATA_SUPPORT
+      case WDA_START_OEM_DATA_REQ:
+      {
+         WDA_ProcessStartOemDataReq(pWDA, (tStartOemDataReq *)pMsg->bodyptr) ;
+         break;
+      }
+#endif /* FEATURE_OEM_DATA_SUPPORT */
       /* Tx Complete Time out Indication */
       case WDA_TX_COMPLETE_TIMEOUT_IND:
       {
@@ -10525,7 +9405,6 @@
                         (tSirWlanSuspendParam *)pMsg->bodyptr) ;
          break;
       }
-
       case WDA_WLAN_RESUME_REQ:
       {
          WDA_ProcessWlanResumeReq(pWDA, 
@@ -10556,7 +9435,6 @@
          break;
       }
 #endif // FEATURE_WLAN_SCAN_PNO
-
       case WDA_SET_TX_PER_TRACKING_REQ:
       {
          WDA_ProcessSetTxPerTrackingReq(pWDA, (tSirTxPerTrackingParam *)pMsg->bodyptr);
@@ -10569,19 +9447,16 @@
          WDA_Process8023MulticastListReq(pWDA, (tSirRcvFltMcAddrList *)pMsg->bodyptr);
          break;
       }
-
       case WDA_RECEIVE_FILTER_SET_FILTER_REQ:
       {
          WDA_ProcessReceiveFilterSetFilterReq(pWDA, (tSirRcvPktFilterCfgType *)pMsg->bodyptr);
          break;
       }
-
       case WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ:
       {
          WDA_ProcessPacketFilterMatchCountReq(pWDA, (tpSirRcvFltPktMatchRsp)pMsg->bodyptr);
          break;
       }
-
       case WDA_RECEIVE_FILTER_CLEAR_FILTER_REQ:
       {
          WDA_ProcessReceiveFilterClearFilterReq(pWDA, (tSirRcvFltPktClearParam *)pMsg->bodyptr);
@@ -10595,13 +9470,11 @@
          WDA_ProcessTxControlInd(pWDA, (tpTxControlParams)pMsg->bodyptr);
          break;
       }
-
       case WDA_SET_POWER_PARAMS_REQ:
       {
          WDA_ProcessSetPowerParamsReq(pWDA, (tSirSetPowerParamsReq *)pMsg->bodyptr);
          break;
       }
-
 #ifdef WLAN_FEATURE_GTK_OFFLOAD
       case WDA_GTK_OFFLOAD_REQ:
       {
@@ -10635,11 +9508,9 @@
          //WDA_VOS_ASSERT(0) ;
       }
    }
-
    return status ;
 }
 
-
 /*
  * FUNCTION: WDA_LowLevelIndCallback
  * IND API callback from WDI, send Ind to PE
@@ -10651,7 +9522,6 @@
 #if defined WLAN_FEATURE_NEIGHBOR_ROAMING
    tSirRSSINotification rssiNotification;
 #endif
-
    if(NULL == pWDA)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -10666,7 +9536,6 @@
       {
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                      "Received WDI_HAL_RSSI_NOTIFICATION_IND from WDI ");
-
 #if defined WLAN_FEATURE_NEIGHBOR_ROAMING
          rssiNotification.bReserved = 
             wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bReserved;
@@ -10682,7 +9551,6 @@
             wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3NegCross;
          rssiNotification.bRssiThres3PosCross = 
             wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3PosCross;
-
          WLANTL_BMPSRSSIRegionChangedNotification(
             pWDA->pVosContext,
             &rssiNotification);
@@ -10693,7 +9561,6 @@
       {
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                      "Received WDI_MISSED_BEACON_IND from WDI ");
-
          /* send IND to PE */
          WDA_SendMsg(pWDA, WDA_MISSED_BEACON_IND, NULL, 0) ;
          break ;
@@ -10719,7 +9586,6 @@
          }
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                   "Received WDI_MIC_FAILURE_IND from WDI ");
-
          pMicInd->messageType = eWNI_SME_MIC_FAILURE_IND;
          pMicInd->length = sizeof(tSirSmeMicFailureInd);
          vos_mem_copy(pMicInd->bssId,
@@ -10745,7 +9611,6 @@
              wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucIV1;
          vos_mem_copy(pMicInd->info.TSC,
              wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
-
          WDA_SendMsg(pWDA, SIR_HAL_MIC_FAILURE_IND, 
                                        (void *)pMicInd , 0) ;
          break ;
@@ -10759,7 +9624,6 @@
       }
       case WDI_DEL_STA_IND:
       {
-
          tpDeleteStaContext  pDelSTACtx = 
             (tpDeleteStaContext)vos_mem_malloc(sizeof(tDeleteStaContext));
          
@@ -10774,21 +9638,17 @@
          vos_mem_copy(pDelSTACtx->addr2,
              wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macADDR2,
              sizeof(tSirMacAddr));
-
          vos_mem_copy(pDelSTACtx->bssId,
              wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macBSSID,
              sizeof(tSirMacAddr));
-
          pDelSTACtx->assocId    = 
           wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.usAssocId;
          pDelSTACtx->reasonCode = 
           wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.wptReasonCode;
          pDelSTACtx->staId      = 
           wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.ucSTAIdx;
-
          WDA_SendMsg(pWDA, SIR_LIM_DELETE_STA_CONTEXT_IND, 
                                        (void *)pDelSTACtx , 0) ;
-
          break ;
       }
       case WDI_COEX_IND:
@@ -10804,23 +9664,19 @@
          }
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                   "Received WDI_COEX_IND from WDI ");
-
          /* Message Header */
          pSmeCoexInd->mesgType = eWNI_SME_COEX_IND;
          pSmeCoexInd->mesgLen = sizeof(tSirSmeCoexInd);
-
          /* Info from WDI Indication */
          pSmeCoexInd->coexIndType = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndType; 
          for (index = 0; index < SIR_COEX_IND_DATA_SIZE; index++)
          {
             pSmeCoexInd->coexIndData[index] = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndData[index]; 
          }
-
          /* VOS message wrapper */
          vosMsg.type = eWNI_SME_COEX_IND;
          vosMsg.bodyptr = (void *)pSmeCoexInd;
          vosMsg.bodyval = 0;
-
          /* Send message to SME */
          if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
          {
@@ -10869,10 +9725,8 @@
       {
          tSirP2PNoaAttr   *pP2pNoaAttr = 
             (tSirP2PNoaAttr *)vos_mem_malloc(sizeof(tSirP2PNoaAttr));
-
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                               "Received WDI_P2P_NOA_ATTR_IND from WDI");
-
          if (NULL == pP2pNoaAttr)
          {
             VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -10880,7 +9734,6 @@
                        "WDI_P2P_NOA_ATTR_IND not forwarded");
             break;
          }
-
          pP2pNoaAttr->index            = 
                     wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucIndex;
          pP2pNoaAttr->oppPsFlag        = 
@@ -10896,7 +9749,6 @@
                     wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Interval;
          pP2pNoaAttr->uNoa1StartTime   = 
                     wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1StartTime;
-
          pP2pNoaAttr->uNoa2IntervalCnt = 
                     wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa2IntervalCnt;
          pP2pNoaAttr->uNoa2Duration    = 
@@ -10905,22 +9757,18 @@
                     wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Interval;
          pP2pNoaAttr->uNoa2StartTime   = 
                     wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2StartTime;
-
          WDA_SendMsg(pWDA, SIR_HAL_P2P_NOA_ATTR_IND, 
                                        (void *)pP2pNoaAttr , 0) ;
          break;
       }
 #endif
-
 #ifdef FEATURE_WLAN_SCAN_PNO
       case WDI_PREF_NETWORK_FOUND_IND:
       {
          vos_msg_t vosMsg;
          tSirPrefNetworkFoundInd *pPrefNetworkFoundInd = (tSirPrefNetworkFoundInd *)vos_mem_malloc(sizeof(tSirPrefNetworkFoundInd));
-
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                               "Received WDI_PREF_NETWORK_FOUND_IND from WDI");
-
          if (NULL == pPrefNetworkFoundInd)
          {
             VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -10928,7 +9776,6 @@
                        "WDI_PREF_NETWORK_FOUND_IND not forwarded");
             break;
          }
-
          /* Message Header */
          pPrefNetworkFoundInd->mesgType = eWNI_SME_PREF_NETWORK_FOUND_IND;
          pPrefNetworkFoundInd->mesgLen = sizeof(*pPrefNetworkFoundInd);
@@ -10936,27 +9783,21 @@
          /* Info from WDI Indication */ 
          pPrefNetworkFoundInd->ssId.length = 
             wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength;
-
          vos_mem_set( pPrefNetworkFoundInd->ssId.ssId, 32, 0);
-
          vos_mem_copy( pPrefNetworkFoundInd->ssId.ssId, 
                   wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID, 
                   pPrefNetworkFoundInd->ssId.length);
-
          pPrefNetworkFoundInd ->rssi = wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.rssi; 
-
          /* VOS message wrapper */
          vosMsg.type = eWNI_SME_PREF_NETWORK_FOUND_IND;
          vosMsg.bodyptr = (void *) pPrefNetworkFoundInd;
          vosMsg.bodyval = 0;
-
          /* Send message to SME */
          if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
          {
             /* free the mem and return */
             vos_mem_free((v_VOID_t *) pPrefNetworkFoundInd);
          }
-
          break;
       }
 #endif // FEATURE_WLAN_SCAN_PNO
@@ -11025,7 +9866,6 @@
          vosMsg.type = eWNI_SME_TX_PER_HIT_IND;
          vosMsg.bodyptr = NULL;
          vosMsg.bodyval = 0;
-
          /* Send message to SME */
          if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
          {
@@ -11044,17 +9884,14 @@
    return ;
 }
 
-
 /*
  * BA related processing in WDA.
  */
-
 void WDA_TriggerBaReqCallback(WDI_TriggerBARspParamsType *wdiTriggerBaRsp, 
                                                              void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
    tWDA_CbContext *pWDA;
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11062,16 +9899,12 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
-
    vos_mem_free(pWdaParams->wdaMsgParam) ;
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(WDI_STATUS_SUCCESS == wdiTriggerBaRsp->wdiStatus)
    {
       tANI_U8 i = 0 ;
@@ -11081,9 +9914,7 @@
                            + sizeof(tAddBaCandidate) * (baCandidateCount) ;
       WDI_TriggerBARspCandidateType *wdiBaCandidate = NULL ; 
       tAddBaCandidate *baCandidate = NULL ;
-
       baActivityInd =  (tBaActivityInd *)vos_mem_malloc(allocSize) ;
-
       if(NULL == baActivityInd) 
       { 
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11091,7 +9922,6 @@
          VOS_ASSERT(0) ;
          return; 
       }
-
       vos_mem_copy(baActivityInd->bssId, wdiTriggerBaRsp->macBSSID, 
                                                     sizeof(tSirMacAddr)) ;
       baActivityInd->baCandidateCnt = baCandidateCount ;
@@ -11106,7 +9936,6 @@
          baCandidate = (baCandidate + i) ;
          vos_mem_copy(baCandidate->staAddr, wdiBaCandidate->macSTA, 
                                                    sizeof(tSirMacAddr)) ;
-
          for(tid = 0 ; tid < STACFG_MAX_TC; tid++)
          {
              baCandidate->baInfo[tid].fBaEnable = 
@@ -11115,7 +9944,6 @@
                               wdiBaCandidate->wdiBAInfo[tid].startingSeqNum ;
          }
       }
-
       WDA_SendMsg(pWDA, SIR_LIM_ADD_BA_IND, (void *)baActivityInd , 0) ;
    }
    else
@@ -11123,11 +9951,8 @@
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                             "BA Trigger RSP with Failure received ");
    }
-
    return ;
-
 }
-
 /*
  * BA Activity check timer handler
  */
@@ -11160,7 +9985,6 @@
       {
          tANI_U32 txPktCount = 0 ;
          tANI_U8 validStaIndex = pWDA->wdaStaInfo[curSta].ucValidStaIndex ;
-
          if((WDA_VALID_STA_INDEX == validStaIndex) &&
             (VOS_STATUS_SUCCESS == WDA_TL_GET_TX_PKTCOUNT( pWDA->pVosContext,
                                                     curSta, tid, &txPktCount)))
@@ -11182,7 +10006,6 @@
             pWDA->wdaStaInfo[curSta].framesTxed[tid] = txPktCount ;
          }
       }
-
       /* fill the entry for all the sta with given TID's */
       if(WDA_ENABLE_BA == newBaCandidate)
       { 
@@ -11193,7 +10016,6 @@
          newBaCandidate = WDA_DISABLE_BA ;
       } 
    }
-
    /* prepare and send message to hal */
    if( 0 < baCandidateCount)
    {
@@ -11201,7 +10023,6 @@
       WDI_TriggerBAReqParamsType *wdiTriggerBaReq;
       tWDA_ReqParams *pWdaParams = 
                (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
-
       if(NULL == pWdaParams) 
       {
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11219,7 +10040,6 @@
          vos_mem_free(pWdaParams);
          return; 
       }
-
       do
       {
          WDI_TriggerBAReqinfoType *triggerBaInfo = 
@@ -11234,7 +10054,6 @@
       wdiTriggerBaReq->wdiReqStatusCB = NULL ;
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
       pWdaParams->pWdaContext = pWDA;
       pWdaParams->wdaWdiApiMsgParam = wdiTriggerBaReq ;
       pWdaParams->wdaMsgParam = NULL; 
@@ -11254,7 +10073,6 @@
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
                               "There is no TID for initiating BA");
    }
-
    if( VOS_STATUS_SUCCESS != 
          WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
    {
@@ -11271,13 +10089,11 @@
    }
    return ;
 }
-
 /*
  * WDA common routine to create timer used by WDA.
  */
 static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA)
 {
-
    VOS_STATUS status = VOS_STATUS_SUCCESS ;
    tANI_U32 val = 0 ;
    tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
@@ -11308,14 +10124,11 @@
                                "Unable to create BA activity timer");
       return eSIR_FAILURE ;
    }
-
    val = SYS_MS_TO_TICKS( WDA_TX_COMPLETE_TIME_OUT_VALUE ) ; 
-
    /* Tx Complete Timeout timer */
    status = WDA_CREATE_TIMER(&pWDA->wdaTimers.TxCompleteTimer,
                          "Tx Complete Check timer", WDA_TimerHandler,
                          WDA_TX_COMPLETE_TIMEOUT_IND, val, val, TX_NO_ACTIVATE) ;
-
    if(status != TX_SUCCESS)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11330,17 +10143,14 @@
       } 
       return eSIR_FAILURE ;
    }
-
    return eSIR_SUCCESS ;
 }
-
 /*
  * WDA common routine to destroy timer used by WDA.
  */
 static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA)
 {
    VOS_STATUS status = VOS_STATUS_SUCCESS ;
-
    status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.TxCompleteTimer);
    if(status != TX_SUCCESS)
    {
@@ -11348,7 +10158,6 @@
                                "Unable to Destroy Tx Complete Timeout timer");
       return eSIR_FAILURE ;
    }
-
    status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
    if(status != TX_SUCCESS)
    {
@@ -11359,7 +10168,6 @@
                            
    return eSIR_SUCCESS ;
 }
-
 /*
  * WDA timer handler.
  */
@@ -11367,30 +10175,25 @@
 {
    VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
    vos_msg_t wdaMsg = {0} ;
-
    /*
     * trigger CFG download in WDA by sending WDA_CFG_DNLD message
     */ 
    wdaMsg.type = timerInfo ; 
    wdaMsg.bodyptr = NULL;
    wdaMsg.bodyval = 0;
-
    /* post the message.. */
    vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
    if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
    {
       vosStatus = VOS_STATUS_E_BADMSG;
    }
-
 }
-
 /*
  * WDA Tx Complete timeout Indication.
  */
 void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pWDA)
 {
    tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
-
    if( pWDA->pAckTxCbFunc )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11403,9 +10206,7 @@
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
             "There is no request pending for TxComplete and wait timer expired\n");
    }
-
 }
-
 /*
  * WDA Set REG Domain to VOS NV
  */
@@ -11419,7 +10220,6 @@
 }
 #endif  /* FEATURE_WLAN_INTEGRATED_SOC */
 
-
 #ifdef FEATURE_WLAN_SCAN_PNO
 /*
  * FUNCTION: WDA_PNOScanReqCallback
@@ -11428,10 +10228,8 @@
 void WDA_PNOScanReqCallback(WDI_Status status, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
     if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11439,14 +10237,12 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    if( pWdaParams != NULL )
    {
       if( pWdaParams->wdaWdiApiMsgParam != NULL )
       {
          vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       }
-
       if( pWdaParams->wdaMsgParam != NULL)
       {
          vos_mem_free(pWdaParams->wdaMsgParam);
@@ -11457,7 +10253,6 @@
 
    return ;
 }
-
 /*
  * FUNCTION: WDA_UpdateScanParamsCallback
  * 
@@ -11465,10 +10260,8 @@
 void WDA_UpdateScanParamsCallback(WDI_Status status, void* pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
     if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11476,35 +10269,30 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    if( pWdaParams != NULL )
    {
       if( pWdaParams->wdaWdiApiMsgParam != NULL )
       {
          vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       }
-
       if( pWdaParams->wdaMsgParam != NULL)
       {
          vos_mem_free(pWdaParams->wdaMsgParam);
       }
       vos_mem_free(pWdaParams) ;
    }
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_SetPowerParamsCallback
  * 
  */ 
 void WDA_SetPowerParamsCallback(WDI_Status status, void* pUserData)
 {
-   tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; 
+   tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
 
      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
     if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11512,24 +10300,20 @@
       VOS_ASSERT(0) ;
       return ;
    }
-
    if( pWdaParams != NULL )
    {
       if( pWdaParams->wdaWdiApiMsgParam != NULL )
       {
          vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
       }
-
       if( pWdaParams->wdaMsgParam != NULL)
       {
          vos_mem_free(pWdaParams->wdaMsgParam);
       }
       vos_mem_free(pWdaParams) ;
    }
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessSetPreferredNetworkList
  * Request to WDI to set Preferred Network List.Offload
@@ -11542,10 +10326,8 @@
       (WDI_PNOScanReqParamsType *)vos_mem_malloc(sizeof(WDI_PNOScanReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
    v_U8_t   i; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == pwdiPNOScanReqInfo) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11553,7 +10335,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if(NULL == pWdaParams)
    {
@@ -11563,49 +10344,39 @@
       vos_mem_free(pwdiPNOScanReqInfo);
       return VOS_STATUS_E_NOMEM;
    }
-
    //
    // Fill wdiPNOScanReqInfo->wdiPNOScanInfo from pPNOScanReqParams
    //
    pwdiPNOScanReqInfo->wdiPNOScanInfo.bEnable = pPNOScanReqParams->enable;
    pwdiPNOScanReqInfo->wdiPNOScanInfo.wdiModePNO = pPNOScanReqParams->modePNO;
-
    pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount = 
       ( pPNOScanReqParams->ucNetworksCount < WDI_PNO_MAX_SUPP_NETWORKS )? 
         pPNOScanReqParams->ucNetworksCount : WDI_PNO_MAX_SUPP_NETWORKS ;
-
    for ( i = 0; i < pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount ; i++)
    {
       vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i],
                    &pPNOScanReqParams->aNetworks[i],
                    sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i]));
    }
-
    /*Scan timer intervals*/
    vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers,
                 &pPNOScanReqParams->scanTimers,
                 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers));
-
    /*Probe template for 2.4GHz band*/
    pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize = 
       (pPNOScanReqParams->us24GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
       pPNOScanReqParams->us24GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE; 
-
    vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a24GProbeTemplate,
                 pPNOScanReqParams->p24GProbeTemplate,
                 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize);
-
    /*Probe template for 5GHz band*/
    pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize = 
       (pPNOScanReqParams->us5GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
       pPNOScanReqParams->us5GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE; 
-
    vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a5GProbeTemplate,
                 pPNOScanReqParams->p5GProbeTemplate,
                 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize);
-
    pwdiPNOScanReqInfo->wdiReqStatusCB = NULL;
-
    if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11621,10 +10392,8 @@
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pPNOScanReqParams;
-
    status = WDI_SetPreferredNetworkReq(pwdiPNOScanReqInfo, 
                            (WDI_PNOScanCb)WDA_PNOScanReqCallback, pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11634,10 +10403,8 @@
       pWdaParams->wdaWdiApiMsgParam = NULL;
       pWdaParams->wdaMsgParam = NULL;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_RssiFilterCallback
  * 
@@ -11668,10 +10435,8 @@
    WDI_SetRssiFilterReqParamsType *pwdiSetRssiFilterReqInfo = 
       (WDI_SetRssiFilterReqParamsType *)vos_mem_malloc(sizeof(WDI_SetRssiFilterReqParamsType)) ;
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == pwdiSetRssiFilterReqInfo) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11679,7 +10444,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if(NULL == pWdaParams)
    {
@@ -11689,10 +10453,8 @@
       vos_mem_free(pwdiSetRssiFilterReqInfo);
       return VOS_STATUS_E_NOMEM;
    }
-
    pwdiSetRssiFilterReqInfo->rssiThreshold = pRssiFilterParams->rssiThreshold;
    pwdiSetRssiFilterReqInfo->wdiReqStatusCB = NULL;
-
    if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11702,17 +10464,14 @@
       vos_mem_free(pWdaParams);
       return VOS_STATUS_E_FAILURE;
    }
-
    /* Store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRssiFilterReqInfo;
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pRssiFilterParams;
-
    status = WDI_SetRssiFilterReq( pwdiSetRssiFilterReqInfo, 
                                  (WDI_PNOScanCb)WDA_RssiFilterCallback, 
                                  pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11722,11 +10481,9 @@
       pWdaParams->wdaWdiApiMsgParam = NULL;
       pWdaParams->wdaMsgParam = NULL;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
 
-
 /*
  * FUNCTION: WDA_ProcessUpdateScanParams
  * Request to WDI to update Scan Parameters
@@ -11740,10 +10497,8 @@
          sizeof(WDI_UpdateScanParamsInfoType)) ;
    tWDA_ReqParams *pWdaParams ;
    v_U8_t i; 
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == wdiUpdateScanParamsInfoType) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11751,7 +10506,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if ( NULL == pWdaParams )
    {
@@ -11761,11 +10515,9 @@
       vos_mem_free(wdiUpdateScanParamsInfoType);
       return VOS_STATUS_E_NOMEM;
    }
-
    //
    // Fill wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo from pUpdateScanParams
    //
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
           "Update Scan Parameters b11dEnabled %d b11dResolved %d "
           "ucChannelCount %d usPassiveMinChTime %d usPassiveMaxChTime"
@@ -11781,16 +10533,12 @@
               sizeof(tSirUpdateScanParams),
               sizeof(wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo) ); 
 
-
    wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dEnabled  =
       pUpdateScanParams->b11dEnabled;
-
    wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dResolved =
       pUpdateScanParams->b11dResolved;
-
    wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.cbState = 
       pUpdateScanParams->ucCBState;
-
    wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMaxChTime  =
       pUpdateScanParams->usActiveMaxChTime; 
    wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMinChTime  = 
@@ -11800,12 +10548,10 @@
    wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMinChTime = 
      pUpdateScanParams->usPassiveMinChTime;
 
-
    wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount = 
       (pUpdateScanParams->ucChannelCount < WDI_PNO_MAX_NETW_CHANNELS)?
       pUpdateScanParams->ucChannelCount:WDI_PNO_MAX_NETW_CHANNELS;
 
-
    for ( i = 0; i < 
          wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount ; 
          i++)
@@ -11818,9 +10564,7 @@
          pUpdateScanParams->aChannels[i];
    }
 
-
    wdiUpdateScanParamsInfoType->wdiReqStatusCB = NULL;
-
    if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11830,19 +10574,17 @@
       vos_mem_free(wdiUpdateScanParamsInfoType);
       return VOS_STATUS_E_FAILURE;
    }
-
      /* Store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = wdiUpdateScanParamsInfoType;
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pUpdateScanParams;
-
+ 
  
 
    status = WDI_UpdateScanParamsReq(wdiUpdateScanParamsInfoType, 
                     (WDI_UpdateScanParamsCb)WDA_UpdateScanParamsCallback, 
                     pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11851,11 +10593,9 @@
       vos_mem_free(pWdaParams->wdaMsgParam);
       vos_mem_free(pWdaParams);
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
 #endif // FEATURE_WLAN_SCAN_PNO
-
 #ifdef WLAN_FEATURE_PACKET_FILTERING
 /*
  * FUNCTION: WDA_8023MulticastListReqCallback
@@ -11864,10 +10604,8 @@
 void WDA_8023MulticastListReqCallback(WDI_Status status, void * pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11879,14 +10617,11 @@
    vos_mem_free(pWdaParams->wdaMsgParam) ;
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    //print a msg, nothing else to do
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
               "WDA_8023MulticastListReqCallback invoked " );
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_Process8023MulticastListReq
  * Request to WDI to add 8023 Multicast List
@@ -11898,10 +10633,8 @@
    WDI_RcvFltPktSetMcListReqParamsType *pwdiFltPktSetMcListReqParamsType = NULL;
    tWDA_ReqParams *pWdaParams ;
    tANI_U8         i;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    pwdiFltPktSetMcListReqParamsType = 
       (WDI_RcvFltPktSetMcListReqParamsType *)vos_mem_malloc(
                              sizeof(WDI_RcvFltPktSetMcListReqParamsType)
@@ -11912,7 +10645,6 @@
                            "%s: VOS MEM Alloc Failure", __FUNCTION__); 
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if(NULL == pWdaParams)
    {
@@ -11921,7 +10653,6 @@
       vos_mem_free(pwdiFltPktSetMcListReqParamsType);
       return VOS_STATUS_E_NOMEM;
    }
-
    if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11931,35 +10662,35 @@
       vos_mem_free(pWdaParams);
       return VOS_STATUS_E_FAILURE;
    }
-
    //
    // Fill pwdiFltPktSetMcListReqParamsType from pRcvFltMcAddrList
    //
    pwdiFltPktSetMcListReqParamsType->mcAddrList.ulMulticastAddrCnt = 
-                                   pRcvFltMcAddrList->ulMulticastAddrCnt; 
+                                   pRcvFltMcAddrList->ulMulticastAddrCnt;
+
+    vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.selfMacAddr,
+                 pRcvFltMcAddrList->selfMacAddr, sizeof(tSirMacAddr));
+    vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.bssId,
+                 pRcvFltMcAddrList->bssId, sizeof(tSirMacAddr));
+
    for( i = 0; i < pRcvFltMcAddrList->ulMulticastAddrCnt; i++ )
    {
       vos_mem_copy(&(pwdiFltPktSetMcListReqParamsType->mcAddrList.multicastAddr[i]),
                    &(pRcvFltMcAddrList->multicastAddr[i]),
                    sizeof(tSirMacAddr));
    }
-
    pwdiFltPktSetMcListReqParamsType->wdiReqStatusCB = NULL;
-
   /* WDA_VOS_ASSERT((NULL == pWDA->wdaMsgParam) && 
                   (NULL == pWDA->wdaWdiApiMsgParam)); */
-
    /* Store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)pwdiFltPktSetMcListReqParamsType;
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pRcvFltMcAddrList;
-
    status = WDI_8023MulticastListReq(
                         pwdiFltPktSetMcListReqParamsType, 
                         (WDI_8023MulticastListCb)WDA_8023MulticastListReqCallback,
                         pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11968,10 +10699,8 @@
       vos_mem_free(pWdaParams->wdaMsgParam);
       vos_mem_free(pWdaParams);
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
  * 
@@ -11979,12 +10708,9 @@
 void WDA_ReceiveFilterSetFilterReqCallback(WDI_Status status, void * pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
-
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11996,14 +10722,11 @@
    vos_mem_free(pWdaParams->wdaMsgParam) ;
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    //print a msg, nothing else to do
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
               "WDA_ReceiveFilterSetFilterReqCallback invoked " );
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessReceiveFilterSetFilterReq
  * Request to WDI to set Receive Filters
@@ -12018,10 +10741,8 @@
       (WDI_SetRcvPktFilterReqParamsType *)vos_mem_malloc(allocSize) ;
    tWDA_ReqParams *pWdaParams ;
    tANI_U8         i;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == pwdiSetRcvPktFilterReqParamsType) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -12029,7 +10750,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if(NULL == pWdaParams)
    {
@@ -12039,11 +10759,15 @@
       vos_mem_free(pwdiSetRcvPktFilterReqParamsType);
       return VOS_STATUS_E_NOMEM;
    }
-
    pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId = pRcvPktFilterCfg->filterId;
    pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType = pRcvPktFilterCfg->filterType;   
    pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams = pRcvPktFilterCfg->numFieldParams;
    pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime = pRcvPktFilterCfg->coalesceTime;
+   vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.selfMacAddr,
+                pRcvPktFilterCfg->selfMacAddr, sizeof(wpt_macAddr));
+
+   vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.bssId,
+                      pRcvPktFilterCfg->bssId, sizeof(wpt_macAddr));
 
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
               "FID %d FT %d NParams %d CT %d",
@@ -12051,27 +10775,23 @@
               pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType,
               pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams, 
               pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime);
-
    for ( i = 0; i < pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams; i++ )
    {
      wpalMemoryCopy(&pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i],
                     &pRcvPktFilterCfg->paramsData[i],
                     sizeof(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i]));
-
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, 
                  "Proto %d Comp Flag %d \n",
                  pwdiSetRcvPktFilterReqParamsType->
                          wdiPktFilterCfg.paramsData[i].protocolLayer, 
                  pwdiSetRcvPktFilterReqParamsType->
                          wdiPktFilterCfg.paramsData[i].cmpFlag);
-
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, 
                  "Data Offset %d Data Len %d\n",
                  pwdiSetRcvPktFilterReqParamsType->
                          wdiPktFilterCfg.paramsData[i].dataOffset, 
                  pwdiSetRcvPktFilterReqParamsType->
                          wdiPktFilterCfg.paramsData[i].dataLength);
-
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, 
                  "CData: %d:%d:%d:%d:%d:%d\n",
                  pwdiSetRcvPktFilterReqParamsType->
@@ -12086,7 +10806,6 @@
                          wdiPktFilterCfg.paramsData[i].compareData[4], 
                  pwdiSetRcvPktFilterReqParamsType->
                          wdiPktFilterCfg.paramsData[i].compareData[5]);
-
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, 
                  "MData: %d:%d:%d:%d:%d:%d\n",
                  pwdiSetRcvPktFilterReqParamsType->
@@ -12101,21 +10820,16 @@
                          wdiPktFilterCfg.paramsData[i].dataMask[4], 
                  pwdiSetRcvPktFilterReqParamsType->
                          wdiPktFilterCfg.paramsData[i].dataMask[5]);
-
    }
-
    pwdiSetRcvPktFilterReqParamsType->wdiReqStatusCB = NULL;
-
    /* Store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRcvPktFilterReqParamsType;
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pRcvPktFilterCfg;
-
    status = WDI_ReceiveFilterSetFilterReq(pwdiSetRcvPktFilterReqParamsType,
            (WDI_ReceiveFilterSetFilterCb)WDA_ReceiveFilterSetFilterReqCallback,
            pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -12124,10 +10838,8 @@
       vos_mem_free(pWdaParams->wdaMsgParam);
       vos_mem_free(pWdaParams);
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_FilterMatchCountReqCallback
  * 
@@ -12144,20 +10856,27 @@
 
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
    /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
 
+   if(NULL == pRcvFltPktMatchCntRsp)
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                 "%s: pRcvFltPktMatchCntRsp is NULL", __FUNCTION__);
+      VOS_ASSERT(0) ;
+	  vos_mem_free(pWdaParams);
+      return ;
+   }
+   
    if(NULL == pWdaParams)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                  "%s: pWdaParams received NULL", __FUNCTION__);
       VOS_ASSERT(0) ;
+	  vos_mem_free(pRcvFltPktMatchCntRsp);
       return ;
    }
-
    pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
    pRcvFltPktMatchCntReq = (tpSirRcvFltPktMatchRsp)pWdaParams->wdaMsgParam;
-
    // Fill pRcvFltPktMatchCntRsp from pRcvFltPktMatchCntReq
    vos_mem_zero(pRcvFltPktMatchCntRsp,sizeof(tSirRcvFltPktMatchRsp));
 
@@ -12172,7 +10891,6 @@
       pRcvFltPktMatchCntRsp->filterMatchCnt[i].filterId = pRcvFltPktMatchCntReq->filterMatchCnt[i].filterId;
       pRcvFltPktMatchCntRsp->filterMatchCnt[i].matchCnt = pRcvFltPktMatchCntReq->filterMatchCnt[i].matchCnt;
    }
-
    /* VOS message wrapper */
    vosMsg.type = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
    vosMsg.bodyptr = (void *)pRcvFltPktMatchCntRsp;
@@ -12187,7 +10905,6 @@
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
 }
-
 /*
  * FUNCTION: WDA_ProcessPacketFilterMatchCountReq
  * Request to WDI to get PC Filter Match Count
@@ -12198,10 +10915,8 @@
    WDI_RcvFltPktMatchCntReqParamsType *pwdiRcvFltPktMatchCntReqParamsType = 
       (WDI_RcvFltPktMatchCntReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktMatchCntReqParamsType));
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == pwdiRcvFltPktMatchCntReqParamsType) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -12209,7 +10924,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if(NULL == pWdaParams)
    {
@@ -12219,7 +10933,6 @@
       vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
       return VOS_STATUS_E_NOMEM;
    }
-
    if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -12229,20 +10942,16 @@
       vos_mem_free(pWdaParams);
       return VOS_STATUS_E_FAILURE;
    }
-
    pwdiRcvFltPktMatchCntReqParamsType->wdiReqStatusCB = NULL;
 
-
    /* Store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktMatchCntReqParamsType;
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pRcvFltPktMatchRsp;
-
    status = WDI_FilterMatchCountReq(pwdiRcvFltPktMatchCntReqParamsType, 
                  (WDI_FilterMatchCountCb)WDA_FilterMatchCountReqCallback,
                  pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       /* failure returned by WDI API */
@@ -12253,10 +10962,8 @@
       pRcvFltPktMatchRsp->status = eSIR_FAILURE ;
       WDA_SendMsg(pWDA, WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP, (void *)pRcvFltPktMatchRsp, 0) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
-
 /*
  * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
  * 
@@ -12264,10 +10971,8 @@
 void WDA_ReceiveFilterClearFilterReqCallback(WDI_Status status, void * pUserData)
 {
    tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "<------ %s " ,__FUNCTION__);
-
 /*   WDA_VOS_ASSERT(NULL != pWdaParams); */
    if(NULL == pWdaParams)
    {
@@ -12280,14 +10985,11 @@
    vos_mem_free(pWdaParams->wdaMsgParam) ;
    vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
    vos_mem_free(pWdaParams) ;
-
    //print a msg, nothing else to do
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
               "WDA_ReceiveFilterClearFilterReqCallback invoked " );
-
    return ;
 }
-
 /*
  * FUNCTION: WDA_ProcessReceiveFilterClearFilterReq
  * Request to WDI to clear Receive Filters
@@ -12299,10 +11001,8 @@
    WDI_RcvFltPktClearReqParamsType *pwdiRcvFltPktClearReqParamsType =
       (WDI_RcvFltPktClearReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktClearReqParamsType));
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == pwdiRcvFltPktClearReqParamsType)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -12310,7 +11010,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if(NULL == pWdaParams)
    {
@@ -12320,34 +11019,32 @@
       vos_mem_free(pwdiRcvFltPktClearReqParamsType);
       return VOS_STATUS_E_NOMEM;
    }
-
    pwdiRcvFltPktClearReqParamsType->filterClearParam.status = pRcvFltPktClearParam->status;
    pwdiRcvFltPktClearReqParamsType->filterClearParam.filterId = pRcvFltPktClearParam->filterId;
+   vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.selfMacAddr,
+                     pRcvFltPktClearParam->selfMacAddr, sizeof(wpt_macAddr));
+   vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.bssId,
+                         pRcvFltPktClearParam->bssId, sizeof(wpt_macAddr));
 
    pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB = NULL;
-
    /* Store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktClearReqParamsType;
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pRcvFltPktClearParam;
-
    status = WDI_ReceiveFilterClearFilterReq(pwdiRcvFltPktClearReqParamsType,
        (WDI_ReceiveFilterClearFilterCb)WDA_ReceiveFilterClearFilterReqCallback,
        pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
               "Failure in WDA_ProcessReceiveFilterClearFilterReq(), free all the memory " );
       vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
 #endif // WLAN_FEATURE_PACKET_FILTERING
 
-
 /*
  * FUNCTION: WDA_ProcessSetPowerParamsReq
  * Request to WDI to set power params 
@@ -12358,12 +11055,9 @@
    WDI_Status status;
    WDI_SetPowerParamsReqParamsType *pwdiSetPowerParamsReqInfo = 
       (WDI_SetPowerParamsReqParamsType *)vos_mem_malloc(sizeof(WDI_SetPowerParamsReqParamsType)) ;
-
    tWDA_ReqParams *pWdaParams ;
-
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if(NULL == pwdiSetPowerParamsReqInfo) 
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -12371,7 +11065,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_NOMEM;
    }
-
    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
    if(NULL == pWdaParams)
    {
@@ -12381,14 +11074,12 @@
       vos_mem_free(pwdiSetPowerParamsReqInfo);
       return VOS_STATUS_E_NOMEM;
    }
-
+   
    
    pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uIgnoreDTIM       = 
       pPowerParams->uIgnoreDTIM;
-
    pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uDTIMPeriod       = 
       pPowerParams->uDTIMPeriod;
-
    pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uListenInterval   = 
       pPowerParams->uListenInterval;
    pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBcastMcastFilter = 
@@ -12397,9 +11088,7 @@
       pPowerParams->uEnableBET;
    pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBETInterval      = 
       pPowerParams->uBETInterval; 
-
    pwdiSetPowerParamsReqInfo->wdiReqStatusCB = NULL;
-
    if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -12409,17 +11098,14 @@
       vos_mem_free(pWdaParams);
       return VOS_STATUS_E_FAILURE;
    }
-
    /* Store Params pass it to WDI */
    pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetPowerParamsReqInfo;
    pWdaParams->pWdaContext = pWDA;
    /* Store param pointer as passed in by caller */
    pWdaParams->wdaMsgParam = pPowerParams;
-
    status = WDI_SetPowerParamsReq( pwdiSetPowerParamsReqInfo, 
                                  (WDI_SetPowerParamsCb)WDA_SetPowerParamsCallback, 
                                  pWdaParams);
-
    if(IS_WDI_STATUS_FAILURE(status))
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -12429,7 +11115,6 @@
       pWdaParams->wdaWdiApiMsgParam = NULL;
       pWdaParams->wdaMsgParam = NULL;
    }
-
    return CONVERT_WDI2VOS_STATUS(status) ;
 }
 
@@ -12527,14 +11212,12 @@
    
    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
                                           "------> %s " ,__FUNCTION__);
-
    if( pTxCtrlParam == NULL )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
                            "%s: Input tpTxControlParams is NULL", __FUNCTION__); 
       return VOS_STATUS_E_FAILURE;
    }
-
    if( pTxCtrlParam->stopTx == eANI_BOOLEAN_TRUE )
    {
       wdaStatus = WDA_SuspendDataTx(pWDA);
@@ -12543,7 +11226,6 @@
    {
       wdaStatus = WDA_ResumeDataTx(pWDA);
    }
-
    return wdaStatus;
 }
 
@@ -12592,7 +11274,6 @@
    //tANI_U8    eventIdx = 0;
    VOS_STATUS status = VOS_STATUS_SUCCESS;
    tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
-
    if (NULL == pWDA)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -12600,7 +11281,6 @@
       VOS_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
-
    /* FTM mode stay START_STATE */
    if( (WDA_READY_STATE != pWDA->wdaState) &&
          (WDA_INIT_STATE != pWDA->wdaState) &&
@@ -12608,7 +11288,6 @@
    {
       VOS_ASSERT(0);
    }
-
    if(NULL != pWDA->wdaWdiApiMsgParam)
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -12618,16 +11297,13 @@
        * initiated by WLAN driver (WDI timeout) */
       vos_mem_free(pWDA->wdaWdiApiMsgParam);
    }
-
    if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
    {
       wdaDestroyTimers(pWDA);
    }
    pWDA->wdaWdiApiMsgParam = NULL;
-
    /* call WDI shutdown */
    wdiStatus = WDI_Shutdown(closeTransport);
-
    if (IS_WDI_STATUS_FAILURE(wdiStatus) )
    {
       VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -12637,7 +11313,6 @@
    /* WDI stop is synchrnous, shutdown is complete when it returns */
    pWDA->wdaState = WDA_STOP_STATE;
 
-
    /* shutdown should perform the stop & close actions. */
    /* Destroy the event */
    status = vos_event_destroy(&pWDA->txFrameEvent);
@@ -12661,7 +11336,6 @@
                   "VOS Event destroy failed - status = %d\n", status);
       status = VOS_STATUS_E_FAILURE;
    }
-
    /* free WDA context */
    status = vos_free_context(pVosContext,VOS_MODULE_ID_WDA,pWDA);
    if ( !VOS_IS_STATUS_SUCCESS(status) )
@@ -12670,6 +11344,27 @@
                                   "error in WDA close " );
       status = VOS_STATUS_E_FAILURE;
    }
-
    return status;
 }
+/*
+ * FUNCTION: WDA_stopFailed
+ * WDA stop failed
+ */
+
+void WDA_stopFailed(v_PVOID_t pVosContext)
+{
+   tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
+   pWDA->needShutdown  = TRUE;
+}
+/*
+ * FUNCTION: WDA_needShutdown
+ * WDA needs a shutdown
+ */
+
+v_BOOL_t WDA_needShutdown(v_PVOID_t pVosContext)
+{
+   tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
+   return pWDA->needShutdown;   
+}
+
+
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index 9da9d88..c0768fb 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -177,7 +177,17 @@
 {
   WDI_SECONDARY_CHANNEL_OFFSET_NONE   = 0,
   WDI_SECONDARY_CHANNEL_OFFSET_UP     = 1,
-  WDI_SECONDARY_CHANNEL_OFFSET_DOWN   = 3
+  WDI_SECONDARY_CHANNEL_OFFSET_DOWN   = 3,
+#ifdef WLAN_FEATURE_11AC
+  WDI_CHANNEL_20MHZ_LOW_40MHZ_CENTERED = 4, //20/40MHZ offset LOW 40/80MHZ offset CENTERED
+  WDI_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED = 5, //20/40MHZ offset CENTERED 40/80MHZ offset CENTERED
+  WDI_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED = 6, //20/40MHZ offset HIGH 40/80MHZ offset CENTERED
+  WDI_CHANNEL_20MHZ_LOW_40MHZ_LOW = 7,//20/40MHZ offset LOW 40/80MHZ offset LOW
+  WDI_CHANNEL_20MHZ_HIGH_40MHZ_LOW = 8, //20/40MHZ offset HIGH 40/80MHZ offset LOW
+  WDI_CHANNEL_20MHZ_LOW_40MHZ_HIGH = 9, //20/40MHZ offset LOW 40/80MHZ offset HIGH
+  WDI_CHANNEL_20MHZ_HIGH_40MHZ_HIGH = 10,//20/40MHZ offset-HIGH 40/80MHZ offset HIGH
+#endif
+  WDI_SECONDARY_CHANNEL_OFFSET_MAX
 }WDI_HTSecondaryChannelOffset;
 
 /*---------------------------------------------------------------------------
@@ -883,7 +893,17 @@
   WDI_PHY_SINGLE_CHANNEL_CENTERED = 0,            
   WDI_PHY_DOUBLE_CHANNEL_LOW_PRIMARY = 1,     
   WDI_PHY_DOUBLE_CHANNEL_CENTERED = 2,            
-  WDI_PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3     
+  WDI_PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3,
+#ifdef WLAN_FEATURE_11AC
+  WDI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED = 4, //20/40MHZ offset LOW 40/80MHZ offset CENTERED
+  WDI_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED = 5, //20/40MHZ offset CENTERED 40/80MHZ offset CENTERED
+  WDI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED = 6, //20/40MHZ offset HIGH 40/80MHZ offset CENTERED
+  WDI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW = 7,//20/40MHZ offset LOW 40/80MHZ offset LOW
+  WDI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW = 8, //20/40MHZ offset HIGH 40/80MHZ offset LOW
+  WDI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH = 9, //20/40MHZ offset LOW 40/80MHZ offset HIGH
+  WDI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH = 10,//20/40MHZ offset-HIGH 40/80MHZ offset HIGH
+#endif
+  WDI_MAX_CB_STATE
 } WDI_PhyChanBondState;
 
 /*---------------------------------------------------------------------------
@@ -1151,6 +1171,20 @@
      */
     wpt_uint16         aRxHighestDataRate;
 
+   
+#ifdef WLAN_FEATURE_11AC
+   /*Indicates the Maximum MCS that can be received for each number
+        of spacial streams */
+    wpt_uint16         vhtRxMCSMap;
+  /*Indicate the highest VHT data rate that the STA is able to receive*/
+    wpt_uint16         vhtRxHighestDataRate;
+  /*Indicates the Maximum MCS that can be transmitted  for each number
+       of spacial streams */
+    wpt_uint16         vhtTxMCSMap;
+  /*Indicate the highest VHT data rate that the STA is able to transmit*/
+    wpt_uint16         vhtTxHighestDataRate;
+#endif
+
 } WDI_SupportedRates;
 
 /*-------------------------------------------------------------------------- 
@@ -1263,6 +1297,10 @@
   wpt_uint8                 ucDsssCckMode40Mhz;
 
   wpt_uint8                 ucP2pCapableSta;
+#ifdef WLAN_FEATURE_11AC
+  wpt_uint8                 ucVhtCapableSta;
+  wpt_uint8                 ucVhtTxChannelWidthSet;
+#endif
 }WDI_ConfigStaReqInfoType;
 
 
@@ -1796,6 +1834,11 @@
   WDI_SetSTAKeyReqInfoType  wdiExtSetKeyParam;
 #endif
 
+#ifdef WLAN_FEATURE_11AC
+  wpt_uint8                 ucVhtCapableSta;
+  wpt_uint8                 ucVhtTxChannelWidthSet;
+#endif
+
 }WDI_ConfigBSSReqInfoType;
 
 /*---------------------------------------------------------------------------
@@ -3032,6 +3075,7 @@
 typedef struct
 {
    wpt_uint8     ucSendDataNull;
+   wpt_uint8     bssIdx;
 }WDI_ExitBmpsReqinfoType;
 
 /*---------------------------------------------------------------------------
@@ -3065,6 +3109,7 @@
    wpt_uint8     ucBeTriggerEnabled:1;
    wpt_uint8     ucViTriggerEnabled:1;
    wpt_uint8     ucVoTriggerEnabled:1;
+   wpt_uint8     bssIdx;
 }WDI_EnterUapsdReqinfoType;
 
 /*---------------------------------------------------------------------------
@@ -3249,6 +3294,7 @@
    wpt_uint8 srcIPv6AddrValid : 1;
    wpt_uint8 targetIPv6Addr1Valid : 1;
    wpt_uint8 targetIPv6Addr2Valid : 1;
+   wpt_uint8 bssIdx;
 } WDI_NSOffloadParams;
 #endif //WLAN_NS_OFFLOAD
 
@@ -3256,6 +3302,7 @@
 {
    wpt_uint8 ucOffloadType;
    wpt_uint8 ucEnableOrDisable;
+   wpt_uint8 bssIdx;
    union
    {
        wpt_uint8 aHostIpv4Addr [4];
@@ -3294,6 +3341,7 @@
     wpt_uint8  aHostIpv4Addr[4];
     wpt_uint8  aDestIpv4Addr[4];
     wpt_uint8  aDestMacAddr[6];
+    wpt_uint8  bssIdx;
 } WDI_KeepAliveReqType;
 
 /*---------------------------------------------------------------------------
@@ -3329,6 +3377,7 @@
    wpt_uint8  ucPatternMask[WDI_WOWL_BCAST_PATTERN_MAX_SIZE]; // Pattern mask
    wpt_uint8  ucPatternExt[WDI_WOWL_BCAST_PATTERN_MAX_SIZE]; // Extra pattern
    wpt_uint8  ucPatternMaskExt[WDI_WOWL_BCAST_PATTERN_MAX_SIZE]; // Extra pattern mask
+   wpt_uint8  bssIdx;
 } WDI_WowlAddBcPtrnInfoType;
 
 /*---------------------------------------------------------------------------
@@ -3558,6 +3607,52 @@
   void*             pUserData;
 }WDI_BtAmpEventParamsType;
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+
+#ifndef OEM_DATA_REQ_SIZE
+#define OEM_DATA_REQ_SIZE 70
+#endif
+#ifndef OEM_DATA_RSP_SIZE
+#define OEM_DATA_RSP_SIZE 968
+#endif
+
+/*----------------------------------------------------------------------------
+  WDI_oemDataReqInfoType
+----------------------------------------------------------------------------*/
+typedef struct
+{
+  wpt_macAddr                  selfMacAddr;
+  wpt_uint8                    oemDataReq[OEM_DATA_REQ_SIZE];
+}WDI_oemDataReqInfoType;
+
+/*----------------------------------------------------------------------------
+  WDI_oemDataReqParamsType
+----------------------------------------------------------------------------*/
+typedef struct
+{
+  /*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;
+
+  /*OEM DATA REQ Info */
+  WDI_oemDataReqInfoType         wdiOemDataReqInfo;
+
+}WDI_oemDataReqParamsType;
+
+/*----------------------------------------------------------------------------
+  WDI_oemDataRspParamsType
+----------------------------------------------------------------------------*/
+typedef struct
+{
+  wpt_uint8           oemDataRsp[OEM_DATA_RSP_SIZE];
+}WDI_oemDataRspParamsType;
+
+#endif /* FEATURE_OEM_DATA_SUPPORT */
 
 #ifdef WLAN_FEATURE_VOWIFI_11R
 /*---------------------------------------------------------------------------
@@ -4165,6 +4260,8 @@
   wpt_uint32                      numFieldParams;
   wpt_uint32                      coalesceTime;
   WDI_RcvPktFilterFieldParams     paramsData[1];
+  wpt_macAddr                     selfMacAddr;
+  wpt_macAddr                     bssId;
 }WDI_RcvPktFilterCfgType;
 
 typedef struct 
@@ -4240,6 +4337,8 @@
 {
   wpt_uint32   status;  /* only valid for response message */
   wpt_uint8    filterId;
+  wpt_macAddr  selfMacAddr;
+  wpt_macAddr  bssId;
 }WDI_RcvFltPktClearParam;
 
 typedef struct
@@ -4262,6 +4361,8 @@
 {
   wpt_uint32     ulMulticastAddrCnt;
   wpt_macAddr    multicastAddr[WDI_MAX_NUM_MULTICAST_ADDRESS];
+  wpt_macAddr    selfMacAddr;
+  wpt_macAddr    bssId;
 } WDI_RcvFltMcAddrListType;
 
 typedef struct
@@ -5596,6 +5697,30 @@
 typedef void  (*WDI_BtAmpEventRspCb)(WDI_Status   wdiStatus,
                                      void*        pUserData);
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/*---------------------------------------------------------------------------
+   WDI_oemDataRspCb
+ 
+   DESCRIPTION   
+ 
+   This callback is invoked by DAL when it has received a Start oem data 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_oemDataRspCb)(WDI_oemDataRspParamsType* wdiOemDataRspParams, 
+                                  void*                     pUserData);
+
+#endif
 
 /*---------------------------------------------------------------------------
    WDI_HostResumeEventRspCb
@@ -7787,6 +7912,38 @@
   void*                     pUserData
 );
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/**
+ @brief WDI_Start oem data Req will be called when the upper MAC 
+        wants to notify the lower mac on a oem data Req event.Upon
+        the call of this API the WLAN DAL will pack and send a
+        HAL OEM Data Req event 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 pWdiOemDataReqParams: the oem data req parameters as 
+                      specified by the Device Interface
+  
+        wdiStartOemDataRspCb: callback for passing back the
+        response of the Oem Data Req received from the
+        device
+  
+        pUserData: user data will be passed back with the
+        callback 
+ 
+ @return Result of the function call
+*/
+WDI_Status 
+WDI_StartOemDataReq
+(
+  WDI_oemDataReqParamsType*       pWdiOemDataReqParams,
+  WDI_oemDataRspCb                wdiOemDataRspCb,
+  void*                           pUserData
+);
+#endif
 
 /*======================================================================== 
  
@@ -8633,8 +8790,8 @@
  
  @param 
   
-        feat_enum_value: enum value for the feature as in placeHolderInCapBitmap
-                                    in wlan_hal_msg.h.
+        feat_enum_value: enum value for the feature as in placeHolderInCapBitmap 
+        in wlan_hal_msg.h.
 
  @see
  @return 
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_bd.h b/CORE/WDI/CP/inc/wlan_qct_wdi_bd.h
index 8c91bb6..dd73dcf 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_bd.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_bd.h
@@ -94,13 +94,32 @@
         /** This bit filled by rxp when set indicates if the current tsf is smaller
         than received tsf */
         wpt_uint32 rtsf:1;
-    
+
+#ifdef WCN_PRONTO_CSU
+        /** No valid header found during parsing. Therefore no checksum was validated */
+        wpt_uint32 csuNoValHd:1;
+
+        /** 0 = CSU did not verify TCP/UDP (Transport Layer TL) checksum; 1 = CSU verified TCP/UDP checksum */
+        wpt_uint32 csuVerifiedTLChksum:1;
+
+        /** 0 = CSU did not verify IP checksum; 1 = CSU verified IP checksum */
+        wpt_uint32 csuVerifiedIPChksum:1;
+
+        /** 0 = BD field checksum is not valid; 1 = BD field checksum is valid */
+        wpt_uint32 csuChksumValid:1;
+
+        /** 0 = No TCP/UDP checksum error; 1 = Has TCP/UDP checksum error */
+        wpt_uint32 csuTLChksumError:1;
+
+        /** 0 = No IPv4/IPv6 checksum error; 1 = Has IPv4/IPv6 checksum error */
+        wpt_uint32 csuIPChksumError:1;
+#else /*WCN_PRONTO*/
         /** These two fields are used by SW to carry the Rx Channel number and SCAN bit in RxBD*/
         wpt_uint32 rxChannel:4;
         wpt_uint32 scanLearn:1;
-
         wpt_uint32 reserved0:1;
-    
+#endif /*WCN_PRONTO*/
+
         /** LLC Removed
         This bit is only used in Libra rsvd for Virgo1.0/Virgo2.0
         Filled by ADU when it is set LLC is removed from packet */
@@ -167,11 +186,22 @@
         wpt_uint32 rxKeyId:3;
         wpt_uint32 ub:1;
         wpt_uint32 rmf:1;
-        wpt_uint32 reserved1:1;
-        wpt_uint32 llc:1;
+        wpt_uint32 umaByPass:1;
+        wpt_uint32 llcr:1;
+
+#ifdef WCN_PRONTO_CSU
+        wpt_uint32 csuIPChksumError:1;
+        wpt_uint32 csuTLChksumError:1;
+        wpt_uint32 csuChksumValid:1;
+        wpt_uint32 csuVerifiedIPChksum:1;
+        wpt_uint32 csuVerifiedTLChksum:1;
+        wpt_uint32 csuNoValHd:1;
+#else /*WCN_PRONTO*/
         wpt_uint32 reserved0:1;
         wpt_uint32 scanLearn:1;
         wpt_uint32 rxChannel:4;
+#endif /*WCN_PRONTO*/
+
         wpt_uint32 rtsf:1;
         wpt_uint32 bsf:1;
         wpt_uint32 A2HF:1;
@@ -188,14 +218,24 @@
         Used in ADU (for AMSDU deaggregation) */
         wpt_uint32 penultimatePduIdx:16;
     
+#ifdef WCN_PRONTO 
+        wpt_uint32 aduFeedback:7;
+        wpt_uint32 dpuMagicPacket: 1; 
+#else
         wpt_uint32 aduFeedback:8;
+#endif //WCN_PRONTO
     
         /** DPU feedback */
         wpt_uint32 dpuFeedback:8;
         
 #else
         wpt_uint32 dpuFeedback:8;
+#ifdef WCN_PRONTO 
+        wpt_uint32 dpuMagicPacket: 1; 
+        wpt_uint32 aduFeedback:7;
+#else
         wpt_uint32 aduFeedback:8;
+#endif //WCN_PRONTO
         wpt_uint32 penultimatePduIdx:16;
 #endif
     
@@ -254,7 +294,13 @@
         (header and data). Note that the length does not include FCS field. */
         wpt_uint32 mpduLength:16;
     
+#ifdef WCN_PRONTO
+        wpt_uint32 reserved3: 3;
+        wpt_uint32 rxDXEPriorityRouting:1; 
+#else
         wpt_uint32 reserved3:4;
+#endif //WCN_PRONTO
+    
     
         /** Traffic Identifier
         Indicates the traffic class the frame belongs to. For non QoS frames,
@@ -265,7 +311,13 @@
 #else
         wpt_uint32 reserved4:8;
         wpt_uint32 tid:4;
+#ifdef WCN_PRONTO
+        wpt_uint32 rxDXEPriorityRouting:1; 
+        wpt_uint32 reserved3: 3;
+#else
         wpt_uint32 reserved3:4;
+#endif //WCN_PRONTO
+    
         wpt_uint32 mpduLength:16;
 #endif
     
@@ -329,9 +381,22 @@
         wpt_uint32 pmiCmd4to23[5];               /* PMI cmd rcvd from RxP */
     
         /* 0x3c */
+#ifdef WCN_PRONTO
+#ifdef WPT_BIG_BYTE_ENDIAN
+        /** The bits from the PMI command as received from the PHY RX. */
+        wpt_uint32 pmiCmd24to25:16;
+
+        /* 16-bit CSU Checksum value for the fragmented receive frames */
+        wpt_uint32 csuChecksum:16;
+#else
+        wpt_uint32 csuChecksum:16;
+        wpt_uint32 pmiCmd24to25:16;
+#endif
+#else /*WCN_PRONTO*/
         /** The bits from the PMI command as received from the PHY RX. */
         wpt_uint32 pmiCmd24to25;
-    
+#endif /*WCN_PRONTO*/
+
         /* 0x40 */
 #ifdef WPT_BIG_BYTE_ENDIAN
     
@@ -352,9 +417,23 @@
         applied to AMPDU packets. */
         wpt_uint32 reorderSlotIdx:6;
         
-        wpt_uint32 reserved7:4;
+#ifdef WCN_PRONTO
+        wpt_uint32 reserved7: 2;
+        wpt_uint32 outOfOrderForward: 1;
+        wpt_uint32 reorderEnable: 1;
 #else
         wpt_uint32 reserved7:4;
+#endif //WCN_PRONTO
+
+#else
+
+#ifdef WCN_PRONTO
+        wpt_uint32 reorderEnable: 1;
+        wpt_uint32 outOfOrderForward: 1;
+        wpt_uint32 reserved7: 2;
+#else
+        wpt_uint32 reserved7:4;
+#endif //WCN_PRONTO
         wpt_uint32 reorderSlotIdx:6;
         wpt_uint32 reorderFwdIdx:6;
         wpt_uint32 reserved6:12;
@@ -736,9 +815,65 @@
     
         /** DPU signature. Filled by Host in Virgo 1.0 but by ADU in Virgo 2.0 */
         wpt_uint32 dpuSignature:3;
-    
+
+#ifdef WCN_PRONTO        
+        /** Reserved  */
+        wpt_uint32 reserved0:2;
+
+         /** Set to '1' to terminate the current AMPDU session. Added based on the 
+        request for WiFi Display */
+        wpt_uint32 terminateAMPDU:1;
+
+       /** Bssid index to indicate ADU to use which of the 4 default MAC address 
+        to use while 802.3 to 802.11 translation in case search in ADU UMA table 
+        fails. The default MAC address should be appropriately programmed in the 
+        uma_tx_default_wmacaddr_u(_1,_2,_3) and uma_tx_default_wmacaddr_l(_1,_2,_3)
+         registers */
+        wpt_uint32 umaBssidIdx:2;
+
+        /** Set to 1 to enable uma filling the BD when FT is not enabled.
+        Ignored when FT is enabled. */
+        wpt_uint32 umaBDEnable:1;
+
+        /** (Only used by the CSU)
+        0: No action
+        1: Host will indicate TCP/UPD header start location and provide pseudo header value in BD.
+        */
+        wpt_uint32 csuSWMode:1;
+
+        /** Enable/Disable CSU on TX direction.
+        0: Disable Checksum Unit (CSU) for Transmit.
+        1: Enable 
+        */
+        wpt_uint32 csuTXEnable:1;
+
+        /** Enable/Disable Transport layer Checksum in CSU
+        0: Disable TCP UDP checksum generation for TX.
+        1: Enable TCP UDP checksum generation for TX.
+        */
+        wpt_uint32 csuEnableTLCksum:1;
+
+        /** Enable/Disable IP layer Checksum in CSU
+        0: Disable IPv4/IPv6 checksum generation for TX
+        1: Enable  IPv4/IPv6 checksum generation for TX
+        */
+        wpt_uint32 csuEnableIPCksum:1;
+
+        /** Filled by CSU to indicate whether transport layer Checksum is generated by CSU or not
+        0: TCP/UDP checksum is being generated for TX.
+        1: TCP/UDP checksum is NOT being generated for TX.
+         */
+        wpt_uint32 csuTLCksumGenerated:1;
+
+        /** Filled by CSU in error scenario
+        1: No valid header found during parsing. Therefore no checksum was validated.
+        0: Valid header found
+        */
+        wpt_uint32 csuNoValidHeader:1;
+#else /*WCN_PRONTO*/
         wpt_uint32 reserved0:12;
-    
+#endif /*WCN_PRONTO*/
+
         /** Only available in Virgo 2.0 and reserved in Virgo 1.0.
         This bit indicates to DPU that the packet is a robust management frame
         which requires  encryption(this bit is only valid for certain management
@@ -794,7 +929,20 @@
         wpt_uint32 reserved1:1;
         wpt_uint32 ub:1;
         wpt_uint32 rmf:1;
+#ifdef WCN_PRONTO        
+        wpt_uint32 csuNoValidHeader:1;
+        wpt_uint32 csuTLCksumGenerated:1;
+        wpt_uint32 csuEnableIPCksum:1;
+        wpt_uint32 csuEnableTLCksum:1;
+        wpt_uint32 csuTXEnable:1;
+        wpt_uint32 csuSWMode:1;
+        wpt_uint32 umaBDEnable:1;
+        wpt_uint32 umaBssidIdx:2;
+        wpt_uint32 terminateAMPDU:1;
+        wpt_uint32 reserved0:2;
+#else /*WCN_PRONTO*/
         wpt_uint32 reserved0:12;
+#endif /*WCN_PRONTO*/
         wpt_uint32 dpuSignature:3;
         wpt_uint32 dpuRF:8;
 #endif
@@ -951,6 +1099,24 @@
         /* Timestamp filled by DXE. Timestamp for previous transfer */
         wpt_uint32 dxeH2BEndTimestamp;
 
+#ifdef WCN_PRONTO
+#ifdef WPT_BIG_BYTE_ENDIAN
+        /** 10 bit value to indicate the start of TCP UDP frame relative to 
+         * the first IP frame header */
+        wpt_uint32 csuTcpUdpStartOffset:10;
+
+        /** 16 bit pseudo header for TCP UDP used by CSU to generate TCP/UDP 
+         * frame checksum */
+        wpt_uint32 csuPseudoHeaderCksum:16;
+
+        wpt_uint32 reserved7:6;
+#else
+        wpt_uint32 reserved7:6;
+        wpt_uint32 csuPseudoHeaderCksum:16;
+        wpt_uint32 csuTcpUdpStartOffset:10;
+#endif
+#endif /*WCN_PRONTO*/
+
 } WDI_TxBdType;
 
 /*---------------------------------------------------------------------------         
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h b/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h
index 3e0d851..f946867 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h
@@ -244,7 +244,7 @@
 
 #define WDI_RX_BD_GET_NE( _pvBDHeader )         (((WDI_RxBdType*)_pvBDHeader)->dpuNE)
 
-#define WDI_RX_BD_GET_LLCR( _pvBDHeader )         (((WDI_RxBdType*)_pvBDHeader)->llc)
+#define WDI_RX_BD_GET_LLCR( _pvBDHeader )         (((WDI_RxBdType*)_pvBDHeader)->llcr)
 
 #define WDI_RX_BD_GET_TIMESTAMP( _pvBDHeader )         (((WDI_RxBdType*)_pvBDHeader)->mclkRxTimestamp)
 
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
index 8ac7fba..f5e90e1 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
@@ -363,8 +363,8 @@
   /* WLAN FTM Command request */
   WDI_FTM_CMD_REQ            = 59,
 
-  /*WLAN START INNAV MEAS Request*/
-  WDI_START_INNAV_MEAS_REQ   = 60,
+  /*WLAN START OEM_DATA MEAS Request*/
+  WDI_START_OEM_DATA_REQ   = 60,
   /* WLAN host resume request */
   WDI_HOST_RESUME_REQ      = 61,
   
@@ -604,8 +604,8 @@
   /*Delete Self STA Response*/
   WDI_DEL_STA_SELF_RESP       = 57,
 
-  /*WLAN START INNAV MEAS Response*/
-  WDI_START_INNAV_MEAS_RESP   = 58,
+  /*WLAN START OEM_DATA Response*/
+  WDI_START_OEM_DATA_RESP   = 58,
 
   /* WLAN host resume request */
   WDI_HOST_RESUME_RESP        = 59,
@@ -654,8 +654,8 @@
 
   WDI_TSM_STATS_RESP                            = 74,
   /* GTK Rekey Offload */
-  WDI_GTK_OFFLOAD_RESP                    = 75, 
-  WDI_GTK_OFFLOAD_GETINFO_RESP         = 76, 
+  WDI_GTK_OFFLOAD_RESP                          = 75, 
+  WDI_GTK_OFFLOAD_GETINFO_RESP                  = 76, 
 
   WDI_SET_TM_LEVEL_RESP                         = 77,
 
@@ -2442,6 +2442,24 @@
   WDI_EventInfoType*     pEventData
 );
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/**
+ @brief Process Start Oem Data 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_ProcessStartOemDataReq
+( 
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+);
+#endif
 
 /**
  @brief Process Host Resume Request function (called when Main 
@@ -3646,6 +3664,24 @@
   WDI_EventInfoType*     pEventData
 );
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/**
+ @brief Start Oem Data 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_ProcessStartOemDataRsp
+( 
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+);
+#endif
 
  /**
  @brief WDI_ProcessHostResumeRsp function (called when a 
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 7d10de1..bef4e30 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -25,10 +25,10 @@
 
   OVERVIEW:
 
-  This software unit holds the implementation of the WLAN Device Abstraction     
+  This software unit holds the implementation of the WLAN Device Abstraction
   Layer Interface.
 
-  The functions externalized by this module are to be called by any upper     
+  The functions externalized by this module are to be called by any upper
   MAC implementation that wishes to use the WLAN Device.
 
   DEPENDENCIES:
@@ -63,12 +63,12 @@
 /*----------------------------------------------------------------------------
  * Include Files
  * -------------------------------------------------------------------------*/
-#include "wlan_qct_wdi.h" 
-#include "wlan_qct_wdi_i.h" 
-#include "wlan_qct_wdi_sta.h" 
-#include "wlan_qct_wdi_dp.h" 
+#include "wlan_qct_wdi.h"
+#include "wlan_qct_wdi_i.h"
+#include "wlan_qct_wdi_sta.h"
+#include "wlan_qct_wdi_dp.h"
 
-#include "wlan_qct_wdi_cts.h" 
+#include "wlan_qct_wdi_cts.h"
 
 #include "wlan_qct_pal_api.h"
 #include "wlan_qct_pal_type.h"
@@ -78,7 +78,7 @@
 #include "wlan_qct_pal_trace.h"
 #include "wlan_qct_pal_packet.h"
 
-#include "wlan_qct_wdi_dts.h" 
+#include "wlan_qct_wdi_dts.h"
 
 #include "wlan_hal_msg.h"
 
@@ -87,10 +87,13 @@
 #endif /* ANI_MANF_DIAG */
 
 /*===========================================================================
-   WLAN DAL Control Path Internal Data Definitions and Declarations 
+   WLAN DAL Control Path Internal Data Definitions and Declarations
  ===========================================================================*/
 #define WDI_WCTS_ACTION_TIMEOUT       2000 /* in msec a very high upper limit */
 
+#define MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
+#define MAC_ADDRESS_STR "%02x:%02x:%02x:%02x:%02x:%02x"
+
 
 #ifdef FEATURE_WLAN_SCAN_PNO
 #define WDI_PNO_VERSION_MASK 0x8000
@@ -104,12 +107,12 @@
  * and other two places - wlan_hal_msg.h and halMsg.c (FW file)
  */
 static placeHolderInCapBitmap supportEnabledFeatures[] =
-   {MCC, P2P};
+   {MCC, P2P, DOT11AC};
 
 /*-------------------------------------------------------------------------- 
    WLAN DAL  State Machine
  --------------------------------------------------------------------------*/
-WPT_STATIC const WDI_MainFsmEntryType wdiMainFSM[WDI_MAX_ST] = 
+WPT_STATIC const WDI_MainFsmEntryType wdiMainFSM[WDI_MAX_ST] =
 {
   /*WDI_INIT_ST*/
   {{
@@ -152,12 +155,12 @@
   }}
 };
 
-/*--------------------------------------------------------------------------- 
+/*---------------------------------------------------------------------------
   DAL Request Processing Array  - the functions in this table will only be
   called when the processing of the specific request is allowed by the
-  Main FSM 
+  Main FSM
  ---------------------------------------------------------------------------*/
-WDI_ReqProcFuncType  pfnReqProcTbl[WDI_MAX_UMAC_IND] = 
+WDI_ReqProcFuncType  pfnReqProcTbl[WDI_MAX_UMAC_IND] =
 {
   /*INIT*/
   WDI_ProcessStartReq,      /* WDI_START_REQ  */
@@ -249,11 +252,15 @@
 #else
   NULL,
 #endif /* ANI_MANF_DIAG */
-  
+
+#ifdef FEATURE_OEM_DATA_SUPPORT
+  WDI_ProcessStartOemDataReq,     /*WDI_START_OEM_DATA_REQ*/
+#else
   NULL,
+#endif /*FEATURE_OEM_DATA_SUPPORT*/
   WDI_ProcessHostResumeReq,            /*WDI_HOST_RESUME_REQ*/
-  
-  WDI_ProcessKeepAliveReq,       /* WDI_KEEP_ALIVE_REQ */    
+
+  WDI_ProcessKeepAliveReq,       /* WDI_KEEP_ALIVE_REQ */
 
 #ifdef FEATURE_WLAN_SCAN_PNO
   WDI_ProcessSetPreferredNetworkReq,  /* WDI_SET_PREF_NETWORK_REQ */
@@ -266,23 +273,23 @@
 #endif /* FEATURE_WLAN_SCAN_PNO */
 
   WDI_ProcessSetTxPerTrackingReq,     /* WDI_SET_TX_PER_TRACKING_REQ  */
-  
+
 #ifdef WLAN_FEATURE_PACKET_FILTERING
   /* WDI_8023_MULTICAST_LIST_REQ */
-  WDI_Process8023MulticastListReq,          
+  WDI_Process8023MulticastListReq,
   /* WDI_RECEIVE_FILTER_SET_FILTER_REQ */
-  WDI_ProcessReceiveFilterSetFilterReq,     
+  WDI_ProcessReceiveFilterSetFilterReq,
   /* WDI_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ */
-  WDI_ProcessFilterMatchCountReq,    
+  WDI_ProcessFilterMatchCountReq,
   /* WDI_RECEIVE_FILTER_CLEAR_FILTER_REQ */
-  WDI_ProcessReceiveFilterClearFilterReq,   
+  WDI_ProcessReceiveFilterClearFilterReq,
 #else
   NULL,
   NULL,
   NULL,
   NULL,
 #endif // WLAN_FEATURE_PACKET_FILTERING
-  WDI_ProcessInitScanReq,               /* WDI_INIT_SCAN_CON_REQ */ 
+  WDI_ProcessInitScanReq,               /* WDI_INIT_SCAN_CON_REQ */
   WDI_ProcessHALDumpCmdReq,             /*WDI_HAL_DUMP_CMD_REQ */
   WDI_ProcessShutdownReq,               /* WDI_SHUTDOWN_REQ  */
 
@@ -310,12 +317,12 @@
 };
 
 
-/*--------------------------------------------------------------------------- 
+/*---------------------------------------------------------------------------
   DAL Request Processing Array  - the functions in this table will only be
   called when the processing of the specific request is allowed by the
-  Main FSM 
+  Main FSM
  ---------------------------------------------------------------------------*/
-WDI_RspProcFuncType  pfnRspProcTbl[WDI_MAX_RESP] = 
+WDI_RspProcFuncType  pfnRspProcTbl[WDI_MAX_RESP] =
 {
   /*INIT*/
   WDI_ProcessStartRsp,            /* WDI_START_RESP  */
@@ -358,7 +365,7 @@
   /* BA APIs*/
   WDI_ProcessAddBARsp,             /* WDI_ADD_BA_RESP  */
   WDI_ProcessTriggerBARsp,         /* WDI_TRIGGER_BA_RESP  */
-  
+
   /* IBSS APIs*/
   WDI_ProcessUpdateBeaconParamsRsp, /* WDI_UPD_BCON_PRMS_RSP */
   WDI_ProcessSendBeaconParamsRsp,   /* WDI_SND_BCON_RSP */
@@ -388,7 +395,7 @@
   WDI_ProcessWowlEnterRsp,         /* WDI_WOWL_ENTER_RESP  */
   WDI_ProcessWowlExitRsp,          /* WDI_WOWL_EXIT_RESP  */
   WDI_ProcessConfigureAppsCpuWakeupStateRsp, /* WDI_CONFIGURE_APPS_CPU_WAKEUP_STATE_RESP  */
-  
+
 
   WDI_ProcessNvDownloadRsp, /* WDI_NV_DOWNLOAD_RESP*/
 
@@ -401,7 +408,11 @@
 #endif /* WLAN_FEATURE_VOWIFI_11R */
   WDI_ProcessAddSTASelfRsp,          /* WDI_ADD_STA_SELF_RESP */
   WDI_ProcessDelSTASelfRsp,          /* WDI_DEL_STA_SELF_RESP */
+#ifdef FEATURE_OEM_DATA_SUPPORT
+  WDI_ProcessStartOemDataRsp,     /*WDI_START_OEM_DATA_RESP*/
+#else
   NULL,
+#endif /*FEATURE_OEM_DATA_SUPPORT*/
   WDI_ProcessHostResumeRsp,        /*WDI_HOST_RESUME_RESP*/
 
 #ifdef WLAN_FEATURE_P2P
@@ -416,8 +427,8 @@
   NULL,
 #endif /* ANI_MANF_DIAG */
 
-  WDI_ProcessKeepAliveRsp,       /* WDI_KEEP_ALIVE_RESP  */  
-  
+  WDI_ProcessKeepAliveRsp,       /* WDI_KEEP_ALIVE_RESP  */
+
 #ifdef FEATURE_WLAN_SCAN_PNO
   WDI_ProcessSetPreferredNetworkRsp,     /* WDI_SET_PREF_NETWORK_RESP */
   WDI_ProcessSetRssiFilterRsp,           /* WDI_SET_RSSI_FILTER_RESP */
@@ -435,13 +446,13 @@
   ---------------------------------------------------------------------*/
 #ifdef WLAN_FEATURE_PACKET_FILTERING
   /* WDI_8023_MULTICAST_LIST_RESP */
-  WDI_Process8023MulticastListRsp,          
+  WDI_Process8023MulticastListRsp,
   /* WDI_RECEIVE_FILTER_SET_FILTER_RESP */
-  WDI_ProcessReceiveFilterSetFilterRsp,     
+  WDI_ProcessReceiveFilterSetFilterRsp,
   /* WDI_PACKET_COALESCING_FILTER_MATCH_COUNT_RESP */
-  WDI_ProcessFilterMatchCountRsp,   
+  WDI_ProcessFilterMatchCountRsp,
   /* WDI_RECEIVE_FILTER_CLEAR_FILTER_RESP */
-  WDI_ProcessReceiveFilterClearFilterRsp,   
+  WDI_ProcessReceiveFilterClearFilterRsp,
 #else
   NULL,
   NULL,
@@ -460,14 +471,14 @@
 #endif
   
 #ifdef WLAN_FEATURE_GTK_OFFLOAD
-  WDI_ProcessGtkOffloadRsp,           /* WDI_GTK_OFFLOAD_RESP  */
-  WDI_ProcessGTKOffloadGetInfoRsp,    /* WDI_GTK_OFFLOAD_GETINFO_RESP  */
+  WDI_ProcessGtkOffloadRsp,             /* WDI_GTK_OFFLOAD_RESP  */
+  WDI_ProcessGTKOffloadGetInfoRsp,      /* WDI_GTK_OFFLOAD_GETINFO_RESP  */
 #else
   NULL,
   NULL,
 #endif // WLAN_FEATURE_GTK_OFFLOAD
-  WDI_ProcessSetTmLevelRsp,       /* WDI_SET_TM_LEVEL_RESP */
-  WDI_ProcessFeatureCapsExchangeRsp,     /* WDI_FEATURE_CAPS_EXCHANGE_RESP */  
+  WDI_ProcessSetTmLevelRsp,             /* WDI_SET_TM_LEVEL_RESP */
+  WDI_ProcessFeatureCapsExchangeRsp,    /* WDI_FEATURE_CAPS_EXCHANGE_RESP */
 
   /*---------------------------------------------------------------------
     Indications
@@ -505,22 +516,22 @@
 };
 
 
-/*--------------------------------------------------------------------------- 
+/*---------------------------------------------------------------------------
   WLAN DAL Global Control Block
  ---------------------------------------------------------------------------*/
-WDI_ControlBlockType  gWDICb; 
+WDI_ControlBlockType  gWDICb;
 static wpt_uint8      gWDIInitialized = eWLAN_PAL_FALSE;
 
-const wpt_uint8 szTransportChName[] = "WLAN_CTRL"; 
+const wpt_uint8 szTransportChName[] = "WLAN_CTRL";
 
 /*Helper routine for retrieving the PAL Context from WDI*/
-WPT_INLINE 
+WPT_INLINE
 void* WDI_GET_PAL_CTX( void )
 {
-  return gWDICb.pPALContext; 
+  return gWDICb.pPALContext;
 }/*WDI_GET_PAL_CTX*/
 
-/*============================================================================ 
+/*============================================================================
   Helper inline converters
  ============================================================================*/
 /*Convert WDI driver type into HAL driver type*/
@@ -566,7 +577,7 @@
 );
 
 /*Convert WDI sec ch offset into HAL sec ch offset type*/
-WPT_STATIC WPT_INLINE tSirMacHTSecondaryChannelOffset
+WPT_STATIC WPT_INLINE ePhyChanBondState
 WDI_2_HAL_SEC_CH_OFFSET
 (
   WDI_HTSecondaryChannelOffset wdiSecChOffset
@@ -628,19 +639,19 @@
   WDI_LinkStateType  wdiLinkState
 );
 
-/*Translate a STA Context from WDI into HAL*/ 
-WPT_STATIC WPT_INLINE 
+/*Translate a STA Context from WDI into HAL*/
+WPT_STATIC WPT_INLINE
 void
 WDI_CopyWDIStaCtxToHALStaCtx
-( 
+(
   tConfigStaParams*          phalConfigSta,
   WDI_ConfigStaReqInfoType*  pwdiConfigSta
 );
- 
-/*Translate a Rate set info from WDI into HAL*/ 
-WPT_STATIC WPT_INLINE void 
+
+/*Translate a Rate set info from WDI into HAL*/
+WPT_STATIC WPT_INLINE void
 WDI_CopyWDIRateSetToHALRateSet
-( 
+(
   tSirMacRateSet* pHalRateSet,
   WDI_RateSet*    pwdiRateSet
 );
@@ -648,7 +659,7 @@
 /*Translate an EDCA Parameter Record from WDI into HAL*/
 WPT_STATIC WPT_INLINE void
 WDI_CopyWDIEDCAParamsToHALEDCAParams
-( 
+(
   tSirMacEdcaParamRecord* phalEdcaParam,
   WDI_EdcaParamRecord*    pWDIEdcaParam
 );
@@ -669,19 +680,19 @@
   WDI_ConfigBSSReqInfoType* pwdiConfigBSS
 );
 
-/*Extract the request CB function and user data from a request structure 
+/*Extract the request CB function and user data from a request structure
   pointed to by user data */
 WPT_STATIC WPT_INLINE void
 WDI_ExtractRequestCBFromEvent
 (
   WDI_EventInfoType* pEvent,
-  WDI_ReqStatusCb*   ppfnReqCB, 
+  WDI_ReqStatusCb*   ppfnReqCB,
   void**             ppUserData
 );
 
 wpt_uint8
 WDI_FindEmptySession
-( 
+(
   WDI_ControlBlockType*   pWDICtx,
   WDI_BSSSessionType**    ppSession
 );
@@ -695,7 +706,7 @@
 );
 
 WDI_Status WDI_SendNvBlobReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 );
@@ -713,10 +724,10 @@
 
 /**
  @brief WDI_getReqMsgString prints the WDI request message in string.
-  
- @param wdiReqMsgId: WDI Message request Id 
-  
- @see 
+
+ @param wdiReqMsgId: WDI Message request Id
+
+ @see
  @return Result of the function call
 */
 static char *WDI_getReqMsgString(wpt_uint16 wdiReqMsgId)
@@ -783,7 +794,7 @@
     CASE_RETURN_STRING( WDI_ADD_STA_SELF_REQ );
     CASE_RETURN_STRING( WDI_DEL_STA_SELF_REQ );
     CASE_RETURN_STRING( WDI_FTM_CMD_REQ );
-    CASE_RETURN_STRING( WDI_START_INNAV_MEAS_REQ );
+    CASE_RETURN_STRING( WDI_START_OEM_DATA_REQ );
     CASE_RETURN_STRING( WDI_HOST_RESUME_REQ );
     CASE_RETURN_STRING( WDI_KEEP_ALIVE_REQ);
   #ifdef FEATURE_WLAN_SCAN_PNO
@@ -809,10 +820,10 @@
 
 /**
  @brief WDI_getRespMsgString prints the WDI resonse message in string.
-  
- @param wdiRespMsgId: WDI Message response Id 
-  
- @see 
+
+ @param wdiRespMsgId: WDI Message response Id
+
+ @see
  @return Result of the function call
 */
 static char *WDI_getRespMsgString(wpt_uint16 wdiRespMsgId)
@@ -879,7 +890,7 @@
     CASE_RETURN_STRING( WDI_ADD_STA_SELF_RESP );
     CASE_RETURN_STRING( WDI_DEL_STA_SELF_RESP );
     CASE_RETURN_STRING( WDI_FTM_CMD_RESP );
-    CASE_RETURN_STRING( WDI_START_INNAV_MEAS_RESP );
+    CASE_RETURN_STRING( WDI_START_OEM_DATA_RESP );
     CASE_RETURN_STRING( WDI_HOST_RESUME_RESP );
     CASE_RETURN_STRING( WDI_KEEP_ALIVE_RESP);
   #ifdef FEATURE_WLAN_SCAN_PNO
@@ -902,10 +913,10 @@
 
 /**
  @brief WDI_getHALStatusMsgString prints the HAL status in string.
-  
- @param halStatusId: HAL status Id 
-  
- @see 
+
+ @param halStatusId: HAL status Id
+
+ @see
  @return Result of the function call
 */
 static char *WDI_getHALStatusMsgString(wpt_uint16 halStatusId)
@@ -950,19 +961,19 @@
   }
 }
 
-/*======================================================================== 
- 
+/*========================================================================
+
                              INITIALIZATION APIs
- 
+
 ==========================================================================*/
 
 /**
  @brief WDI_Init is used to initialize the DAL.
- 
+
  DAL will allocate all the resources it needs. It will open PAL, it will also
  open both the data and the control transport which in their turn will open
- DXE/SMD or any other drivers that they need. 
- 
+ DXE/SMD or any other drivers that they need.
+
  @param pOSContext: pointer to the OS context provided by the UMAC
                     will be passed on to PAL on Open
         ppWDIGlobalCtx: output pointer of Global Context
@@ -970,9 +981,9 @@
 
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_Init
-( 
+(
   void*                      pOSContext,
   void**                     ppWDIGlobalCtx,
   WDI_DeviceCapabilityType*  pWdiDevCapability,
@@ -980,9 +991,9 @@
 )
 {
   wpt_uint8               i;
-  wpt_status              wptStatus; 
+  wpt_status              wptStatus;
   WDI_Status              wdiStatus;
-  WCTS_TransportCBsType   wctsCBs; 
+  WCTS_TransportCBsType   wctsCBs;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
 
   /*---------------------------------------------------------------------
@@ -993,29 +1004,29 @@
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
               "Invalid input parameters in WDI_Init");
 
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   /*---------------------------------------------------------------------
-    Check to see if the module has already been initialized or not 
+    Check to see if the module has already been initialized or not
   ---------------------------------------------------------------------*/
   if ( eWLAN_PAL_FALSE != gWDIInitialized )
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
               "WDI module already initialized - return");
 
-    return WDI_STATUS_SUCCESS; 
+    return WDI_STATUS_SUCCESS;
   }
 
   /*Module is now initialized - this flag is to ensure the fact that multiple
    init will not happen on WDI
    !! - potential race does exist because read and set are not atomic,
    however an atomic operation would be closely here - reanalyze if necessary*/
-  gWDIInitialized = eWLAN_PAL_TRUE; 
+  gWDIInitialized = eWLAN_PAL_TRUE;
 
   /*Setup the control block */
   WDI_CleanCB(&gWDICb);
-  gWDICb.pOSContext = pOSContext; 
+  gWDICb.pOSContext = pOSContext;
 
   /*Setup the STA Table*/
   wdiStatus = WDI_STATableInit(&gWDICb);
@@ -1052,8 +1063,8 @@
 
   /*Initialize the response timer - it will be used to time all messages
     expected as response from device*/
-  wptStatus = wpalTimerInit( &gWDICb.wptResponseTimer, 
-                             WDI_ResponseTimerCB, 
+  wptStatus = wpalTimerInit( &gWDICb.wptResponseTimer,
+                             WDI_ResponseTimerCB,
                              &gWDICb);
   if ( eWLAN_PAL_STATUS_SUCCESS != wptStatus )
   {
@@ -1113,7 +1124,7 @@
 
   /* Init Set power state event */
   wptStatus = wpalEventInit(&gWDICb.setPowerStateEvent);
-  if ( eWLAN_PAL_STATUS_SUCCESS != wptStatus ) 
+  if ( eWLAN_PAL_STATUS_SUCCESS != wptStatus )
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
                 "%s: Failed to initialize power state event, status %d",
@@ -1123,7 +1134,7 @@
 
   /* Init WCTS action event */
   wptStatus = wpalEventInit(&gWDICb.wctsActionEvent);
-  if ( eWLAN_PAL_STATUS_SUCCESS !=  wptStatus ) 
+  if ( eWLAN_PAL_STATUS_SUCCESS !=  wptStatus )
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
                 "%s: Failed to initialize WCTS action event, status %d",
@@ -1132,17 +1143,17 @@
   }
 
   /*------------------------------------------------------------------------
-    Open the Transport Services for Control and Data 
+    Open the Transport Services for Control and Data
    ------------------------------------------------------------------------*/
   wctsCBs.wctsNotifyCB      = WDI_NotifyMsgCTSCB;
   wctsCBs.wctsNotifyCBData  = &gWDICb;
-  wctsCBs.wctsRxMsgCB       = WDI_RXMsgCTSCB; 
+  wctsCBs.wctsRxMsgCB       = WDI_RXMsgCTSCB;
   wctsCBs.wctsRxMsgCBData   = &gWDICb;
 
-  gWDICb.bCTOpened          = eWLAN_PAL_FALSE; 
+  gWDICb.bCTOpened          = eWLAN_PAL_FALSE;
   gWDICb.wctsHandle = WCTS_OpenTransport( szTransportChName ,
-                                          WDI_CT_CHANNEL_SIZE, 
-                                          &wctsCBs ); 
+                                          WDI_CT_CHANNEL_SIZE,
+                                          &wctsCBs );
 
   if ( NULL == gWDICb.wctsHandle )
   {
@@ -1154,7 +1165,7 @@
   gWDICb.driverMode = (tDriverType)driverType;
   /* FTM mode not need to open Transport Driver */
   if(eDRIVER_TYPE_MFG != (tDriverType)driverType)
-  {  
+  {
     /*------------------------------------------------------------------------
      Open the Data Transport
      ------------------------------------------------------------------------*/
@@ -1167,13 +1178,13 @@
   }
 
   /*The WDI is initialized - set state to init */
-  gWDICb.uGlobalState = WDI_INIT_ST; 
+  gWDICb.uGlobalState = WDI_INIT_ST;
 
   /*Send the context as a ptr to the global WDI Control Block*/
   *ppWDIGlobalCtx = &gWDICb;
 
   /*Fill in the device capabilities*/
-  pWdiDevCapability->bFrameXtlSupported = eWLAN_PAL_FALSE; 
+  pWdiDevCapability->bFrameXtlSupported = eWLAN_PAL_FALSE;
   pWdiDevCapability->ucMaxSTASupported  = gWDICb.ucMaxStations;
   pWdiDevCapability->ucMaxBSSSupported  = gWDICb.ucMaxBssids;
   return WDI_STATUS_SUCCESS;
@@ -1192,7 +1203,7 @@
      */
 
      eventStatus = wpalEventReset(&gWDICb.wctsActionEvent);
-     if ( eWLAN_PAL_STATUS_SUCCESS != eventStatus ) 
+     if ( eWLAN_PAL_STATUS_SUCCESS != eventStatus )
      {
         WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                    "%s: Failed to reset WCTS action event", __FUNCTION__);
@@ -1206,7 +1217,7 @@
         the channel to be closed */
      if ( eWLAN_PAL_STATUS_SUCCESS == eventStatus )
      {
-        eventStatus = wpalEventWait(&gWDICb.wctsActionEvent, 
+        eventStatus = wpalEventWait(&gWDICb.wctsActionEvent,
                                     WDI_WCTS_ACTION_TIMEOUT);
         if ( eWLAN_PAL_STATUS_SUCCESS != eventStatus )
         {
@@ -1262,23 +1273,23 @@
          If the RIVA sub-system is not yet up and running DAL
          will queue the request for Open and will wait for the
          SMD notification before attempting to send down the
-         message to HAL. 
+         message to HAL.
 
  WDI_Init must have been called.
 
- @param wdiStartParams: the start parameters as specified by 
+ @param wdiStartParams: the start parameters as specified by
                       the Device Interface
-  
+
         wdiStartRspCb: callback for passing back the response of
         the start operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_Start
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_Start
 (
   WDI_StartReqParamsType*  pwdiStartParams,
@@ -1290,23 +1301,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_START_REQ;
-  wdiEventData.pEventData      = pwdiStartParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiStartParams); 
-  wdiEventData.pCBfnc          = wdiStartRspCb; 
+  wdiEventData.pEventData      = pwdiStartParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiStartParams);
+  wdiEventData.pCBfnc          = wdiStartRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -1321,24 +1332,24 @@
         in started state.
 
          In state BUSY this request will be queued.
-  
-         Request will not be accepted in any other state. 
+
+         Request will not be accepted in any other state.
 
  WDI_Start must have been called.
 
- @param wdiStopParams: the stop parameters as specified by 
+ @param wdiStopParams: the stop parameters as specified by
                       the Device Interface
-  
+
         wdiStopRspCb: callback for passing back the response of
         the stop operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_Start
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_Stop
 (
   WDI_StopReqParamsType*  pwdiStopParams,
@@ -1351,14 +1362,14 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*Access to the global state must be locked before cleaning */
@@ -1378,9 +1389,9 @@
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_STOP_REQ;
-  wdiEventData.pEventData      = pwdiStopParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiStopParams); 
-  wdiEventData.pCBfnc          = wdiStopRspCb; 
+  wdiEventData.pEventData      = pwdiStopParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiStopParams);
+  wdiEventData.pCBfnc          = wdiStopRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_STOP_EVENT, &wdiEventData);
@@ -1390,20 +1401,20 @@
 
 
 /**
- @brief WDI_Close will be called when the upper MAC no longer 
+ @brief WDI_Close will be called when the upper MAC no longer
         needs to interact with DAL. DAL will free its control
         block.
-  
-        It is only accepted in state STOPPED.  
+
+        It is only accepted in state STOPPED.
 
  WDI_Stop must have been called.
 
  @param none
-  
+
  @see WDI_Stop
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_Close
 (
   void
@@ -1416,21 +1427,21 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*Reset WCTS action event prior to posting the WDI_CLOSE_REQ
    (the control transport will be closed by the FSM and we'll want
    to wait until that completes)*/
   eventStatus = wpalEventReset(&gWDICb.wctsActionEvent);
-  if ( eWLAN_PAL_STATUS_SUCCESS != eventStatus ) 
+  if ( eWLAN_PAL_STATUS_SUCCESS != eventStatus )
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Failed to reset WCTS action event", __FUNCTION__);
@@ -1441,9 +1452,9 @@
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_CLOSE_REQ;
-  wdiEventData.pEventData      = NULL; 
-  wdiEventData.uEventDataSize  = 0; 
-  wdiEventData.pCBfnc          = NULL; 
+  wdiEventData.pEventData      = NULL;
+  wdiEventData.uEventDataSize  = 0;
+  wdiEventData.pCBfnc          = NULL;
   wdiEventData.pUserData       = NULL;
 
   gWDIInitialized = eWLAN_PAL_FALSE;
@@ -1454,7 +1465,7 @@
     (but only if we were able to reset the event flag*/
   if ( eWLAN_PAL_STATUS_SUCCESS == eventStatus )
   {
-     eventStatus = wpalEventWait(&gWDICb.wctsActionEvent, 
+     eventStatus = wpalEventWait(&gWDICb.wctsActionEvent,
                                  WDI_WCTS_ACTION_TIMEOUT);
      if ( eWLAN_PAL_STATUS_SUCCESS != eventStatus )
      {
@@ -1469,7 +1480,7 @@
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "WDI Close failed to destroy an event");
-     WDI_ASSERT(0); 
+     WDI_ASSERT(0);
   }
 
    /* Destroy the Set Power State event */
@@ -1479,7 +1490,7 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "WDI Close failed to destroy an event");
 
-      WDI_ASSERT(0); 
+      WDI_ASSERT(0);
    }
 
   /*------------------------------------------------------------------------
@@ -1490,7 +1501,7 @@
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
               "WDI Init failed to close the DP Util Module");
 
-    WDI_ASSERT(0); 
+    WDI_ASSERT(0);
   }
 
   /*destroy the BSS sessions pending Queue */
@@ -1504,7 +1515,7 @@
 
   /* destroy the WDI Pending Request Queue*/
   wpal_list_destroy(&(gWDICb.wptPendingQueue));
-  
+
   /*destroy the response timer */
   wptStatus = wpalTimerDelete( &gWDICb.wptResponseTimer);
 
@@ -1634,37 +1645,37 @@
 }/*WDI_Shutdown*/
 
 
-/*======================================================================== 
- 
+/*========================================================================
+
                              SCAN APIs
- 
+
 ==========================================================================*/
 
 /**
- @brief WDI_InitScanReq will be called when the upper MAC wants 
+ @brief WDI_InitScanReq will be called when the upper MAC wants
         the WLAN Device to get ready for a scan procedure. Upon
         the call of this API the WLAN DAL will pack and send a
         HAL Init Scan 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. 
+        be allowed in any other state.
 
  WDI_Start must have been called.
 
  @param wdiInitScanParams: the init scan parameters as specified
                       by the Device Interface
-  
+
         wdiInitScanRspCb: callback for passing back the response
         of the init scan operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_Start
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_InitScanReq
 (
   WDI_InitScanReqParamsType*  pwdiInitScanParams,
@@ -1676,23 +1687,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_INIT_SCAN_REQ;
-  wdiEventData.pEventData      = pwdiInitScanParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiInitScanParams); 
-  wdiEventData.pCBfnc          = wdiInitScanRspCb; 
+  wdiEventData.pEventData      = pwdiInitScanParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiInitScanParams);
+  wdiEventData.pCBfnc          = wdiInitScanRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -1700,31 +1711,31 @@
 }/*WDI_InitScanReq*/
 
 /**
- @brief WDI_StartScanReq will be called when the upper MAC 
+ @brief WDI_StartScanReq will be called when the upper MAC
         wishes to change the Scan channel on the WLAN Device.
         Upon the call of this API the WLAN DAL will pack and
         send a HAL Start Scan 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. 
+        be allowed in any other state.
 
  WDI_InitScanReq must have been called.
 
- @param wdiStartScanParams: the start scan parameters as 
+ @param wdiStartScanParams: the start scan parameters as
                       specified by the Device Interface
-  
+
         wdiStartScanRspCb: callback for passing back the
         response of the start scan operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_InitScanReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_StartScanReq
 (
   WDI_StartScanReqParamsType*  pwdiStartScanParams,
@@ -1736,23 +1747,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_START_SCAN_REQ;
-  wdiEventData.pEventData      = pwdiStartScanParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiStartScanParams); 
-  wdiEventData.pCBfnc          = wdiStartScanRspCb; 
+  wdiEventData.pEventData      = pwdiStartScanParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiStartScanParams);
+  wdiEventData.pCBfnc          = wdiStartScanRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -1761,7 +1772,7 @@
 
 
 /**
- @brief WDI_EndScanReq will be called when the upper MAC is 
+ @brief WDI_EndScanReq will be called when the upper MAC is
         wants to end scanning for a particular channel that it
         had set before by calling Scan Start on the WLAN Device.
         Upon the call of this API the WLAN DAL will pack and
@@ -1769,23 +1780,23 @@
         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. 
+        be allowed in any other state.
 
  WDI_StartScanReq must have been called.
 
- @param wdiEndScanParams: the end scan parameters as specified 
+ @param wdiEndScanParams: the end scan parameters as specified
                       by the Device Interface
-  
+
         wdiEndScanRspCb: callback for passing back the response
         of the end scan operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_StartScanReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_EndScanReq
 (
   WDI_EndScanReqParamsType* pwdiEndScanParams,
@@ -1797,23 +1808,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_END_SCAN_REQ;
-  wdiEventData.pEventData      = pwdiEndScanParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiEndScanParams); 
-  wdiEventData.pCBfnc          = wdiEndScanRspCb; 
+  wdiEventData.pEventData      = pwdiEndScanParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiEndScanParams);
+  wdiEventData.pCBfnc          = wdiEndScanRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -1822,31 +1833,31 @@
 
 
 /**
- @brief WDI_FinishScanReq will be called when the upper MAC has 
+ @brief WDI_FinishScanReq will be called when the upper MAC has
         completed the scan process on the WLAN Device. Upon the
         call of this API the WLAN DAL will pack and send a HAL
         Finish Scan Request 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. 
+        be allowed in any other state.
 
  WDI_InitScanReq must have been called.
 
- @param wdiFinishScanParams: the finish scan  parameters as 
+ @param wdiFinishScanParams: the finish scan  parameters as
                       specified by the Device Interface
-  
+
         wdiFinishScanRspCb: callback for passing back the
         response of the finish scan operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_InitScanReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_FinishScanReq
 (
   WDI_FinishScanReqParamsType* pwdiFinishScanParams,
@@ -1858,60 +1869,60 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_FINISH_SCAN_REQ;
-  wdiEventData.pEventData      = pwdiFinishScanParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiFinishScanParams); 
-  wdiEventData.pCBfnc          = wdiFinishScanRspCb; 
+  wdiEventData.pEventData      = pwdiFinishScanParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiFinishScanParams);
+  wdiEventData.pCBfnc          = wdiFinishScanRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 
 }/*WDI_FinishScanReq*/
 
-/*======================================================================== 
- 
+/*========================================================================
+
                           ASSOCIATION APIs
- 
+
 ==========================================================================*/
 
 /**
- @brief WDI_JoinReq will be called when the upper MAC is ready 
+ @brief WDI_JoinReq will be called when the upper MAC is ready
         to start an association procedure to a BSS. Upon the
         call of this API the WLAN DAL will pack and send a HAL
         Join 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. 
+        be allowed in any other state.
 
  WDI_Start must have been called.
 
- @param wdiJoinParams: the join parameters as specified by 
+ @param wdiJoinParams: the join parameters as specified by
                       the Device Interface
-  
+
         wdiJoinRspCb: callback for passing back the response of
         the join operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_Start
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_JoinReq
 (
   WDI_JoinReqParamsType* pwdiJoinParams,
@@ -1923,23 +1934,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_JOIN_REQ;
-  wdiEventData.pEventData      = pwdiJoinParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiJoinParams); 
-  wdiEventData.pCBfnc          = wdiJoinRspCb; 
+  wdiEventData.pEventData      = pwdiJoinParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiJoinParams);
+  wdiEventData.pCBfnc          = wdiJoinRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -1947,7 +1958,7 @@
 }/*WDI_JoinReq*/
 
 /**
- @brief WDI_ConfigBSSReq will be called when the upper MAC 
+ @brief WDI_ConfigBSSReq will be called when the upper MAC
         wishes to configure the newly acquired or in process of
         being acquired BSS to the HW . Upon the call of this API
         the WLAN DAL will pack and send a HAL Config BSS request
@@ -1955,24 +1966,24 @@
         STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_JoinReq must have been called.
 
- @param wdiConfigBSSParams: the config BSS parameters as 
+ @param wdiConfigBSSParams: the config BSS parameters as
                       specified by the Device Interface
-  
+
         wdiConfigBSSRspCb: callback for passing back the
         response of the config BSS operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_JoinReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_ConfigBSSReq
 (
   WDI_ConfigBSSReqParamsType* pwdiConfigBSSParams,
@@ -1984,23 +1995,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_CONFIG_BSS_REQ;
-  wdiEventData.pEventData      = pwdiConfigBSSParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiConfigBSSParams); 
-  wdiEventData.pCBfnc          = wdiConfigBSSRspCb; 
+  wdiEventData.pEventData      = pwdiConfigBSSParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiConfigBSSParams);
+  wdiEventData.pCBfnc          = wdiConfigBSSRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2008,30 +2019,30 @@
 }/*WDI_ConfigBSSReq*/
 
 /**
- @brief WDI_DelBSSReq will be called when the upper MAC is 
+ @brief WDI_DelBSSReq will be called when the upper MAC is
         disassociating from the BSS and wishes to notify HW.
         Upon the call of this API the WLAN DAL will pack and
         send a HAL Del BSS 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. 
+        be allowed in any other state.
 
  WDI_ConfigBSSReq or WDI_PostAssocReq must have been called.
 
- @param wdiDelBSSParams: the del BSS parameters as specified by 
+ @param wdiDelBSSParams: the del BSS parameters as specified by
                       the Device Interface
-  
+
         wdiDelBSSRspCb: callback for passing back the response
         of the del bss operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
- @see WDI_ConfigBSSReq, WDI_PostAssocReq 
+        callback
+
+ @see WDI_ConfigBSSReq, WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_DelBSSReq
 (
   WDI_DelBSSReqParamsType* pwdiDelBSSParams,
@@ -2043,23 +2054,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_DEL_BSS_REQ;
-  wdiEventData.pEventData      = pwdiDelBSSParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiDelBSSParams); 
-  wdiEventData.pCBfnc          = wdiDelBSSRspCb; 
+  wdiEventData.pEventData      = pwdiDelBSSParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiDelBSSParams);
+  wdiEventData.pCBfnc          = wdiDelBSSRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2067,31 +2078,31 @@
 }/*WDI_DelBSSReq*/
 
 /**
- @brief WDI_PostAssocReq will be called when the upper MAC has 
+ @brief WDI_PostAssocReq will be called when the upper MAC has
         associated to a BSS and wishes to configure HW for
         associated state. Upon the call of this API the WLAN DAL
         will pack and send a HAL Post Assoc 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. 
+        be allowed in any other state.
 
  WDI_JoinReq must have been called.
 
  @param wdiPostAssocReqParams: the assoc parameters as specified
                       by the Device Interface
-  
+
         wdiPostAssocRspCb: callback for passing back the
         response of the post assoc operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_JoinReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_PostAssocReq
 (
   WDI_PostAssocReqParamsType* pwdiPostAssocReqParams,
@@ -2103,23 +2114,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_POST_ASSOC_REQ;
-  wdiEventData.pEventData      = pwdiPostAssocReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiPostAssocReqParams); 
-  wdiEventData.pCBfnc          = wdiPostAssocRspCb; 
+  wdiEventData.pEventData      = pwdiPostAssocReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiPostAssocReqParams);
+  wdiEventData.pCBfnc          = wdiPostAssocRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2127,7 +2138,7 @@
 }/*WDI_PostAssocReq*/
 
 /**
- @brief WDI_DelSTAReq will be called when the upper MAC when an 
+ @brief WDI_DelSTAReq will be called when the upper MAC when an
         association with another STA has ended and the station
         must be deleted from HW. Upon the call of this API the
         WLAN DAL will pack and send a HAL Del STA request
@@ -2135,23 +2146,23 @@
         STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param wdiDelSTAParams: the Del STA parameters as specified by 
+ @param wdiDelSTAParams: the Del STA parameters as specified by
                       the Device Interface
-  
+
         wdiDelSTARspCb: callback for passing back the response
         of the del STA operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_DelSTAReq
 (
   WDI_DelSTAReqParamsType* pwdiDelSTAParams,
@@ -2163,33 +2174,33 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_DEL_STA_REQ;
-  wdiEventData.pEventData      = pwdiDelSTAParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiDelSTAParams); 
-  wdiEventData.pCBfnc          = wdiDelSTARspCb; 
+  wdiEventData.pEventData      = pwdiDelSTAParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiDelSTAParams);
+  wdiEventData.pCBfnc          = wdiDelSTARspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 
 }/*WDI_DelSTAReq*/
 
-/*======================================================================== 
- 
+/*========================================================================
+
                              SECURITY APIs
- 
+
 ==========================================================================*/
 
 /**
@@ -2200,24 +2211,24 @@
         STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param wdiSetBSSKeyParams: the BSS Key set parameters as 
+ @param wdiSetBSSKeyParams: the BSS Key set parameters as
                       specified by the Device Interface
-  
+
         wdiSetBSSKeyRspCb: callback for passing back the
         response of the set BSS Key operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetBSSKeyReq
 (
   WDI_SetBSSKeyReqParamsType* pwdiSetBSSKeyParams,
@@ -2229,23 +2240,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_SET_BSS_KEY_REQ;
-  wdiEventData.pEventData      = pwdiSetBSSKeyParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiSetBSSKeyParams); 
-  wdiEventData.pCBfnc          = wdiSetBSSKeyRspCb; 
+  wdiEventData.pEventData      = pwdiSetBSSKeyParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiSetBSSKeyParams);
+  wdiEventData.pCBfnc          = wdiSetBSSKeyRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2260,24 +2271,24 @@
         STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_SetBSSKeyReq must have been called.
 
- @param wdiRemoveBSSKeyParams: the remove BSS key parameters as 
+ @param wdiRemoveBSSKeyParams: the remove BSS key parameters as
                       specified by the Device Interface
-  
+
         wdiRemoveBSSKeyRspCb: callback for passing back the
         response of the remove BSS key operation received from
         the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_SetBSSKeyReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_RemoveBSSKeyReq
 (
   WDI_RemoveBSSKeyReqParamsType* pwdiRemoveBSSKeyParams,
@@ -2289,23 +2300,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_RMV_BSS_KEY_REQ;
-  wdiEventData.pEventData      = pwdiRemoveBSSKeyParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiRemoveBSSKeyParams); 
-  wdiEventData.pCBfnc          = wdiRemoveBSSKeyRspCb; 
+  wdiEventData.pEventData      = pwdiRemoveBSSKeyParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiRemoveBSSKeyParams);
+  wdiEventData.pCBfnc          = wdiRemoveBSSKeyRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2314,31 +2325,31 @@
 
 
 /**
- @brief WDI_SetSTAKeyReq will be called when the upper MAC is 
+ @brief WDI_SetSTAKeyReq will be called when the upper MAC is
         ready to install a STA(ast) encryption key in HW. Upon
         the call of this API the WLAN DAL will pack and send a
         HAL Set STA Key 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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param wdiSetSTAKeyParams: the set STA key parameters as 
+ @param wdiSetSTAKeyParams: the set STA key parameters as
                       specified by the Device Interface
-  
+
         wdiSetSTAKeyRspCb: callback for passing back the
         response of the set STA key operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetSTAKeyReq
 (
   WDI_SetSTAKeyReqParamsType* pwdiSetSTAKeyParams,
@@ -2350,23 +2361,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_SET_STA_KEY_REQ;
-  wdiEventData.pEventData      = pwdiSetSTAKeyParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiSetSTAKeyParams); 
-  wdiEventData.pCBfnc          = wdiSetSTAKeyRspCb; 
+  wdiEventData.pEventData      = pwdiSetSTAKeyParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiSetSTAKeyParams);
+  wdiEventData.pCBfnc          = wdiSetSTAKeyRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2375,31 +2386,31 @@
 
 
 /**
- @brief WDI_RemoveSTAKeyReq will be called when the upper MAC 
+ @brief WDI_RemoveSTAKeyReq will be called when the upper MAC
         wants to uninstall a previously set STA key in HW. Upon
         the call of this API the WLAN DAL will pack and send a
         HAL Remove STA Key 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. 
+        be allowed in any other state.
 
  WDI_SetSTAKeyReq must have been called.
 
- @param wdiRemoveSTAKeyParams: the remove STA key parameters as 
+ @param wdiRemoveSTAKeyParams: the remove STA key parameters as
                       specified by the Device Interface
-  
+
         wdiRemoveSTAKeyRspCb: callback for passing back the
         response of the remove STA key operation received from
         the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_SetSTAKeyReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_RemoveSTAKeyReq
 (
   WDI_RemoveSTAKeyReqParamsType* pwdiRemoveSTAKeyParams,
@@ -2411,23 +2422,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_RMV_STA_KEY_REQ;
-  wdiEventData.pEventData      = pwdiRemoveSTAKeyParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiRemoveSTAKeyParams); 
-  wdiEventData.pCBfnc          = wdiRemoveSTAKeyRspCb; 
+  wdiEventData.pEventData      = pwdiRemoveSTAKeyParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiRemoveSTAKeyParams);
+  wdiEventData.pCBfnc          = wdiRemoveSTAKeyRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2436,31 +2447,31 @@
 
 
 /**
- @brief WDI_SetSTABcastKeyReq will be called when the upper MAC 
+ @brief WDI_SetSTABcastKeyReq will be called when the upper MAC
         wants to install a STA Bcast encryption key on the HW.
         Upon the call of this API the WLAN DAL will pack and
         send a HAL Start 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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param pwdiSetSTABcastKeyParams: the BSS Key set parameters as 
+ @param pwdiSetSTABcastKeyParams: the BSS Key set parameters as
                       specified by the Device Interface
-  
+
         wdiSetSTABcastKeyRspCb: callback for passing back the
         response of the set BSS Key operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetSTABcastKeyReq
 (
   WDI_SetSTAKeyReqParamsType* pwdiSetSTABcastKeyParams,
@@ -2473,23 +2484,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_SET_STA_BCAST_KEY_REQ;
-  wdiEventData.pEventData      = pwdiSetSTABcastKeyParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiSetSTABcastKeyParams); 
-  wdiEventData.pCBfnc          = wdiSetSTABcastKeyRspCb; 
+  wdiEventData.pEventData      = pwdiSetSTABcastKeyParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiSetSTABcastKeyParams);
+  wdiEventData.pCBfnc          = wdiSetSTABcastKeyRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2497,32 +2508,32 @@
 }/*WDI_SetSTABcastKeyReq*/
 
 /**
- @brief WDI_RemoveSTABcastKeyReq will be called when the upper 
+ @brief WDI_RemoveSTABcastKeyReq will be called when the upper
         MAC wants to uninstall a STA Bcast key from HW. Upon the
         call of this API the WLAN DAL will pack and send a HAL
         Remove STA Bcast Key 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. 
+        be allowed in any other state.
 
  WDI_SetSTABcastKeyReq must have been called.
 
- @param pwdiRemoveSTABcastKeyParams: the remove BSS key 
+ @param pwdiRemoveSTABcastKeyParams: the remove BSS key
                       parameters as specified by the Device
                       Interface
-  
+
         wdiRemoveSTABcastKeyRspCb: callback for passing back the
         response of the remove STA Bcast key operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_SetSTABcastKeyReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_RemoveSTABcastKeyReq
 (
   WDI_RemoveSTAKeyReqParamsType* pwdiRemoveSTABcastKeyParams,
@@ -2534,23 +2545,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_RMV_STA_BCAST_KEY_REQ;
-  wdiEventData.pEventData      = pwdiRemoveSTABcastKeyParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiRemoveSTABcastKeyParams); 
-  wdiEventData.pCBfnc          = wdiRemoveSTABcastKeyRspCb; 
+  wdiEventData.pEventData      = pwdiRemoveSTABcastKeyParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiRemoveSTABcastKeyParams);
+  wdiEventData.pCBfnc          = wdiRemoveSTABcastKeyRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2558,32 +2569,32 @@
 }/*WDI_RemoveSTABcastKeyReq*/
 
 /**
- @brief WDI_SetMaxTxPowerReq will be called when the upper 
+ @brief WDI_SetMaxTxPowerReq will be called when the upper
         MAC wants to set Max Tx Power to HW. Upon the
         call of this API the WLAN DAL will pack and send a HAL
         Remove STA Bcast Key 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. 
+        be allowed in any other state.
 
  WDI_SetSTABcastKeyReq must have been called.
 
- @param pwdiRemoveSTABcastKeyParams: the remove BSS key 
+ @param pwdiRemoveSTABcastKeyParams: the remove BSS key
                       parameters as specified by the Device
                       Interface
-  
+
         wdiRemoveSTABcastKeyRspCb: callback for passing back the
         response of the remove STA Bcast key operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_SetMaxTxPowerReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetMaxTxPowerReq
 (
   WDI_SetMaxTxPowerParamsType*   pwdiSetMaxTxPowerParams,
@@ -2595,23 +2606,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_SET_MAX_TX_POWER_REQ;
-  wdiEventData.pEventData      = pwdiSetMaxTxPowerParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiSetMaxTxPowerParams); 
-  wdiEventData.pCBfnc          = wdiReqStatusCb; 
+  wdiEventData.pEventData      = pwdiSetMaxTxPowerParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiSetMaxTxPowerParams);
+  wdiEventData.pCBfnc          = wdiReqStatusCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2628,7 +2639,6 @@
 {
   WDI_EventInfoType wdiEventData;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
   /*------------------------------------------------------------------------
     Sanity Check 
   ------------------------------------------------------------------------*/
@@ -2657,7 +2667,7 @@
 /*======================================================================== 
  
                             QoS and BA APIs
- 
+
 ==========================================================================*/
 
 /**
@@ -2670,23 +2680,23 @@
         DAL is in state STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
  @param wdiAddTsReqParams: the add TS parameters as specified by
                       the Device Interface
-  
+
         wdiAddTsRspCb: callback for passing back the response of
         the add TS operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_AddTSReq
 (
   WDI_AddTSReqParamsType* pwdiAddTsReqParams,
@@ -2698,23 +2708,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_ADD_TS_REQ;
-  wdiEventData.pEventData      = pwdiAddTsReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiAddTsReqParams); 
-  wdiEventData.pCBfnc          = wdiAddTsRspCb; 
+  wdiEventData.pEventData      = pwdiAddTsReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiAddTsReqParams);
+  wdiEventData.pCBfnc          = wdiAddTsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2732,23 +2742,23 @@
         in state STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_AddTSReq must have been called.
 
  @param wdiDelTsReqParams: the del TS parameters as specified by
                       the Device Interface
-  
+
         wdiDelTsRspCb: callback for passing back the response of
         the del TS operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_AddTSReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_DelTSReq
 (
   WDI_DelTSReqParamsType* pwdiDelTsReqParams,
@@ -2760,23 +2770,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_DEL_TS_REQ;
-  wdiEventData.pEventData      = pwdiDelTsReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiDelTsReqParams); 
-  wdiEventData.pCBfnc          = wdiDelTsRspCb; 
+  wdiEventData.pEventData      = pwdiDelTsReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiDelTsReqParams);
+  wdiEventData.pCBfnc          = wdiDelTsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2786,7 +2796,7 @@
 
 
 /**
- @brief WDI_UpdateEDCAParams will be called when the upper MAC 
+ @brief WDI_UpdateEDCAParams will be called when the upper MAC
         wishes to update the EDCA parameters used by HW for QoS
         data traffic. Upon the call of this API the WLAN DAL
         will pack and send a HAL Update EDCA Params request
@@ -2794,23 +2804,23 @@
         STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param wdiUpdateEDCAParams: the start parameters as specified 
+ @param wdiUpdateEDCAParams: the start parameters as specified
                       by the Device Interface
-  
+
         wdiUpdateEDCAParamsRspCb: callback for passing back the
         response of the start operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_UpdateEDCAParams
 (
   WDI_UpdateEDCAParamsType*    pwdiUpdateEDCAParams,
@@ -2822,23 +2832,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_UPD_EDCA_PRMS_REQ;
-  wdiEventData.pEventData      = pwdiUpdateEDCAParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiUpdateEDCAParams); 
-  wdiEventData.pCBfnc          = wdiUpdateEDCAParamsRspCb; 
+  wdiEventData.pEventData      = pwdiUpdateEDCAParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiUpdateEDCAParams);
+  wdiEventData.pCBfnc          = wdiUpdateEDCAParamsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2855,23 +2865,23 @@
         in state STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
  @param wdiAddBAReqParams: the add BA parameters as specified by
                       the Device Interface
-  
+
         wdiAddBARspCb: callback for passing back the response of
         the add BA operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_AddBASessionReq
 (
   WDI_AddBASessionReqParamsType* pwdiAddBASessionReqParams,
@@ -2883,23 +2893,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_ADD_BA_SESSION_REQ;
-  wdiEventData.pEventData      = pwdiAddBASessionReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiAddBASessionReqParams); 
-  wdiEventData.pCBfnc          = wdiAddBASessionRspCb; 
+  wdiEventData.pEventData      = pwdiAddBASessionReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiAddBASessionReqParams);
+  wdiEventData.pCBfnc          = wdiAddBASessionRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -2907,30 +2917,30 @@
 }/*WDI_AddBASessionReq*/
 
 /**
- @brief WDI_DelBAReq will be called when the upper MAC wants to 
+ @brief WDI_DelBAReq will be called when the upper MAC wants to
         inform HW that it has deleted a previously created BA
         session. Upon the call of this API the WLAN DAL will
         pack and send a HAL Del BA 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. 
+        be allowed in any other state.
 
  WDI_AddBAReq must have been called.
 
  @param wdiDelBAReqParams: the del BA parameters as specified by
                       the Device Interface
-  
+
         wdiDelBARspCb: callback for passing back the response of
         the del BA operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_AddBAReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_DelBAReq
 (
   WDI_DelBAReqParamsType* pwdiDelBAReqParams,
@@ -2942,61 +2952,61 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_DEL_BA_REQ;
-  wdiEventData.pEventData      = pwdiDelBAReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiDelBAReqParams); 
-  wdiEventData.pCBfnc          = wdiDelBARspCb; 
+  wdiEventData.pEventData      = pwdiDelBAReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiDelBAReqParams);
+  wdiEventData.pCBfnc          = wdiDelBARspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 
 }/*WDI_DelBAReq*/
 
-/*======================================================================== 
- 
+/*========================================================================
+
                             Power Save APIs
- 
+
 ==========================================================================*/
 
 /**
- @brief WDI_SetPwrSaveCfgReq will be called when the upper MAC 
+ @brief WDI_SetPwrSaveCfgReq will be called when the upper MAC
         wants to set the power save related configurations of
         the WLAN Device. Upon the call of this API the WLAN DAL
         will pack and send a HAL Update CFG 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. 
+        be allowed in any other state.
 
  WDI_Start must have been called.
 
- @param pwdiPowerSaveCfg: the power save cfg parameters as 
+ @param pwdiPowerSaveCfg: the power save cfg parameters as
                       specified by the Device Interface
-  
+
         wdiSetPwrSaveCfgCb: callback for passing back the
         response of the set power save cfg operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_Start
- @return Result of the function call  
-*/ 
-WDI_Status 
+ @return Result of the function call
+*/
+WDI_Status
 WDI_SetPwrSaveCfgReq
 (
   WDI_UpdateCfgReqParamsType*   pwdiPowerSaveCfg,
@@ -3008,23 +3018,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_UPDATE_CFG_REQ;
-  wdiEventData.pEventData      = pwdiPowerSaveCfg; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiPowerSaveCfg); 
-  wdiEventData.pCBfnc          = wdiSetPwrSaveCfgCb; 
+  wdiEventData.pEventData      = pwdiPowerSaveCfg;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiPowerSaveCfg);
+  wdiEventData.pCBfnc          = wdiSetPwrSaveCfgCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -3032,27 +3042,27 @@
 }/*WDI_SetPwrSaveCfgReq*/
 
 /**
- @brief WDI_EnterImpsReq will be called when the upper MAC to 
+ @brief WDI_EnterImpsReq will be called when the upper MAC to
         request the device to get into IMPS power state. Upon
         the call of this API the WLAN DAL will send a HAL Enter
         IMPS 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. 
+        be allowed in any other state.
 
-  
- @param wdiEnterImpsRspCb: callback for passing back the 
+
+ @param wdiEnterImpsRspCb: callback for passing back the
         response of the Enter IMPS operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_Start
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_EnterImpsReq
 (
    WDI_EnterImpsRspCb  wdiEnterImpsRspCb,
@@ -3063,23 +3073,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_ENTER_IMPS_REQ;
-  wdiEventData.pEventData      = NULL; 
-  wdiEventData.uEventDataSize  = 0; 
-  wdiEventData.pCBfnc          = wdiEnterImpsRspCb; 
+  wdiEventData.pEventData      = NULL;
+  wdiEventData.uEventDataSize  = 0;
+  wdiEventData.pCBfnc          = wdiEnterImpsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -3087,27 +3097,27 @@
 }/*WDI_EnterImpsReq*/
 
 /**
- @brief WDI_ExitImpsReq will be called when the upper MAC to 
+ @brief WDI_ExitImpsReq will be called when the upper MAC to
         request the device to get out of IMPS power state. Upon
         the call of this API the WLAN DAL will send a HAL Exit
         IMPS 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. 
+        be allowed in any other state.
 
- 
 
- @param wdiExitImpsRspCb: callback for passing back the response 
+
+ @param wdiExitImpsRspCb: callback for passing back the response
         of the Exit IMPS operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_Start
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_ExitImpsReq
 (
    WDI_ExitImpsRspCb  wdiExitImpsRspCb,
@@ -3118,23 +3128,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_EXIT_IMPS_REQ;
-  wdiEventData.pEventData      = NULL; 
-  wdiEventData.uEventDataSize  = 0; 
-  wdiEventData.pCBfnc          = wdiExitImpsRspCb; 
+  wdiEventData.pEventData      = NULL;
+  wdiEventData.uEventDataSize  = 0;
+  wdiEventData.pCBfnc          = wdiExitImpsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -3142,31 +3152,31 @@
 }/*WDI_ExitImpsReq*/
 
 /**
- @brief WDI_EnterBmpsReq will be called when the upper MAC to 
+ @brief WDI_EnterBmpsReq will be called when the upper MAC to
         request the device to get into BMPS power state. Upon
         the call of this API the WLAN DAL will pack and send a
         HAL Enter BMPS 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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param pwdiEnterBmpsReqParams: the Enter BMPS parameters as 
+ @param pwdiEnterBmpsReqParams: the Enter BMPS parameters as
                       specified by the Device Interface
-  
+
         wdiEnterBmpsRspCb: callback for passing back the
         response of the Enter BMPS operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_EnterBmpsReq
 (
    WDI_EnterBmpsReqParamsType *pwdiEnterBmpsReqParams,
@@ -3178,23 +3188,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_ENTER_BMPS_REQ;
-  wdiEventData.pEventData      = pwdiEnterBmpsReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiEnterBmpsReqParams); 
-  wdiEventData.pCBfnc          = wdiEnterBmpsRspCb; 
+  wdiEventData.pEventData      = pwdiEnterBmpsReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiEnterBmpsReqParams);
+  wdiEventData.pCBfnc          = wdiEnterBmpsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -3202,30 +3212,30 @@
 }/*WDI_EnterBmpsReq*/
 
 /**
- @brief WDI_ExitBmpsReq will be called when the upper MAC to 
+ @brief WDI_ExitBmpsReq will be called when the upper MAC to
         request the device to get out of BMPS power state. Upon
         the call of this API the WLAN DAL will pack and send a
         HAL Exit BMPS 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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param pwdiExitBmpsReqParams: the Exit BMPS parameters as 
+ @param pwdiExitBmpsReqParams: the Exit BMPS parameters as
                       specified by the Device Interface
-  
+
         wdiExitBmpsRspCb: callback for passing back the response
         of the Exit BMPS operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_ExitBmpsReq
 (
    WDI_ExitBmpsReqParamsType *pwdiExitBmpsReqParams,
@@ -3237,23 +3247,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_EXIT_BMPS_REQ;
-  wdiEventData.pEventData      = pwdiExitBmpsReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiExitBmpsReqParams); 
-  wdiEventData.pCBfnc          = wdiExitBmpsRspCb; 
+  wdiEventData.pEventData      = pwdiExitBmpsReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiExitBmpsReqParams);
+  wdiEventData.pCBfnc          = wdiExitBmpsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -3261,32 +3271,32 @@
 }/*WDI_ExitBmpsReq*/
 
 /**
- @brief WDI_EnterUapsdReq will be called when the upper MAC to 
+ @brief WDI_EnterUapsdReq will be called when the upper MAC to
         request the device to get into UAPSD power state. Upon
         the call of this API the WLAN DAL will pack and send a
         HAL Enter UAPSD 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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
  WDI_SetUapsdAcParamsReq must have been called.
-  
- @param pwdiEnterUapsdReqParams: the Enter UAPSD parameters as 
+
+ @param pwdiEnterUapsdReqParams: the Enter UAPSD parameters as
                       specified by the Device Interface
-  
+
         wdiEnterUapsdRspCb: callback for passing back the
         response of the Enter UAPSD operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq, WDI_SetUapsdAcParamsReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_EnterUapsdReq
 (
    WDI_EnterUapsdReqParamsType *pwdiEnterUapsdReqParams,
@@ -3298,23 +3308,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_ENTER_UAPSD_REQ;
-  wdiEventData.pEventData      = pwdiEnterUapsdReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiEnterUapsdReqParams); 
-  wdiEventData.pCBfnc          = wdiEnterUapsdRspCb; 
+  wdiEventData.pEventData      = pwdiEnterUapsdReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiEnterUapsdReqParams);
+  wdiEventData.pCBfnc          = wdiEnterUapsdRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -3322,28 +3332,28 @@
 }/*WDI_EnterUapsdReq*/
 
 /**
- @brief WDI_ExitUapsdReq will be called when the upper MAC to 
+ @brief WDI_ExitUapsdReq will be called when the upper MAC to
         request the device to get out of UAPSD power state. Upon
         the call of this API the WLAN DAL will send a HAL Exit
         UAPSD 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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param wdiExitUapsdRspCb: callback for passing back the 
+ @param wdiExitUapsdRspCb: callback for passing back the
         response of the Exit UAPSD operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_ExitUapsdReq
 (
    WDI_ExitUapsdRspCb  wdiExitUapsdRspCb,
@@ -3354,23 +3364,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_EXIT_UAPSD_REQ;
-  wdiEventData.pEventData      = NULL; 
-  wdiEventData.uEventDataSize  = 0; 
-  wdiEventData.pCBfnc          = wdiExitUapsdRspCb; 
+  wdiEventData.pEventData      = NULL;
+  wdiEventData.uEventDataSize  = 0;
+  wdiEventData.pCBfnc          = wdiExitUapsdRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -3378,7 +3388,7 @@
 }/*WDI_ExitUapsdReq*/
 
 /**
- @brief WDI_UpdateUapsdParamsReq will be called when the upper 
+ @brief WDI_UpdateUapsdParamsReq will be called when the upper
         MAC wants to set the UAPSD related configurations
         of an associated STA (while acting as an AP) to the WLAN
         Device. Upon the call of this API the WLAN DAL will pack
@@ -3386,24 +3396,24 @@
         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. 
+        be allowed in any other state.
 
  WDI_ConfigBSSReq must have been called.
 
- @param pwdiUpdateUapsdReqParams: the UAPSD parameters 
+ @param pwdiUpdateUapsdReqParams: the UAPSD parameters
                       as specified by the Device Interface
-  
+
         wdiUpdateUapsdParamsCb: callback for passing back the
         response of the update UAPSD params operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_ConfigBSSReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_UpdateUapsdParamsReq
 (
    WDI_UpdateUapsdReqParamsType *pwdiUpdateUapsdReqParams,
@@ -3415,23 +3425,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_UPDATE_UAPSD_PARAM_REQ;
-  wdiEventData.pEventData      = pwdiUpdateUapsdReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiUpdateUapsdReqParams);; 
-  wdiEventData.pCBfnc          = wdiUpdateUapsdParamsCb; 
+  wdiEventData.pEventData      = pwdiUpdateUapsdReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiUpdateUapsdReqParams);;
+  wdiEventData.pCBfnc          = wdiUpdateUapsdParamsCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -3439,7 +3449,7 @@
 }/*WDI_UpdateUapsdParamsReq*/
 
 /**
- @brief WDI_SetUapsdAcParamsReq will be called when the upper 
+ @brief WDI_SetUapsdAcParamsReq will be called when the upper
         MAC wants to set the UAPSD related configurations before
         requesting for enter UAPSD power state to the WLAN
         Device. Upon the call of this API the WLAN DAL will pack
@@ -3447,24 +3457,24 @@
         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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
  @param pwdiUapsdInfo: the UAPSD parameters as specified by
                       the Device Interface
-  
+
         wdiSetUapsdAcParamsCb: callback for passing back the
         response of the set UAPSD params operation received from
         the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetUapsdAcParamsReq
 (
   WDI_SetUapsdAcParamsReqParamsType*      pwdiUapsdInfo,
@@ -3476,23 +3486,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_SET_UAPSD_PARAM_REQ;
-  wdiEventData.pEventData      = pwdiUapsdInfo; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiUapsdInfo); 
-  wdiEventData.pCBfnc          = wdiSetUapsdAcParamsCb; 
+  wdiEventData.pEventData      = pwdiUapsdInfo;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiUapsdInfo);
+  wdiEventData.pCBfnc          = wdiSetUapsdAcParamsCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -3500,30 +3510,30 @@
 }/*WDI_SetUapsdAcParamsReq*/
 
 /**
- @brief WDI_ConfigureRxpFilterReq will be called when the upper 
+ @brief WDI_ConfigureRxpFilterReq will be called when the upper
         MAC wants to set/reset the RXP filters for received pkts
         (MC, BC etc.). Upon the call of this API the WLAN DAL will pack
         and send a HAL configure RXP filter request message to
         the lower RIVA sub-system.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
-  
- @param pwdiConfigureRxpFilterReqParams: the RXP 
+
+ @param pwdiConfigureRxpFilterReqParams: the RXP
                       filter as specified by the Device
                       Interface
-  
+
         wdiConfigureRxpFilterCb: callback for passing back the
         response of the configure RXP filter operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_ConfigureRxpFilterReq
 (
    WDI_ConfigureRxpFilterReqParamsType *pwdiConfigureRxpFilterReqParams,
@@ -3535,23 +3545,23 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_CONFIGURE_RXP_FILTER_REQ;
-   wdiEventData.pEventData      = pwdiConfigureRxpFilterReqParams; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiConfigureRxpFilterReqParams); 
-   wdiEventData.pCBfnc          = wdiConfigureRxpFilterCb; 
+   wdiEventData.pEventData      = pwdiConfigureRxpFilterReqParams;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiConfigureRxpFilterReqParams);
+   wdiEventData.pCBfnc          = wdiConfigureRxpFilterCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -3565,23 +3575,23 @@
         lower RIVA sub-system.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
-  
- @param pwdiBeaconFilterReqParams: the beacon 
+
+ @param pwdiBeaconFilterReqParams: the beacon
                       filter as specified by the Device
                       Interface
-  
+
         wdiBeaconFilterCb: callback for passing back the
         response of the set beacon filter operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetBeaconFilterReq
 (
    WDI_BeaconFilterReqParamsType   *pwdiBeaconFilterReqParams,
@@ -3593,23 +3603,23 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_SET_BEACON_FILTER_REQ;
-   wdiEventData.pEventData      = pwdiBeaconFilterReqParams; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiBeaconFilterReqParams);; 
-   wdiEventData.pCBfnc          = wdiBeaconFilterCb; 
+   wdiEventData.pEventData      = pwdiBeaconFilterReqParams;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiBeaconFilterReqParams);;
+   wdiEventData.pCBfnc          = wdiBeaconFilterCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -3623,23 +3633,23 @@
         message to the lower RIVA sub-system.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
-  
- @param pwdiBeaconFilterReqParams: the beacon 
+
+ @param pwdiBeaconFilterReqParams: the beacon
                       filter as specified by the Device
                       Interface
-  
+
         wdiBeaconFilterCb: callback for passing back the
         response of the remove beacon filter operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_RemBeaconFilterReq
 (
    WDI_RemBeaconFilterReqParamsType *pwdiBeaconFilterReqParams,
@@ -3651,30 +3661,30 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_REM_BEACON_FILTER_REQ;
-   wdiEventData.pEventData      = pwdiBeaconFilterReqParams; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiBeaconFilterReqParams);; 
-   wdiEventData.pCBfnc          = wdiBeaconFilterCb; 
+   wdiEventData.pEventData      = pwdiBeaconFilterReqParams;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiBeaconFilterReqParams);;
+   wdiEventData.pCBfnc          = wdiBeaconFilterCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }/*WDI_RemBeaconFilterReq*/
 
 /**
- @brief WDI_SetRSSIThresholdsReq will be called when the upper 
+ @brief WDI_SetRSSIThresholdsReq will be called when the upper
         MAC wants to set the RSSI thresholds related
         configurations while in power save. Upon the call of
         this API the WLAN DAL will pack and send a HAL Set RSSI
@@ -3682,24 +3692,24 @@
         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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
  @param pwdiUapsdInfo: the UAPSD parameters as specified by
                       the Device Interface
-  
+
         wdiSetUapsdAcParamsCb: callback for passing back the
         response of the set UAPSD params operation received from
         the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetRSSIThresholdsReq
 (
   WDI_SetRSSIThresholdsReqParamsType*      pwdiRSSIThresholdsParams,
@@ -3711,30 +3721,30 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_SET_RSSI_THRESHOLDS_REQ;
-   wdiEventData.pEventData      = pwdiRSSIThresholdsParams; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiRSSIThresholdsParams);; 
-   wdiEventData.pCBfnc          = wdiSetRSSIThresholdsCb; 
+   wdiEventData.pEventData      = pwdiRSSIThresholdsParams;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiRSSIThresholdsParams);;
+   wdiEventData.pCBfnc          = wdiSetRSSIThresholdsCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }/* WDI_SetRSSIThresholdsReq*/
 
 /**
- @brief WDI_HostOffloadReq will be called when the upper MAC 
+ @brief WDI_HostOffloadReq will be called when the upper MAC
         wants to set the filter to minimize unnecessary host
         wakeup due to broadcast traffic while in power save.
         Upon the call of this API the WLAN DAL will pack and
@@ -3742,24 +3752,24 @@
         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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param pwdiHostOffloadParams: the host offload as specified 
+ @param pwdiHostOffloadParams: the host offload as specified
                       by the Device Interface
-  
+
         wdiHostOffloadCb: callback for passing back the response
         of the host offload operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_HostOffloadReq
 (
   WDI_HostOffloadReqParamsType*      pwdiHostOffloadParams,
@@ -3771,55 +3781,55 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_HOST_OFFLOAD_REQ;
-   wdiEventData.pEventData      = pwdiHostOffloadParams; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiHostOffloadParams);; 
-   wdiEventData.pCBfnc          = wdiHostOffloadCb; 
+   wdiEventData.pEventData      = pwdiHostOffloadParams;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiHostOffloadParams);;
+   wdiEventData.pCBfnc          = wdiHostOffloadCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }/*WDI_HostOffloadReq*/
 
 /**
- @brief WDI_KeepAliveReq will be called when the upper MAC 
-        wants to set the filter to send NULL or unsolicited ARP responses 
+ @brief WDI_KeepAliveReq will be called when the upper MAC
+        wants to set the filter to send NULL or unsolicited ARP responses
         and minimize unnecessary host wakeups due to while in power save.
         Upon the call of this API the WLAN DAL will pack and
         send a HAL Keep Alive 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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param pwdiKeepAliveParams: the Keep Alive as specified 
+ @param pwdiKeepAliveParams: the Keep Alive as specified
                       by the Device Interface
-  
+
         wdiKeepAliveCb: callback for passing back the response
         of the Keep Alive operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_KeepAliveReq
 (
   WDI_KeepAliveReqParamsType*        pwdiKeepAliveParams,
@@ -3831,7 +3841,7 @@
     /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
     /*------------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
     ------------------------------------------------------------------------*/
     if ( eWLAN_PAL_FALSE == gWDIInitialized )
     {
@@ -3839,23 +3849,23 @@
                     "WDI_KeepAliveReq: WDI API call before module "
                     "is initialized - Fail request");
 
-     return WDI_STATUS_E_NOT_ALLOWED; 
+     return WDI_STATUS_E_NOT_ALLOWED;
     }
 
     /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
     ------------------------------------------------------------------------*/
     wdiEventData.wdiRequest      = WDI_KEEP_ALIVE_REQ;
-    wdiEventData.pEventData      = pwdiKeepAliveParams; 
-    wdiEventData.uEventDataSize  = sizeof(*pwdiKeepAliveParams); 
-    wdiEventData.pCBfnc          = wdiKeepAliveCb; 
+    wdiEventData.pEventData      = pwdiKeepAliveParams;
+    wdiEventData.uEventDataSize  = sizeof(*pwdiKeepAliveParams);
+    wdiEventData.pCBfnc          = wdiKeepAliveCb;
     wdiEventData.pUserData       = pUserData;
 
     return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }/*WDI_KeepAliveReq*/
 
 /**
- @brief WDI_WowlAddBcPtrnReq will be called when the upper MAC 
+ @brief WDI_WowlAddBcPtrnReq will be called when the upper MAC
         wants to set the Wowl Bcast ptrn to minimize unnecessary
         host wakeup due to broadcast traffic while in power
         save. Upon the call of this API the WLAN DAL will pack
@@ -3863,24 +3873,24 @@
         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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param pwdiWowlAddBcPtrnParams: the Wowl bcast ptrn as 
+ @param pwdiWowlAddBcPtrnParams: the Wowl bcast ptrn as
                       specified by the Device Interface
-  
+
         wdiWowlAddBcPtrnCb: callback for passing back the
         response of the add Wowl bcast ptrn operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_WowlAddBcPtrnReq
 (
   WDI_WowlAddBcPtrnReqParamsType*    pwdiWowlAddBcPtrnParams,
@@ -3892,54 +3902,54 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_WOWL_ADD_BC_PTRN_REQ;
-   wdiEventData.pEventData      = pwdiWowlAddBcPtrnParams; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiWowlAddBcPtrnParams);; 
-   wdiEventData.pCBfnc          = wdiWowlAddBcPtrnCb; 
+   wdiEventData.pEventData      = pwdiWowlAddBcPtrnParams;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiWowlAddBcPtrnParams);;
+   wdiEventData.pCBfnc          = wdiWowlAddBcPtrnCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }/*WDI_WowlAddBcPtrnReq*/
 
 /**
- @brief WDI_WowlDelBcPtrnReq will be called when the upper MAC 
+ @brief WDI_WowlDelBcPtrnReq will be called when the upper MAC
         wants to clear the Wowl Bcast ptrn. Upon the call of
         this API the WLAN DAL will pack and send a HAL delete
         Wowl Bcast ptrn 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. 
+        be allowed in any other state.
 
  WDI_WowlAddBcPtrnReq must have been called.
 
- @param pwdiWowlDelBcPtrnParams: the Wowl bcast ptrn as 
+ @param pwdiWowlDelBcPtrnParams: the Wowl bcast ptrn as
                       specified by the Device Interface
-  
+
         wdiWowlDelBcPtrnCb: callback for passing back the
         response of the del Wowl bcast ptrn operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_WowlAddBcPtrnReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_WowlDelBcPtrnReq
 (
   WDI_WowlDelBcPtrnReqParamsType*    pwdiWowlDelBcPtrnParams,
@@ -3951,30 +3961,30 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_WOWL_DEL_BC_PTRN_REQ;
-   wdiEventData.pEventData      = pwdiWowlDelBcPtrnParams; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiWowlDelBcPtrnParams);; 
-   wdiEventData.pCBfnc          = wdiWowlDelBcPtrnCb; 
+   wdiEventData.pEventData      = pwdiWowlDelBcPtrnParams;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiWowlDelBcPtrnParams);;
+   wdiEventData.pCBfnc          = wdiWowlDelBcPtrnCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }/*WDI_WowlDelBcPtrnReq*/
 
 /**
- @brief WDI_WowlEnterReq will be called when the upper MAC 
+ @brief WDI_WowlEnterReq will be called when the upper MAC
         wants to enter the Wowl state to minimize unnecessary
         host wakeup while in power save. Upon the call of this
         API the WLAN DAL will pack and send a HAL Wowl enter
@@ -3982,24 +3992,24 @@
         in state STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param pwdiWowlEnterReqParams: the Wowl enter info as 
+ @param pwdiWowlEnterReqParams: the Wowl enter info as
                       specified by the Device Interface
-  
+
         wdiWowlEnterReqCb: callback for passing back the
         response of the enter Wowl operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_WowlEnterReq
 (
   WDI_WowlEnterReqParamsType*    pwdiWowlEnterParams,
@@ -4011,53 +4021,53 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_WOWL_ENTER_REQ;
-   wdiEventData.pEventData      = pwdiWowlEnterParams; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiWowlEnterParams);; 
-   wdiEventData.pCBfnc          = wdiWowlEnterCb; 
+   wdiEventData.pEventData      = pwdiWowlEnterParams;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiWowlEnterParams);;
+   wdiEventData.pCBfnc          = wdiWowlEnterCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }/*WDI_WowlEnterReq*/
 
 /**
- @brief WDI_WowlExitReq will be called when the upper MAC 
+ @brief WDI_WowlExitReq will be called when the upper MAC
         wants to exit the Wowl state. Upon the call of this API
         the WLAN DAL will pack and send a HAL Wowl exit 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. 
+        be allowed in any other state.
 
  WDI_WowlEnterReq must have been called.
 
- @param pwdiWowlExitReqParams: the Wowl exit info as 
+ @param pwdiWowlExitReqParams: the Wowl exit info as
                       specified by the Device Interface
-  
+
         wdiWowlExitReqCb: callback for passing back the response
         of the exit Wowl operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_WowlEnterReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_WowlExitReq
 (
   WDI_WowlExitReqCb              wdiWowlExitCb,
@@ -4068,30 +4078,30 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_WOWL_EXIT_REQ;
-   wdiEventData.pEventData      = NULL; 
-   wdiEventData.uEventDataSize  = 0; 
-   wdiEventData.pCBfnc          = wdiWowlExitCb; 
+   wdiEventData.pEventData      = NULL;
+   wdiEventData.uEventDataSize  = 0;
+   wdiEventData.pCBfnc          = wdiWowlExitCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }/*WDI_WowlExitReq*/
 
 /**
- @brief WDI_ConfigureAppsCpuWakeupStateReq will be called when 
+ @brief WDI_ConfigureAppsCpuWakeupStateReq will be called when
         the upper MAC wants to dynamically adjusts the listen
         interval based on the WLAN/MSM activity. Upon the call
         of this API the WLAN DAL will pack and send a HAL
@@ -4099,23 +4109,23 @@
         lower RIVA sub-system.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
-  
- @param pwdiConfigureAppsCpuWakeupStateReqParams: the 
+
+ @param pwdiConfigureAppsCpuWakeupStateReqParams: the
                       Apps Cpu Wakeup State as specified by the
                       Device Interface
-  
+
         wdiConfigureAppsCpuWakeupStateCb: callback for passing
         back the response of the configure Apps Cpu Wakeup State
         operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_ConfigureAppsCpuWakeupStateReq
 (
    WDI_ConfigureAppsCpuWakeupStateReqParamsType *pwdiConfigureAppsCpuWakeupStateReqParams,
@@ -4127,52 +4137,52 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_CONFIGURE_APPS_CPU_WAKEUP_STATE_REQ;
-   wdiEventData.pEventData      = pwdiConfigureAppsCpuWakeupStateReqParams; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiConfigureAppsCpuWakeupStateReqParams); 
-   wdiEventData.pCBfnc          = wdiConfigureAppsCpuWakeupStateCb; 
+   wdiEventData.pEventData      = pwdiConfigureAppsCpuWakeupStateReqParams;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiConfigureAppsCpuWakeupStateReqParams);
+   wdiEventData.pCBfnc          = wdiConfigureAppsCpuWakeupStateCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }/*WDI_ConfigureAppsCpuWakeupStateReq*/
 /**
- @brief WDI_FlushAcReq will be called when the upper MAC wants 
+ @brief WDI_FlushAcReq will be called when the upper MAC wants
         to to perform a flush operation on a given AC. Upon the
         call of this API the WLAN DAL will pack and send a HAL
         Flush AC 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. 
+        be allowed in any other state.
 
  WDI_AddBAReq must have been called.
 
- @param pwdiFlushAcReqParams: the Flush AC parameters as 
+ @param pwdiFlushAcReqParams: the Flush AC parameters as
                       specified by the Device Interface
-  
+
         wdiFlushAcRspCb: callback for passing back the response
         of the Flush AC operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_AddBAReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_FlushAcReq
 (
   WDI_FlushAcReqParamsType* pwdiFlushAcReqParams,
@@ -4184,23 +4194,23 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_FLUSH_AC_REQ;
-   wdiEventData.pEventData      = pwdiFlushAcReqParams; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiFlushAcReqParams); 
-   wdiEventData.pCBfnc          = wdiFlushAcRspCb; 
+   wdiEventData.pEventData      = pwdiFlushAcReqParams;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiFlushAcReqParams);
+   wdiEventData.pCBfnc          = wdiFlushAcRspCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4208,7 +4218,7 @@
 }/*WDI_FlushAcReq*/
 
 /**
- @brief WDI_BtAmpEventReq will be called when the upper MAC 
+ @brief WDI_BtAmpEventReq will be called when the upper MAC
         wants to notify the lower mac on a BT AMP event. This is
         to inform BTC-SLM that some BT AMP event occurred. Upon
         the call of this API the WLAN DAL will pack and send a
@@ -4216,22 +4226,22 @@
         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. 
+        be allowed in any other state.
 
-  
- @param wdiBtAmpEventReqParams: the BT AMP event parameters as 
+
+ @param wdiBtAmpEventReqParams: the BT AMP event parameters as
                       specified by the Device Interface
-  
+
         wdiBtAmpEventRspCb: callback for passing back the
         response of the BT AMP event operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
- 
+        callback
+
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_BtAmpEventReq
 (
   WDI_BtAmpEventParamsType* pwdiBtAmpEventReqParams,
@@ -4243,61 +4253,123 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_BTAMP_EVENT_REQ;
-   wdiEventData.pEventData      = pwdiBtAmpEventReqParams; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiBtAmpEventReqParams); 
-   wdiEventData.pCBfnc          = wdiBtAmpEventRspCb; 
+   wdiEventData.pEventData      = pwdiBtAmpEventReqParams;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiBtAmpEventReqParams);
+   wdiEventData.pCBfnc          = wdiBtAmpEventRspCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 
 }/*WDI_BtAmpEventReq*/
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/**
+ @brief WDI_Start Oem Data Req will be called when the upper MAC 
+        wants to notify the lower mac on a oem data Req event.Upon
+        the call of this API the WLAN DAL will pack and send a
+        HAL OEM Data Req event 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 pwdiOemDataReqParams: the Oem Data Req as 
+        specified by the Device Interface
+
+        wdiStartOemDataRspCb: callback for passing back the
+        response of the Oem Data Req received from the
+        device
+
+        pUserData: user data will be passed back with the
+        callback
+
+ @return Result of the function call
+*/
+WDI_Status
+WDI_StartOemDataReq
+(
+  WDI_oemDataReqParamsType*         pwdiOemDataReqParams,
+  WDI_oemDataRspCb                  wdiOemDataRspCb,
+  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_START_OEM_DATA_REQ;
+   wdiEventData.pEventData      = pwdiOemDataReqParams; 
+   wdiEventData.uEventDataSize  = sizeof(*pwdiOemDataReqParams); 
+   wdiEventData.pCBfnc          = wdiOemDataRspCb; 
+   wdiEventData.pUserData       = pUserData;
+
+   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+
+
+}
+
+#endif
+
+
+/*========================================================================
+
                              CONTROL APIs
- 
+
 ==========================================================================*/
 /**
- @brief WDI_SwitchChReq will be called when the upper MAC wants 
+ @brief WDI_SwitchChReq will be called when the upper MAC wants
         the WLAN HW to change the current channel of operation.
         Upon the call of this API the WLAN DAL will pack and
         send a HAL Start 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. 
+        be allowed in any other state.
 
  WDI_Start must have been called.
 
- @param wdiSwitchChReqParams: the switch ch parameters as 
+ @param wdiSwitchChReqParams: the switch ch parameters as
                       specified by the Device Interface
-  
+
         wdiSwitchChRspCb: callback for passing back the response
         of the switch ch operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_Start
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SwitchChReq
 (
   WDI_SwitchChReqParamsType* pwdiSwitchChReqParams,
@@ -4309,23 +4381,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_CH_SWITCH_REQ;
-  wdiEventData.pEventData      = pwdiSwitchChReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiSwitchChReqParams); 
-  wdiEventData.pCBfnc          = wdiSwitchChRspCb; 
+  wdiEventData.pEventData      = pwdiSwitchChReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiSwitchChReqParams);
+  wdiEventData.pCBfnc          = wdiSwitchChRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4334,31 +4406,31 @@
 
 
 /**
- @brief WDI_ConfigSTAReq will be called when the upper MAC 
+ @brief WDI_ConfigSTAReq will be called when the upper MAC
         wishes to add or update a STA in HW. Upon the call of
         this API the WLAN DAL will pack and send a HAL Start
         message 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. 
+        be allowed in any other state.
 
  WDI_Start must have been called.
 
- @param wdiConfigSTAReqParams: the config STA parameters as 
+ @param wdiConfigSTAReqParams: the config STA parameters as
                       specified by the Device Interface
-  
+
         wdiConfigSTARspCb: callback for passing back the
         response of the config STA operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_Start
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_ConfigSTAReq
 (
   WDI_ConfigSTAReqParamsType* pwdiConfigSTAReqParams,
@@ -4370,23 +4442,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_CONFIG_STA_REQ;
-  wdiEventData.pEventData      = pwdiConfigSTAReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiConfigSTAReqParams); 
-  wdiEventData.pCBfnc          = wdiConfigSTARspCb; 
+  wdiEventData.pEventData      = pwdiConfigSTAReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiConfigSTAReqParams);
+  wdiEventData.pCBfnc          = wdiConfigSTARspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4394,31 +4466,31 @@
 }/*WDI_ConfigSTAReq*/
 
 /**
- @brief WDI_SetLinkStateReq will be called when the upper MAC 
+ @brief WDI_SetLinkStateReq will be called when the upper MAC
         wants to change the state of an ongoing link. Upon the
         call of this API the WLAN DAL will pack and send a HAL
         Start message 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. 
+        be allowed in any other state.
 
  WDI_JoinStartReq must have been called.
 
- @param wdiSetLinkStateReqParams: the set link state parameters 
+ @param wdiSetLinkStateReqParams: the set link state parameters
                       as specified by the Device Interface
-  
+
         wdiSetLinkStateRspCb: callback for passing back the
         response of the set link state operation received from
         the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_JoinStartReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetLinkStateReq
 (
   WDI_SetLinkReqParamsType* pwdiSetLinkStateReqParams,
@@ -4430,23 +4502,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_SET_LINK_ST_REQ;
-  wdiEventData.pEventData      = pwdiSetLinkStateReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiSetLinkStateReqParams); 
-  wdiEventData.pCBfnc          = wdiSetLinkStateRspCb; 
+  wdiEventData.pEventData      = pwdiSetLinkStateReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiSetLinkStateReqParams);
+  wdiEventData.pCBfnc          = wdiSetLinkStateRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4455,30 +4527,30 @@
 
 
 /**
- @brief WDI_GetStatsReq will be called when the upper MAC wants 
+ @brief WDI_GetStatsReq will be called when the upper MAC wants
         to get statistics (MIB counters) from the device. Upon
         the call of this API the WLAN DAL will pack and send a
         HAL Start 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. 
+        be allowed in any other state.
 
  WDI_Start must have been called.
 
- @param wdiGetStatsReqParams: the stats parameters to get as 
+ @param wdiGetStatsReqParams: the stats parameters to get as
                       specified by the Device Interface
-  
+
         wdiGetStatsRspCb: callback for passing back the response
         of the get stats operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_Start
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_GetStatsReq
 (
   WDI_GetStatsReqParamsType* pwdiGetStatsReqParams,
@@ -4490,23 +4562,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_GET_STATS_REQ;
-  wdiEventData.pEventData      = pwdiGetStatsReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiGetStatsReqParams); 
-  wdiEventData.pCBfnc          = wdiGetStatsRspCb; 
+  wdiEventData.pEventData      = pwdiGetStatsReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiGetStatsReqParams);
+  wdiEventData.pCBfnc          = wdiGetStatsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4515,31 +4587,31 @@
 
 
 /**
- @brief WDI_UpdateCfgReq will be called when the upper MAC when 
+ @brief WDI_UpdateCfgReq will be called when the upper MAC when
         it wishes to change the configuration of the WLAN
         Device. Upon the call of this API the WLAN DAL will pack
         and send a HAL Update CFG 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. 
+        be allowed in any other state.
 
  WDI_Start must have been called.
 
- @param wdiUpdateCfgReqParams: the update cfg parameters as 
+ @param wdiUpdateCfgReqParams: the update cfg parameters as
                       specified by the Device Interface
-  
+
         wdiUpdateCfgsRspCb: callback for passing back the
         response of the update cfg operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_Start
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_UpdateCfgReq
 (
   WDI_UpdateCfgReqParamsType* pwdiUpdateCfgReqParams,
@@ -4551,23 +4623,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_UPDATE_CFG_REQ;
-  wdiEventData.pEventData      = pwdiUpdateCfgReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiUpdateCfgReqParams); 
-  wdiEventData.pCBfnc          = wdiUpdateCfgsRspCb; 
+  wdiEventData.pEventData      = pwdiUpdateCfgReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiUpdateCfgReqParams);
+  wdiEventData.pCBfnc          = wdiUpdateCfgsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4585,23 +4657,23 @@
         in state STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
  @param wdiAddBAReqParams: the add BA parameters as specified by
                       the Device Interface
-  
+
         wdiAddBARspCb: callback for passing back the response of
         the add BA operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_AddBAReq
 (
   WDI_AddBAReqParamsType* pwdiAddBAReqParams,
@@ -4613,23 +4685,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_ADD_BA_REQ;
-  wdiEventData.pEventData      = pwdiAddBAReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiAddBAReqParams); 
-  wdiEventData.pCBfnc          = wdiAddBARspCb; 
+  wdiEventData.pEventData      = pwdiAddBAReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiAddBAReqParams);
+  wdiEventData.pCBfnc          = wdiAddBARspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4646,23 +4718,23 @@
         in state STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
  @param wdiAddBAReqParams: the add BA parameters as specified by
                       the Device Interface
-  
+
         wdiAddBARspCb: callback for passing back the response of
         the add BA operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_TriggerBAReq
 (
   WDI_TriggerBAReqParamsType* pwdiTriggerBAReqParams,
@@ -4674,23 +4746,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_TRIGGER_BA_REQ;
-  wdiEventData.pEventData      = pwdiTriggerBAReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiTriggerBAReqParams); 
-  wdiEventData.pCBfnc          = wdiTriggerBARspCb; 
+  wdiEventData.pEventData      = pwdiTriggerBAReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiTriggerBAReqParams);
+  wdiEventData.pCBfnc          = wdiTriggerBARspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4698,30 +4770,30 @@
 }/*WDI_AddBAReq*/
 
 /**
- @brief WDI_UpdateBeaconParamsReq will be called when the upper MAC 
+ @brief WDI_UpdateBeaconParamsReq will be called when the upper MAC
         wishes to update any of the Beacon parameters used by HW.
         Upon the call of this API the WLAN DAL will pack and send a HAL Update Beacon Params 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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param wdiUpdateBeaconParams: the Beacon parameters as specified 
+ @param wdiUpdateBeaconParams: the Beacon parameters as specified
                       by the Device Interface
-  
+
         wdiUpdateBeaconParamsRspCb: callback for passing back the
         response of the start operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_UpdateBeaconParamsReq
 (
   WDI_UpdateBeaconParamsType*    pwdiUpdateBeaconParams,
@@ -4733,23 +4805,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_UPD_BCON_PRMS_REQ;
-  wdiEventData.pEventData      = pwdiUpdateBeaconParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiUpdateBeaconParams); 
-  wdiEventData.pCBfnc          = wdiUpdateBeaconParamsRspCb; 
+  wdiEventData.pEventData      = pwdiUpdateBeaconParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiUpdateBeaconParams);
+  wdiEventData.pCBfnc          = wdiUpdateBeaconParamsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4757,30 +4829,30 @@
 }/*WDI_UpdateBeaconParamsReq*/
 
 /**
- @brief WDI_SendBeaconParamsReq will be called when the upper MAC 
+ @brief WDI_SendBeaconParamsReq will be called when the upper MAC
         wishes to update  the Beacon template used by HW.
         Upon the call of this API the WLAN DAL will pack and send a HAL Update Beacon template 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. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
- @param wdiSendBeaconParams: the Beacon parameters as specified 
+ @param wdiSendBeaconParams: the Beacon parameters as specified
                       by the Device Interface
-  
+
         wdiSendBeaconParamsRspCb: callback for passing back the
         response of the start operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SendBeaconParamsReq
 (
   WDI_SendBeaconParamsType*    pwdiSendBeaconParams,
@@ -4792,23 +4864,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_SND_BCON_REQ;
-  wdiEventData.pEventData      = pwdiSendBeaconParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiSendBeaconParams); 
-  wdiEventData.pCBfnc          = wdiSendBeaconParamsRspCb; 
+  wdiEventData.pEventData      = pwdiSendBeaconParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiSendBeaconParams);
+  wdiEventData.pCBfnc          = wdiSendBeaconParamsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4816,7 +4888,7 @@
 }/*WDI_SendBeaconParamsReq*/
 
 /**
- @brief WDI_UpdateProbeRspTemplateReq will be called when the 
+ @brief WDI_UpdateProbeRspTemplateReq will be called when the
         upper MAC wants to update the probe response template to
         be transmitted as Soft AP
          Upon the call of this API the WLAN DAL will
@@ -4824,24 +4896,24 @@
         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. 
+        be allowed in any other state.
 
 
- @param pwdiUpdateProbeRspParams: the Update Beacon parameters as 
+ @param pwdiUpdateProbeRspParams: the Update Beacon parameters as
                       specified by the Device Interface
-  
+
         wdiSendBeaconParamsRspCb: callback for passing back the
         response of the Send Beacon Params operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_AddBAReq
  @return Result of the function call
 */
 
-WDI_Status 
+WDI_Status
 WDI_UpdateProbeRspTemplateReq
 (
   WDI_UpdateProbeRspTemplateParamsType*    pwdiUpdateProbeRspParams,
@@ -4853,23 +4925,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_UPD_PROBE_RSP_TEMPLATE_REQ;
-  wdiEventData.pEventData      = pwdiUpdateProbeRspParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiUpdateProbeRspParams); 
-  wdiEventData.pCBfnc          = wdiUpdateProbeRspParamsRspCb; 
+  wdiEventData.pEventData      = pwdiUpdateProbeRspParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiUpdateProbeRspParams);
+  wdiEventData.pCBfnc          = wdiUpdateProbeRspParamsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4883,17 +4955,17 @@
 
  @param wdiNvDownloadReqParams: the NV Download parameters as specified by
                       the Device Interface
-  
+
         wdiNvDownloadRspCb: callback for passing back the response of
         the NV Download operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_NvDownloadReq
 (
   WDI_NvDownloadReqParamsType* pwdiNvDownloadReqParams,
@@ -4904,23 +4976,23 @@
   WDI_EventInfoType      wdiEventData;
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
-  wdiEventData.wdiRequest      = WDI_NV_DOWNLOAD_REQ;            
-  wdiEventData.pEventData      = (void *)pwdiNvDownloadReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiNvDownloadReqParams); 
-  wdiEventData.pCBfnc          = wdiNvDownloadRspCb; 
+  wdiEventData.wdiRequest      = WDI_NV_DOWNLOAD_REQ;
+  wdiEventData.pEventData      = (void *)pwdiNvDownloadReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiNvDownloadReqParams);
+  wdiEventData.pCBfnc          = wdiNvDownloadRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_START_EVENT, &wdiEventData);
@@ -4929,26 +5001,26 @@
 
 #ifdef WLAN_FEATURE_P2P
 /**
- @brief WDI_SetP2PGONOAReq will be called when the 
+ @brief WDI_SetP2PGONOAReq will be called when the
         upper MAC wants to send Notice of Absence
          Upon the call of this API the WLAN DAL will
         pack and send the probe rsp template  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. 
+        be allowed in any other state.
 
 
- @param pwdiUpdateProbeRspParams: the Update Beacon parameters as 
+ @param pwdiUpdateProbeRspParams: the Update Beacon parameters as
                       specified by the Device Interface
-  
+
         wdiSendBeaconParamsRspCb: callback for passing back the
         response of the Send Beacon Params operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_AddBAReq
  @return Result of the function call
 */
@@ -4964,23 +5036,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_P2P_GO_NOTICE_OF_ABSENCE_REQ;
-  wdiEventData.pEventData      = pwdiP2PGONOAReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiP2PGONOAReqParams); 
-  wdiEventData.pCBfnc          = wdiP2PGONOAReqParamsRspCb; 
+  wdiEventData.pEventData      = pwdiP2PGONOAReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiP2PGONOAReqParams);
+  wdiEventData.pCBfnc          = wdiP2PGONOAReqParamsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -4989,19 +5061,19 @@
 #endif
 
 /**
- @brief WDI_AddSTASelfReq will be called when the 
+ @brief WDI_AddSTASelfReq will be called when the
         UMAC wanted to add STA self while opening any new session
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
 
- @param pwdiAddSTASelfParams: the add sta self parameters as 
+ @param pwdiAddSTASelfParams: the add sta self parameters as
                       specified by the Device Interface
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
- @see 
+        callback
+
+ @see
  @return Result of the function call
 */
 WDI_Status
@@ -5016,23 +5088,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_ADD_STA_SELF_REQ;
-  wdiEventData.pEventData      = pwdiAddSTASelfReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiAddSTASelfReqParams); 
-  wdiEventData.pCBfnc          = wdiAddSTASelfReqParamsRspCb; 
+  wdiEventData.pEventData      = pwdiAddSTASelfReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiAddSTASelfReqParams);
+  wdiEventData.pCBfnc          = wdiAddSTASelfReqParamsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -5040,7 +5112,7 @@
 }/*WDI_AddSTASelfReq*/
 
 
-#ifdef WLAN_FEATURE_VOWIFI_11R 
+#ifdef WLAN_FEATURE_VOWIFI_11R
 /**
  @brief WDI_AggrAddTSReq will be called when the upper MAC to inform
         the device of a successful add TSpec negotiation. HW
@@ -5051,23 +5123,23 @@
         DAL is in state STARTED.
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
  WDI_PostAssocReq must have been called.
 
  @param wdiAddTsReqParams: the add TS parameters as specified by
                       the Device Interface
-  
+
         wdiAddTsRspCb: callback for passing back the response of
         the add TS operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_AggrAddTSReq
 (
   WDI_AggrAddTSReqParamsType* pwdiAggrAddTsReqParams,
@@ -5079,23 +5151,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_AGGR_ADD_TS_REQ;
-  wdiEventData.pEventData      = pwdiAggrAddTsReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiAggrAddTsReqParams); 
-  wdiEventData.pCBfnc          = wdiAggrAddTsRspCb; 
+  wdiEventData.pEventData      = pwdiAggrAddTsReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiAggrAddTsReqParams);
+  wdiEventData.pCBfnc          = wdiAggrAddTsRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -5108,15 +5180,15 @@
 /**
  @brief WDI_FTMCommandReq
         Post FTM Command Event
- 
- @param  ftmCommandReq:   FTM Command Body 
- @param  ftmCommandRspCb: FTM Response from HAL CB 
+
+ @param  ftmCommandReq:   FTM Command Body
+ @param  ftmCommandRspCb: FTM Response from HAL CB
  @param  pUserData:       Client Data
-  
+
  @see
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_FTMCommandReq
 (
   WDI_FTMCommandReqType *ftmCommandReq,
@@ -5128,14 +5200,14 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
@@ -5149,27 +5221,27 @@
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }
-#endif /* ANI_MANF_DIAG */ 
+#endif /* ANI_MANF_DIAG */
 /**
- @brief WDI_HostResumeReq will be called 
+ @brief WDI_HostResumeReq will be called
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
 
  @param pwdiResumeReqParams:  as specified by
                       the Device Interface
-  
+
         wdiResumeReqRspCb: callback for passing back the response of
         the  Resume Req received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
- @see 
+        callback
+
+ @see
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_HostResumeReq
 (
   WDI_ResumeParamsType*            pwdiResumeReqParams,
@@ -5181,23 +5253,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_HOST_RESUME_REQ;
-  wdiEventData.pEventData      = pwdiResumeReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiResumeReqParams); 
-  wdiEventData.pCBfnc          = wdiResumeReqRspCb; 
+  wdiEventData.pEventData      = pwdiResumeReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiResumeReqParams);
+  wdiEventData.pCBfnc          = wdiResumeReqRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -5205,25 +5277,25 @@
 }/*WDI_HostResumeReq*/
 
 /**
- @brief WDI_DelSTASelfReq will be called 
+ @brief WDI_DelSTASelfReq will be called
 
         In state BUSY this request will be queued. Request won't
-        be allowed in any other state. 
+        be allowed in any other state.
 
 
  @param pwdiDelStaSelfReqParams:  as specified by
                       the Device Interface
-  
+
         wdiDelStaSelfRspCb: callback for passing back the response of
         the add TS operation received from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_DelSTASelfReq
 (
   WDI_DelSTASelfReqParamsType*      pwdiDelStaSelfReqParams,
@@ -5235,23 +5307,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_DEL_STA_SELF_REQ;
-  wdiEventData.pEventData      = pwdiDelStaSelfReqParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiDelStaSelfReqParams); 
-  wdiEventData.pCBfnc          = wdiDelStaSelfRspCb; 
+  wdiEventData.pEventData      = pwdiDelStaSelfReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiDelStaSelfReqParams);
+  wdiEventData.pCBfnc          = wdiDelStaSelfRspCb;
   wdiEventData.pUserData       = pUserData;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -5259,28 +5331,28 @@
 }/*WDI_AggrAddTSReq*/
 
 /**
- @brief WDI_SetTxPerTrackingReq will be called when the upper MAC 
-        wants to set the Tx Per Tracking configurations. 
+ @brief WDI_SetTxPerTrackingReq will be called when the upper MAC
+        wants to set the Tx Per Tracking configurations.
         Upon the call of this API the WLAN DAL will pack
         and send a HAL Set Tx Per Tracking 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. 
+        be allowed in any other state.
 
- @param pwdiSetTxPerTrackingReqParams: the Set Tx PER Tracking configurations as 
+ @param pwdiSetTxPerTrackingReqParams: the Set Tx PER Tracking configurations as
                       specified by the Device Interface
-  
+
         pwdiSetTxPerTrackingRspCb: callback for passing back the
         response of the set Tx PER Tracking configurations operation received
         from the device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetTxPerTrackingReq
 (
   WDI_SetTxPerTrackingReqParamsType*      pwdiSetTxPerTrackingReqParams,
@@ -5292,23 +5364,23 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_SET_TX_PER_TRACKING_REQ;
-   wdiEventData.pEventData      = pwdiSetTxPerTrackingReqParams; 
+   wdiEventData.pEventData      = pwdiSetTxPerTrackingReqParams;
    wdiEventData.uEventDataSize  = sizeof(*pwdiSetTxPerTrackingReqParams);
-   wdiEventData.pCBfnc          = pwdiSetTxPerTrackingRspCb; 
+   wdiEventData.pCBfnc          = pwdiSetTxPerTrackingRspCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -5368,14 +5440,14 @@
   
         Suspend Indication from the upper layer will be sent
         down to HAL
-  
+
  @param WDI_SuspendResumeIndParamsType
- 
- @see 
-  
+
+ @see
+
  @return Status of the request
 */
-WDI_Status 
+WDI_Status
 WDI_HostSuspendInd
 (
   WDI_SuspendParamsType*    pwdiSuspendIndParams
@@ -5386,23 +5458,23 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Fill in Event data and post to the Main FSM
   ------------------------------------------------------------------------*/
   wdiEventData.wdiRequest      = WDI_HOST_SUSPEND_IND;
-  wdiEventData.pEventData      = pwdiSuspendIndParams; 
-  wdiEventData.uEventDataSize  = sizeof(*pwdiSuspendIndParams); 
-  wdiEventData.pCBfnc          = NULL; 
+  wdiEventData.pEventData      = pwdiSuspendIndParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiSuspendIndParams);
+  wdiEventData.pCBfnc          = NULL;
   wdiEventData.pUserData       = NULL;
 
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -5412,11 +5484,11 @@
 /**
  @brief WDI_HALDumpCmdReq
         Post HAL DUMP Command Event
- 
- @param  halDumpCmdReqParams:   Hal Dump Command Body 
- @param  halDumpCmdRspCb: HAL DUMP Response from HAL CB 
+
+ @param  halDumpCmdReqParams:   Hal Dump Command Body
+ @param  halDumpCmdRspCb: HAL DUMP Response from HAL CB
  @param  pUserData:       Client Data
-  
+
  @see
  @return Result of the function call
 */
@@ -5431,14 +5503,14 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
@@ -5453,36 +5525,36 @@
   return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }
 
-/*============================================================================ 
- 
+/*============================================================================
+
             DAL Control Path Main FSM Function Implementation
- 
+
  ============================================================================*/
 
 /**
  @brief Main FSM Start function for all states except BUSY
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
          wdiEV:           event posted to the main DAL FSM
          pEventData:      pointer to the event information
-         structure 
-  
+         structure
+
  @see
  @return Result of the function call
 */
 WDI_Status
 WDI_PostMainEvent
 (
-  WDI_ControlBlockType*  pWDICtx, 
-  WDI_MainEventType      wdiEV, 
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_MainEventType      wdiEV,
   WDI_EventInfoType*     pEventData
-  
+
 )
 {
-  WDI_Status         wdiStatus; 
-  WDI_MainFuncType   pfnWDIMainEvHdlr; 
-  WDI_MainStateType  wdiOldState; 
+  WDI_Status         wdiStatus;
+  WDI_MainFuncType   pfnWDIMainEvHdlr;
+  WDI_MainStateType  wdiOldState;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
@@ -5494,23 +5566,23 @@
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
                "Invalid state or event in Post Main Ev function ST: %d EV: %d",
                pWDICtx->uGlobalState, wdiEV);
-     return WDI_STATUS_E_NOT_ALLOWED; 
+     return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*Access to the global state must be locked */
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*Fetch event handler for state*/
-  pfnWDIMainEvHdlr = wdiMainFSM[pWDICtx->uGlobalState].pfnMainTbl[wdiEV]; 
+  pfnWDIMainEvHdlr = wdiMainFSM[pWDICtx->uGlobalState].pfnMainTbl[wdiEV];
 
   wdiOldState = pWDICtx->uGlobalState;
 
   /*
-  --Incase of WDI event is WDI_RESPONSE_EVENT and this is called when a 
-  response comes from CCPU for the request sent by host: 
-  the WDI global state will be in WDI_BUSY_ST already, so do not set it to BUSY again. 
+  --Incase of WDI event is WDI_RESPONSE_EVENT and this is called when a
+  response comes from CCPU for the request sent by host:
+  the WDI global state will be in WDI_BUSY_ST already, so do not set it to BUSY again.
   This state will be set to WDI_STARTED_ST in WDI_MainRsp, if it is a expected response.
-  --Incase of WDI event is WDI_RESPONSE_EVENT and it is an indication from the 
+  --Incase of WDI event is WDI_RESPONSE_EVENT and it is an indication from the
   CCPU:
   don't change the state */
   if ( WDI_RESPONSE_EVENT != wdiEV)
@@ -5522,19 +5594,19 @@
   }
   /* If the state function associated with the EV is NULL it means that this
      event is not allowed in this state*/
-  if ( NULL != pfnWDIMainEvHdlr ) 
+  if ( NULL != pfnWDIMainEvHdlr )
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-              "Posting event %d in state: %d to the Main FSM", 
+              "Posting event %d in state: %d to the Main FSM",
               wdiEV, wdiOldState);
-    wdiStatus = pfnWDIMainEvHdlr( pWDICtx, pEventData); 
+    wdiStatus = pfnWDIMainEvHdlr( pWDICtx, pEventData);
   }
   else
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Unexpected event %d in state: %d", 
+              "Unexpected event %d in state: %d",
               wdiEV, wdiOldState);
-    wdiStatus = WDI_STATUS_E_NOT_ALLOWED; 
+    wdiStatus = WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /* If a request handles itself well it will end up in a success or in a
@@ -5542,11 +5614,11 @@
      Success - means that the request was processed and the proper state
      transition already occurred or will occur when the resp is received
      - NO other state transition or dequeueing is required
- 
+
      Pending - means the request could not be processed at this moment in time
      because the FSM was already busy so no state transition or dequeueing
      is necessary anymore
- 
+
      Success for synchronous case means that the transition may occur and
      processing of pending requests may continue - so it should go through
      and restores the state and continue processing queued requests*/
@@ -5562,45 +5634,45 @@
       WDI_STATE_TRANSITION( pWDICtx, wdiOldState);
     }
     WDI_DequeuePendingReq(pWDICtx);
-        
+
   }
 
   /* we have completed processing the event */
   wpalMutexRelease(&pWDICtx->wptMutex);
 
-  return wdiStatus; 
+  return wdiStatus;
 
 }/*WDI_PostMainEvent*/
 
 
 /*--------------------------------------------------------------------------
-  INIT State Functions 
+  INIT State Functions
 --------------------------------------------------------------------------*/
 /**
  @brief Main FSM Start function for all states except BUSY
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_MainStart
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
 
   /*--------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
   ----------------------------------------------------------------------*/
   if (( NULL ==  pWDICtx ) || ( NULL == pEventData ))
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-               "Invalid parameters on Main Start %x %x", 
+               "Invalid parameters on Main Start %x %x",
                pWDICtx, pEventData);
      return WDI_STATUS_E_FAILURE;
   }
@@ -5608,7 +5680,7 @@
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*--------------------------------------------------------------------
-     Check if the Control Transport has been opened 
+     Check if the Control Transport has been opened
   ----------------------------------------------------------------------*/
   if ( eWLAN_PAL_FALSE == pWDICtx->bCTOpened )
   {
@@ -5616,12 +5688,12 @@
                "Control Transport not yet Open - queueing the request");
 
      WDI_STATE_TRANSITION( pWDICtx, WDI_INIT_ST);
-     WDI_QueuePendingReq( pWDICtx, pEventData); 
+     WDI_QueuePendingReq( pWDICtx, pEventData);
 
      wpalMutexRelease(&pWDICtx->wptMutex);
      return WDI_STATUS_PENDING;
   }
- 
+
   wpalMutexRelease(&pWDICtx->wptMutex);
 
   /*Return Success*/
@@ -5632,24 +5704,24 @@
 /**
  @brief Main FSM Response function for state INIT
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_MainRspInit
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   /*------------------------------------------------------------------------
-    Not expecting a response from the device before it is started 
+    Not expecting a response from the device before it is started
   ------------------------------------------------------------------------*/
-  WDI_ASSERT(0); 
+  WDI_ASSERT(0);
 
   /*Return Success*/
   return WDI_STATUS_E_NOT_ALLOWED;
@@ -5658,28 +5730,28 @@
 /**
  @brief Main FSM Close function for all states except BUSY
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_MainClose
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
 
   /*--------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
   ----------------------------------------------------------------------*/
   if (( NULL ==  pWDICtx ) || ( NULL == pEventData ))
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-               "Invalid parameters on Main Close %x %x", 
+               "Invalid parameters on Main Close %x %x",
                pWDICtx, pEventData);
      return WDI_STATUS_E_FAILURE;
   }
@@ -5689,21 +5761,21 @@
 
 }/*WDI_MainClose*/
 /*--------------------------------------------------------------------------
-  STARTED State Functions 
+  STARTED State Functions
 --------------------------------------------------------------------------*/
 /**
  @brief Main FSM Start function for state STARTED
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_MainStartStarted
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -5712,21 +5784,21 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*--------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
   ----------------------------------------------------------------------*/
   if (( NULL ==  pWDICtx ) || ( NULL == pEventData ))
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-               "Invalid parameters on Main Start %x %x", 
+               "Invalid parameters on Main Start %x %x",
                pWDICtx, pEventData);
      return WDI_STATUS_E_FAILURE;
   }
 
   /*--------------------------------------------------------------------
-     Nothing to do transport was already started 
+     Nothing to do transport was already started
   ----------------------------------------------------------------------*/
   WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-    "Received start while transport was already started - nothing to do"); 
+    "Received start while transport was already started - nothing to do");
 
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
@@ -5736,12 +5808,12 @@
 
   /*Check to see if any request is pending*/
   WDI_DequeuePendingReq(pWDICtx);
-  
+
   wpalMutexRelease(&pWDICtx->wptMutex);
 
   /*Tell UMAC Success*/
-  wdiStartRspCb = (WDI_StartRspCb)pEventData->pCBfnc; 
-  
+  wdiStartRspCb = (WDI_StartRspCb)pEventData->pCBfnc;
+
    /*Notify UMAC*/
   wdiStartRspCb( &pWDICtx->wdiCachedStartRspParams, pWDICtx->pRspCBUserData);
 
@@ -5753,27 +5825,27 @@
 /**
  @brief Main FSM Stop function for state STARTED
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_MainStopStarted
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   /*--------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
   ----------------------------------------------------------------------*/
   if (( NULL ==  pWDICtx ) || ( NULL == pEventData ))
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-               "Invalid parameters on Main Start %x %x", 
+               "Invalid parameters on Main Start %x %x",
                pWDICtx, pEventData);
      return WDI_STATUS_E_FAILURE;
   }
@@ -5791,28 +5863,28 @@
 /**
  @brief Main FSM Request function for state started
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_MainReqStarted
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
 
   /*--------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
   ----------------------------------------------------------------------*/
   if (( NULL ==  pWDICtx ) || ( NULL == pEventData ))
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-               "Invalid parameters on Main Req Started %x %x", 
+               "Invalid parameters on Main Req Started %x %x",
                pWDICtx, pEventData);
      return WDI_STATUS_E_FAILURE;
   }
@@ -5828,30 +5900,30 @@
 /**
  @brief Main FSM Response function for all states except INIT
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
+
+ @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_MainRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
-  WDI_Status  wdiStatus; 
+  WDI_Status  wdiStatus;
   wpt_boolean expectedResponse;
 
   /*--------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
   ----------------------------------------------------------------------*/
   if (( NULL ==  pWDICtx ) || ( NULL == pEventData ))
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-               "Invalid parameters on Main Response %x %x", 
+               "Invalid parameters on Main Response %x %x",
                pWDICtx, pEventData);
      return WDI_STATUS_E_FAILURE;
   }
@@ -5889,48 +5961,48 @@
   2. device failure detected while processing response
   3. stop response received*/
   WDI_STATE_TRANSITION( pWDICtx, pWDICtx->ucExpectedStateTransition);
- 
+
   /*Dequeue request that may have been queued while we were waiting for the
     response */
   if ( expectedResponse )
   {
-     WDI_DequeuePendingReq(pWDICtx); 
+     WDI_DequeuePendingReq(pWDICtx);
   }
 
   wpalMutexRelease(&pWDICtx->wptMutex);
 
   /*Return Success - always */
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 
 }/*WDI_MainRsp*/
 
 /*--------------------------------------------------------------------------
-  STOPPED State Functions 
+  STOPPED State Functions
 --------------------------------------------------------------------------*/
 /**
  @brief Main FSM Stop function for state STOPPED
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_MainStopStopped
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   /*--------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
   ----------------------------------------------------------------------*/
   if (( NULL ==  pWDICtx ) || ( NULL == pEventData ))
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-               "Invalid parameters on Main Stop Stopped %x %x", 
+               "Invalid parameters on Main Stop Stopped %x %x",
                pWDICtx, pEventData);
      return WDI_STATUS_E_FAILURE;
   }
@@ -5949,44 +6021,44 @@
 }/*WDI_MainStopStopped*/
 
 /*--------------------------------------------------------------------------
-  BUSY State Functions 
+  BUSY State Functions
 --------------------------------------------------------------------------*/
 /**
  @brief Main FSM Start function for state BUSY
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_MainStartBusy
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   /*--------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
   ----------------------------------------------------------------------*/
   if (( NULL ==  pWDICtx ) || ( NULL == pEventData ))
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-               "Invalid parameters on Main Start in BUSY %x %x", 
+               "Invalid parameters on Main Start in BUSY %x %x",
                pWDICtx, pEventData);
      return WDI_STATUS_E_FAILURE;
   }
 
   /*--------------------------------------------------------------------
-     Check if the Control Transport has been opened 
+     Check if the Control Transport has been opened
   ----------------------------------------------------------------------*/
   WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
            "WDI Busy state - queue start request");
 
   /*Queue the start request*/
-  WDI_QueuePendingReq( pWDICtx, pEventData); 
+  WDI_QueuePendingReq( pWDICtx, pEventData);
 
   /*Return Success*/
   return WDI_STATUS_PENDING;
@@ -5995,118 +6067,118 @@
 /**
  @brief Main FSM Stop function for state BUSY
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_MainStopBusy
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   /*--------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
   ----------------------------------------------------------------------*/
   if (( NULL ==  pWDICtx ) || ( NULL == pEventData ))
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-               "Invalid parameters on Main Stop in BUSY %x %x", 
+               "Invalid parameters on Main Stop in BUSY %x %x",
                pWDICtx, pEventData);
      return WDI_STATUS_E_FAILURE;
   }
 
   /*--------------------------------------------------------------------
-     Check if the Control Transport has been opened 
+     Check if the Control Transport has been opened
   ----------------------------------------------------------------------*/
   WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
            "WDI Busy state - queue stop request");
 
-  WDI_QueuePendingReq( pWDICtx, pEventData); 
+  WDI_QueuePendingReq( pWDICtx, pEventData);
   return WDI_STATUS_PENDING;
-  
+
 }/*WDI_MainStopBusy*/
 
 /**
  @brief Main FSM Request function for state BUSY
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_MainReqBusy
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   /*--------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
   ----------------------------------------------------------------------*/
   if (( NULL ==  pWDICtx ) || ( NULL == pEventData ))
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-               "Invalid parameters on Main Request in BUSY %x %x", 
+               "Invalid parameters on Main Request in BUSY %x %x",
                pWDICtx, pEventData);
      return WDI_STATUS_E_FAILURE;
   }
 
   /*--------------------------------------------------------------------
-     Check if the Control Transport has been opened 
+     Check if the Control Transport has been opened
   ----------------------------------------------------------------------*/
   WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
            "WDI Busy state - queue request %d because waiting for response %d",
              pEventData->wdiRequest, pWDICtx->wdiExpectedResponse);
 
-  WDI_QueuePendingReq( pWDICtx, pEventData); 
+  WDI_QueuePendingReq( pWDICtx, pEventData);
   return WDI_STATUS_PENDING;
-  
+
 }/*WDI_MainReqBusy*/
 /**
  @brief Main FSM Close function for state BUSY
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_MainCloseBusy
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   /*--------------------------------------------------------------------
-     Sanity Check 
+     Sanity Check
   ----------------------------------------------------------------------*/
   if (( NULL ==  pWDICtx ) || ( NULL == pEventData ))
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-               "Invalid parameters on Main Close in BUSY %x %x", 
+               "Invalid parameters on Main Close in BUSY %x %x",
                pWDICtx, pEventData);
      return WDI_STATUS_E_FAILURE;
   }
 
   /*--------------------------------------------------------------------
-     Check if the Control Transport has been opened 
+     Check if the Control Transport has been opened
   ----------------------------------------------------------------------*/
   WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
            "WDI Busy state - queue close request");
 
-  WDI_QueuePendingReq( pWDICtx, pEventData); 
+  WDI_QueuePendingReq( pWDICtx, pEventData);
   return WDI_STATUS_PENDING;
-  
+
 }/*WDI_MainCloseBusy*/
 
 /**
@@ -6189,44 +6261,44 @@
 }/*WDI_MainShutdownBusy*/
 
 
-/*======================================================================= 
- 
+/*=======================================================================
+
            WLAN DAL Control Path Main Processing Functions
- 
+
 *=======================================================================*/
 
 /*========================================================================
-          Main DAL Control Path Request Processing API 
+          Main DAL Control Path Request Processing API
 ========================================================================*/
 /**
- @brief Process Start Request function (called when Main FSM 
+ @brief Process Start Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessStartReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_StartReqParamsType* pwdiStartParams    = NULL;
   WDI_StartRspCb          wdiStartRspCb      = NULL;
-  wpt_uint8*              pSendBuffer        = NULL; 
+  wpt_uint8*              pSendBuffer        = NULL;
   wpt_uint16              usDataOffset       = 0;
   wpt_uint16              usSendSize         = 0;
 
-  tHalMacStartReqMsg      halStartReq; 
-  wpt_uint16              usLen              = 0; 
+  tHalMacStartReqMsg      halStartReq;
+  wpt_uint16              usLen              = 0;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == (pwdiStartParams = (WDI_StartReqParamsType*)pEventData->pEventData)) ||
@@ -6235,16 +6307,16 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  usLen = sizeof(halStartReq.startReqParams) + 
+  usLen = sizeof(halStartReq.startReqParams) +
           pwdiStartParams->usConfigBufferLen;
 
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_START_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_START_REQ,
                         usLen,
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + usLen )))
@@ -6253,72 +6325,72 @@
               "Unable to get send buffer in start req %x %x %x",
                 pEventData, pwdiStartParams, wdiStartRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-----------------------------------------------------------------------
     Fill in the message
   -----------------------------------------------------------------------*/
-  halStartReq.startReqParams.driverType = 
-     WDI_2_HAL_DRV_TYPE(pwdiStartParams->wdiDriverType); 
+  halStartReq.startReqParams.driverType =
+     WDI_2_HAL_DRV_TYPE(pwdiStartParams->wdiDriverType);
 
-  halStartReq.startReqParams.uConfigBufferLen = 
-                  pwdiStartParams->usConfigBufferLen; 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halStartReq.startReqParams, 
-                  sizeof(halStartReq.startReqParams)); 
+  halStartReq.startReqParams.uConfigBufferLen =
+                  pwdiStartParams->usConfigBufferLen;
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halStartReq.startReqParams,
+                  sizeof(halStartReq.startReqParams));
 
-  usDataOffset  += sizeof(halStartReq.startReqParams); 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  pwdiStartParams->pConfigBuffer, 
-                  pwdiStartParams->usConfigBufferLen); 
+  usDataOffset  += sizeof(halStartReq.startReqParams);
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  pwdiStartParams->pConfigBuffer,
+                  pwdiStartParams->usConfigBufferLen);
 
   pWDICtx->wdiReqStatusCB     = pwdiStartParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiStartParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiStartParams->pUserData;
 
   /*Save Low Level Ind CB and associated user data - it will be used further
     on when an indication is coming from the lower MAC*/
   pWDICtx->wdiLowLevelIndCB   = pwdiStartParams->wdiLowLevelIndCB;
-  pWDICtx->pIndUserData       = pwdiStartParams->pIndUserData; 
+  pWDICtx->pIndUserData       = pwdiStartParams->pIndUserData;
 
-  pWDICtx->bFrameTransEnabled = pwdiStartParams->bFrameTransEnabled; 
+  pWDICtx->bFrameTransEnabled = pwdiStartParams->bFrameTransEnabled;
   /*-------------------------------------------------------------------------
-    Send Start Request to HAL 
+    Send Start Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiStartRspCb, pEventData->pUserData, WDI_START_RESP);
 
-  
+
 }/*WDI_ProcessStartReq*/
 
 /**
- @brief Process Stop Request function (called when Main FSM 
+ @brief Process Stop Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessStopReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_StopReqParamsType* pwdiStopParams      = NULL;
   WDI_StopRspCb          wdiStopRspCb        = NULL;
-  wpt_uint8*             pSendBuffer         = NULL; 
+  wpt_uint8*             pSendBuffer         = NULL;
   wpt_uint16             usDataOffset        = 0;
   wpt_uint16             usSendSize          = 0;
   wpt_status             status;
-  tHalMacStopReqMsg      halStopReq; 
+  tHalMacStopReqMsg      halStopReq;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
  /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == (pwdiStopParams = (WDI_StopReqParamsType*)pEventData->pEventData)) ||
@@ -6327,13 +6399,13 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_STOP_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_STOP_REQ,
                         sizeof(halStopReq.stopReqParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halStopReq.stopReqParams) )))
@@ -6342,7 +6414,7 @@
               "Unable to get send buffer in stop req %x %x %x",
                 pEventData, pwdiStopParams, wdiStopRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-----------------------------------------------------------------------
@@ -6351,12 +6423,12 @@
   halStopReq.stopReqParams.reason = WDI_2_HAL_STOP_REASON(
                                           pwdiStopParams->wdiStopReason);
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halStopReq.stopReqParams, 
-                  sizeof(halStopReq.stopReqParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halStopReq.stopReqParams,
+                  sizeof(halStopReq.stopReqParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiStopParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiStopParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiStopParams->pUserData;
 
   /*! TO DO: stop the data services */
   if ( eDRIVER_TYPE_MFG != pWDICtx->driverMode )
@@ -6372,13 +6444,13 @@
         WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "WDI Init failed to reset power state event");
 
-        WDI_ASSERT(0); 
+        WDI_ASSERT(0);
         return VOS_STATUS_E_FAILURE;
      }
      /* Stop Transport Driver, DXE */
      WDTS_SetPowerState(pWDICtx, WDTS_POWER_STATE_DOWN, WDI_SetPowerStateCb);
      /*
-      * Wait for the event to be set once the ACK comes back from DXE 
+      * Wait for the event to be set once the ACK comes back from DXE
       */
      status = wpalEventWait(&pWDICtx->setPowerStateEvent, 
                             WDI_SET_POWER_STATE_TIMEOUT);
@@ -6387,47 +6459,47 @@
         WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "WDI Init failed to wait on an event");
 
-        WDI_ASSERT(0); 
+        WDI_ASSERT(0);
         return VOS_STATUS_E_FAILURE;
       }
   }
 
   /*-------------------------------------------------------------------------
-    Send Stop Request to HAL 
+    Send Stop Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiStopRspCb, pEventData->pUserData, WDI_STOP_RESP);
 
 }/*WDI_ProcessStopReq*/
 
 /**
- @brief Process Close Request function (called when Main FSM 
+ @brief Process Close Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessCloseReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
-   wpt_status              wptStatus; 
+   wpt_status              wptStatus;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*Lock control block for cleanup*/
    wpalMutexAcquire(&pWDICtx->wptMutex);
-       
+
    /*Clear all pending request*/
    WDI_ClearPendingRequests(pWDICtx);
 
    /* Close Control transport*/
-   WCTS_CloseTransport(pWDICtx->wctsHandle); 
+   WCTS_CloseTransport(pWDICtx->wctsHandle);
 
    /* Close Data transport*/
    /* FTM mode does not open Data Path */
@@ -6454,50 +6526,50 @@
    wpalMutexRelease(&pWDICtx->wptMutex);
 
    /*Make sure the expected state is properly defaulted to Init*/
-   pWDICtx->ucExpectedStateTransition = WDI_INIT_ST; 
+   pWDICtx->ucExpectedStateTransition = WDI_INIT_ST;
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessCloseReq*/
 
 
 /*===========================================================================
-                  SCANING REQUEST PROCESSING API 
+                  SCANING REQUEST PROCESSING API
 ===========================================================================*/
 
 /**
  @brief Process Init Scan Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessInitScanReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_InitScanReqParamsType*  pwdiInitScanParams    = NULL;
   WDI_InitScanRspCb           wdiInitScanRspCb      = NULL;
-  wpt_uint8*                  pSendBuffer           = NULL; 
+  wpt_uint8*                  pSendBuffer           = NULL;
   wpt_uint16                  usDataOffset          = 0;
   wpt_uint16                  usSendSize            = 0;
   wpt_uint8                   i = 0;
 
   tHalInitScanReqMsg          halInitScanReqMsg;
 
-  /*This is temporary fix. 
+  /*This is temporary fix.
    * It shold be removed once host and riva changes are in sync*/
   tHalInitScanConReqMsg       halInitScanConReqMsg;
 
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
     -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == (pwdiInitScanParams = (WDI_InitScanReqParamsType*)pEventData->pEventData)) ||
@@ -6506,7 +6578,7 @@
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
         "%s: Invalid parameters", __FUNCTION__);
     WDI_ASSERT(0);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
 #if 0
@@ -6514,7 +6586,7 @@
   /*-----------------------------------------------------------------------
     Check to see if SCAN is already in progress - if so reject the req
     We only allow one scan at a time
-    ! TO DO: - revisit this constraint 
+    ! TO DO: - revisit this constraint
     -----------------------------------------------------------------------*/
   if ( pWDICtx->bScanInProgress )
   {
@@ -6523,23 +6595,23 @@
         " until the first scan completes");
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
-  pWDICtx->bScanInProgress = eWLAN_PAL_TRUE; 
-  pWDICtx->uScanState      = WDI_SCAN_INITIALIZED_ST; 
+  pWDICtx->bScanInProgress = eWLAN_PAL_TRUE;
+  pWDICtx->uScanState      = WDI_SCAN_INITIALIZED_ST;
 
   wpalMutexRelease(&pWDICtx->wptMutex);
 #endif
 
   if (pwdiInitScanParams->wdiReqInfo.bUseNOA)
   {
-    /*This is temporary fix. 
+    /*This is temporary fix.
      * It shold be removed once host and riva changes are in sync*/
     /*-----------------------------------------------------------------------
       Get message buffer
       -----------------------------------------------------------------------*/
-    if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_INIT_SCAN_CON_REQ, 
+    if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_INIT_SCAN_CON_REQ,
             sizeof(halInitScanConReqMsg.initScanParams),
             &pSendBuffer, &usDataOffset, &usSendSize))||
         ( usSendSize < (usDataOffset + sizeof(halInitScanConReqMsg.initScanParams) )))
@@ -6548,24 +6620,24 @@
           "Unable to get send buffer in init scan req %x %x %x",
           pEventData, pwdiInitScanParams, wdiInitScanRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
     }
 
 
     /*-----------------------------------------------------------------------
       Fill in the message
       -----------------------------------------------------------------------*/
-    halInitScanConReqMsg.initScanParams.scanMode = 
+    halInitScanConReqMsg.initScanParams.scanMode =
       WDI_2_HAL_SCAN_MODE(pwdiInitScanParams->wdiReqInfo.wdiScanMode);
 
     wpalMemoryCopy(halInitScanConReqMsg.initScanParams.bssid,
         pwdiInitScanParams->wdiReqInfo.macBSSID, WDI_MAC_ADDR_LEN);
 
-    halInitScanConReqMsg.initScanParams.notifyBss = 
+    halInitScanConReqMsg.initScanParams.notifyBss =
       pwdiInitScanParams->wdiReqInfo.bNotifyBSS;
-    halInitScanConReqMsg.initScanParams.frameType = 
+    halInitScanConReqMsg.initScanParams.frameType =
       pwdiInitScanParams->wdiReqInfo.ucFrameType;
-    halInitScanConReqMsg.initScanParams.frameLength = 
+    halInitScanConReqMsg.initScanParams.frameLength =
       pwdiInitScanParams->wdiReqInfo.ucFrameLength;
 
     WDI_CopyWDIMgmFrameHdrToHALMgmFrameHdr( &halInitScanConReqMsg.initScanParams.macMgmtHdr,
@@ -6576,25 +6648,25 @@
     halInitScanConReqMsg.initScanParams.scanDuration = pwdiInitScanParams->wdiReqInfo.scanDuration;
 #endif
 
-    halInitScanConReqMsg.initScanParams.scanEntry.activeBSScnt = 
+    halInitScanConReqMsg.initScanParams.scanEntry.activeBSScnt =
       pwdiInitScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt;
 
     for (i=0; i < pwdiInitScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt; i++)
     {
-      halInitScanConReqMsg.initScanParams.scanEntry.bssIdx[i] = 
+      halInitScanConReqMsg.initScanParams.scanEntry.bssIdx[i] =
         pwdiInitScanParams->wdiReqInfo.wdiScanEntry.bssIdx[i];
     }
 
-    wpalMemoryCopy( pSendBuffer+usDataOffset, 
-        &halInitScanConReqMsg.initScanParams, 
-        sizeof(halInitScanConReqMsg.initScanParams)); 
+    wpalMemoryCopy( pSendBuffer+usDataOffset,
+        &halInitScanConReqMsg.initScanParams,
+        sizeof(halInitScanConReqMsg.initScanParams));
   }
   else
   {
     /*-----------------------------------------------------------------------
       Get message buffer
       -----------------------------------------------------------------------*/
-    if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_INIT_SCAN_REQ, 
+    if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_INIT_SCAN_REQ,
             sizeof(halInitScanReqMsg.initScanParams),
             &pSendBuffer, &usDataOffset, &usSendSize))||
         ( usSendSize < (usDataOffset + sizeof(halInitScanReqMsg.initScanParams) )))
@@ -6603,82 +6675,82 @@
           "Unable to get send buffer in init scan req %x %x %x",
           pEventData, pwdiInitScanParams, wdiInitScanRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
     }
 
 
     /*-----------------------------------------------------------------------
       Fill in the message
       -----------------------------------------------------------------------*/
-    halInitScanReqMsg.initScanParams.scanMode = 
+    halInitScanReqMsg.initScanParams.scanMode =
       WDI_2_HAL_SCAN_MODE(pwdiInitScanParams->wdiReqInfo.wdiScanMode);
 
     wpalMemoryCopy(halInitScanReqMsg.initScanParams.bssid,
         pwdiInitScanParams->wdiReqInfo.macBSSID, WDI_MAC_ADDR_LEN);
 
-    halInitScanReqMsg.initScanParams.notifyBss = 
+    halInitScanReqMsg.initScanParams.notifyBss =
       pwdiInitScanParams->wdiReqInfo.bNotifyBSS;
-    halInitScanReqMsg.initScanParams.frameType = 
+    halInitScanReqMsg.initScanParams.frameType =
       pwdiInitScanParams->wdiReqInfo.ucFrameType;
-    halInitScanReqMsg.initScanParams.frameLength = 
+    halInitScanReqMsg.initScanParams.frameLength =
       pwdiInitScanParams->wdiReqInfo.ucFrameLength;
 
     WDI_CopyWDIMgmFrameHdrToHALMgmFrameHdr( &halInitScanReqMsg.initScanParams.macMgmtHdr,
         &pwdiInitScanParams->wdiReqInfo.wdiMACMgmtHdr);
 
-    halInitScanReqMsg.initScanParams.scanEntry.activeBSScnt = 
+    halInitScanReqMsg.initScanParams.scanEntry.activeBSScnt =
       pwdiInitScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt;
 
     for (i=0; i < pwdiInitScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt; i++)
     {
-      halInitScanReqMsg.initScanParams.scanEntry.bssIdx[i] = 
+      halInitScanReqMsg.initScanParams.scanEntry.bssIdx[i] =
         pwdiInitScanParams->wdiReqInfo.wdiScanEntry.bssIdx[i];
     }
 
-    wpalMemoryCopy( pSendBuffer+usDataOffset, 
-        &halInitScanReqMsg.initScanParams, 
-        sizeof(halInitScanReqMsg.initScanParams)); 
+    wpalMemoryCopy( pSendBuffer+usDataOffset,
+        &halInitScanReqMsg.initScanParams,
+        sizeof(halInitScanReqMsg.initScanParams));
   }
 
   pWDICtx->wdiReqStatusCB     = pwdiInitScanParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiInitScanParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiInitScanParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Init Scan Request to HAL 
+    Send Init Scan Request to HAL
     -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
       wdiInitScanRspCb, pEventData->pUserData, WDI_INIT_SCAN_RESP);
 
 }/*WDI_ProcessInitScanReq*/
 
 /**
- @brief Process Start Scan Request function (called when Main 
+ @brief Process Start Scan Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessStartScanReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_StartScanReqParamsType*  pwdiStartScanParams    = NULL;
   WDI_StartScanRspCb           wdiStartScanRspCb      = NULL;
-  wpt_uint8*                   pSendBuffer            = NULL; 
+  wpt_uint8*                   pSendBuffer            = NULL;
   wpt_uint16                   usDataOffset           = 0;
   wpt_uint16                   usSendSize             = 0;
 
-  tHalStartScanReqMsg          halStartScanReqMsg; 
+  tHalStartScanReqMsg          halStartScanReqMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == (pwdiStartScanParams = (WDI_StartScanReqParamsType*)pEventData->pEventData)) ||
@@ -6687,7 +6759,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
 #if 0
@@ -6695,21 +6767,21 @@
   /*-----------------------------------------------------------------------
     Check to see if SCAN is already in progress - start scan is only
     allowed when a scan is ongoing and the state of the scan procedure
-    is either init or end 
+    is either init or end
   -----------------------------------------------------------------------*/
-  if (( !pWDICtx->bScanInProgress ) || 
+  if (( !pWDICtx->bScanInProgress ) ||
       (( WDI_SCAN_INITIALIZED_ST != pWDICtx->uScanState ) &&
        ( WDI_SCAN_ENDED_ST != pWDICtx->uScanState )))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_ERROR,
               "Scan start not allowed in this state %d %d",
                pWDICtx->bScanInProgress, pWDICtx->uScanState);
-    
+
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
-  pWDICtx->uScanState      = WDI_SCAN_STARTED_ST; 
+  pWDICtx->uScanState      = WDI_SCAN_STARTED_ST;
 
   wpalMutexRelease(&pWDICtx->wptMutex);
 #endif
@@ -6717,7 +6789,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_START_SCAN_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_START_SCAN_REQ,
                         sizeof(halStartScanReqMsg.startScanParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halStartScanReqMsg.startScanParams) )))
@@ -6726,54 +6798,54 @@
               "Unable to get send buffer in start scan req %x %x %x",
                 pEventData, pwdiStartScanParams, wdiStartScanRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  halStartScanReqMsg.startScanParams.scanChannel = 
+  halStartScanReqMsg.startScanParams.scanChannel =
                               pwdiStartScanParams->ucChannel;
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halStartScanReqMsg.startScanParams, 
-                  sizeof(halStartScanReqMsg.startScanParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halStartScanReqMsg.startScanParams,
+                  sizeof(halStartScanReqMsg.startScanParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiStartScanParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiStartScanParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiStartScanParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Start Scan Request to HAL 
+    Send Start Scan Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiStartScanRspCb, pEventData->pUserData, WDI_START_SCAN_RESP);
 }/*WDI_ProcessStartScanReq*/
 
 
 /**
- @brief Process End Scan Request function (called when Main FSM 
+ @brief Process End Scan Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessEndScanReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_EndScanReqParamsType*  pwdiEndScanParams    = NULL;
   WDI_EndScanRspCb           wdiEndScanRspCb      = NULL;
-  wpt_uint8*                 pSendBuffer          = NULL; 
+  wpt_uint8*                 pSendBuffer          = NULL;
   wpt_uint16                 usDataOffset         = 0;
   wpt_uint16                 usSendSize           = 0;
 
-  tHalEndScanReqMsg          halEndScanReqMsg;           
+  tHalEndScanReqMsg          halEndScanReqMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == (pwdiEndScanParams = (WDI_EndScanReqParamsType*)pEventData->pEventData)) ||
@@ -6782,11 +6854,11 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  /* commenting this check as UMAC is sending END_SCAN_REQ after FINISH_SCAN 
-  * sometimes  because of this check the scan request is not being 
+  /* commenting this check as UMAC is sending END_SCAN_REQ after FINISH_SCAN
+  * sometimes  because of this check the scan request is not being
   * forwarded to HAL and result in hang*/
 #if 0
   wpalMutexAcquire(&pWDICtx->wptMutex);
@@ -6795,18 +6867,18 @@
     allowed when a scan is ongoing and the state of the scan procedure
     is started
   -----------------------------------------------------------------------*/
-  if (( !pWDICtx->bScanInProgress ) || 
+  if (( !pWDICtx->bScanInProgress ) ||
       ( WDI_SCAN_STARTED_ST != pWDICtx->uScanState ))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
               "End start not allowed in this state %d %d",
                pWDICtx->bScanInProgress, pWDICtx->uScanState);
-    
+
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
-  pWDICtx->uScanState      = WDI_SCAN_ENDED_ST; 
+  pWDICtx->uScanState      = WDI_SCAN_ENDED_ST;
 
   wpalMutexRelease(&pWDICtx->wptMutex);
 #endif
@@ -6814,7 +6886,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_END_SCAN_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_END_SCAN_REQ,
                         sizeof(halEndScanReqMsg.endScanParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halEndScanReqMsg.endScanParams) )))
@@ -6823,55 +6895,55 @@
               "Unable to get send buffer in start scan req %x %x %x",
                 pEventData, pwdiEndScanParams, wdiEndScanRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   halEndScanReqMsg.endScanParams.scanChannel = pwdiEndScanParams->ucChannel;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halEndScanReqMsg.endScanParams, 
-                  sizeof(halEndScanReqMsg.endScanParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halEndScanReqMsg.endScanParams,
+                  sizeof(halEndScanReqMsg.endScanParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiEndScanParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiEndScanParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiEndScanParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send End Scan Request to HAL 
+    Send End Scan Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiEndScanRspCb, pEventData->pUserData, WDI_END_SCAN_RESP);
 }/*WDI_ProcessEndScanReq*/
 
 
 /**
- @brief Process Finish Scan Request function (called when Main 
+ @brief Process Finish Scan Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessFinishScanReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_FinishScanReqParamsType*  pwdiFinishScanParams;
   WDI_FinishScanRspCb           wdiFinishScanRspCb;
-  wpt_uint8*                    pSendBuffer          = NULL; 
+  wpt_uint8*                    pSendBuffer          = NULL;
   wpt_uint16                    usDataOffset         = 0;
   wpt_uint16                    usSendSize           = 0;
   wpt_uint8                     i                    = 0;
 
-  tHalFinishScanReqMsg          halFinishScanReqMsg; 
+  tHalFinishScanReqMsg          halFinishScanReqMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData) ||
@@ -6880,13 +6952,13 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiFinishScanParams = (WDI_FinishScanReqParamsType*)pEventData->pEventData;
   wdiFinishScanRspCb   = (WDI_FinishScanRspCb)pEventData->pCBfnc;
-  /* commenting this check as UMAC is sending END_SCAN_REQ after FINISH_SCAN 
-  * sometimes  because of this check the scan request is not being 
+  /* commenting this check as UMAC is sending END_SCAN_REQ after FINISH_SCAN
+  * sometimes  because of this check the scan request is not being
   * forwarded to HAL and result in hang*/
 #if 0
   wpalMutexAcquire(&pWDICtx->wptMutex);
@@ -6902,15 +6974,15 @@
                pWDICtx->bScanInProgress );
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*-----------------------------------------------------------------------
     It is safe to reset the scan flags here because until the response comes
-    back all subsequent requests will be blocked at BUSY state 
+    back all subsequent requests will be blocked at BUSY state
   -----------------------------------------------------------------------*/
-  pWDICtx->uScanState      = WDI_SCAN_FINISHED_ST; 
-  pWDICtx->bScanInProgress = eWLAN_PAL_FALSE; 
+  pWDICtx->uScanState      = WDI_SCAN_FINISHED_ST;
+  pWDICtx->bScanInProgress = eWLAN_PAL_FALSE;
   wpalMutexRelease(&pWDICtx->wptMutex);
 #endif
 
@@ -6923,7 +6995,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_FINISH_SCAN_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_FINISH_SCAN_REQ,
                         sizeof(halFinishScanReqMsg.finishScanParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halFinishScanReqMsg.finishScanParams) )))
@@ -6932,70 +7004,70 @@
               "Unable to get send buffer in start scan req %x %x %x",
                 pEventData, pwdiFinishScanParams, wdiFinishScanRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  halFinishScanReqMsg.finishScanParams.scanMode = 
+  halFinishScanReqMsg.finishScanParams.scanMode =
     WDI_2_HAL_SCAN_MODE(pwdiFinishScanParams->wdiReqInfo.wdiScanMode);
 
-  halFinishScanReqMsg.finishScanParams.currentOperChannel = 
+  halFinishScanReqMsg.finishScanParams.currentOperChannel =
     pwdiFinishScanParams->wdiReqInfo.ucCurrentOperatingChannel;
 
-  halFinishScanReqMsg.finishScanParams.cbState = 
+  halFinishScanReqMsg.finishScanParams.cbState =
     WDI_2_HAL_CB_STATE(pwdiFinishScanParams->wdiReqInfo.wdiCBState);
 
   wpalMemoryCopy(halFinishScanReqMsg.finishScanParams.bssid,
                  pwdiFinishScanParams->wdiReqInfo.macBSSID, WDI_MAC_ADDR_LEN);
 
-  halFinishScanReqMsg.finishScanParams.notifyBss   = 
+  halFinishScanReqMsg.finishScanParams.notifyBss   =
                               pwdiFinishScanParams->wdiReqInfo.bNotifyBSS ;
-  halFinishScanReqMsg.finishScanParams.frameType   = 
+  halFinishScanReqMsg.finishScanParams.frameType   =
                               pwdiFinishScanParams->wdiReqInfo.ucFrameType ;
-  halFinishScanReqMsg.finishScanParams.frameLength = 
+  halFinishScanReqMsg.finishScanParams.frameLength =
                               pwdiFinishScanParams->wdiReqInfo.ucFrameLength ;
 
-  halFinishScanReqMsg.finishScanParams.scanEntry.activeBSScnt = 
+  halFinishScanReqMsg.finishScanParams.scanEntry.activeBSScnt =
                    pwdiFinishScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt ;
 
   for (i = 0; i < pwdiFinishScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt; i++)
   {
-    halFinishScanReqMsg.finishScanParams.scanEntry.bssIdx[i] = 
+    halFinishScanReqMsg.finishScanParams.scanEntry.bssIdx[i] =
                pwdiFinishScanParams->wdiReqInfo.wdiScanEntry.bssIdx[i] ;
   }
 
   WDI_CopyWDIMgmFrameHdrToHALMgmFrameHdr( &halFinishScanReqMsg.finishScanParams.macMgmtHdr,
                               &pwdiFinishScanParams->wdiReqInfo.wdiMACMgmtHdr);
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halFinishScanReqMsg.finishScanParams, 
-                  sizeof(halFinishScanReqMsg.finishScanParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halFinishScanReqMsg.finishScanParams,
+                  sizeof(halFinishScanReqMsg.finishScanParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiFinishScanParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiFinishScanParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiFinishScanParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Finish Scan Request to HAL 
+    Send Finish Scan Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiFinishScanRspCb, pEventData->pUserData, WDI_FINISH_SCAN_RESP);
 }/*WDI_ProcessFinishScanReq*/
 
 
 /*==========================================================================
-                    ASSOCIATION REQUEST API 
+                    ASSOCIATION REQUEST API
 ==========================================================================*/
 /**
- @brief Process BSS Join for a given Session 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+ @brief Process BSS Join for a given Session
+
+ @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_ProcessBSSSessionJoinReq
-( 
+(
   WDI_ControlBlockType*   pWDICtx,
   WDI_JoinReqParamsType*  pwdiJoinParams,
   WDI_JoinRspCb           wdiJoinRspCb,
@@ -7003,35 +7075,35 @@
 )
 {
   WDI_BSSSessionType*     pBSSSes             = NULL;
-  wpt_uint8*              pSendBuffer         = NULL; 
+  wpt_uint8*              pSendBuffer         = NULL;
   wpt_uint16              usDataOffset        = 0;
   wpt_uint16              usSendSize          = 0;
-  wpt_uint8               ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8               ucCurrentBSSSesIdx  = 0;
 
-  tHalJoinReqMsg          halJoinReqMsg; 
+  tHalJoinReqMsg          halJoinReqMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*------------------------------------------------------------------------
     Check to see if we have any session with this BSSID already stored, we
     should not
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
-                                   pwdiJoinParams->wdiReqInfo.macBSSID, 
-                                  &pBSSSes);  
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx,
+                                   pwdiJoinParams->wdiReqInfo.macBSSID,
+                                  &pBSSSes);
 
   if ( NULL != pBSSSes )
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
               "Association for this BSSID is already in place");
 
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   wpalMutexAcquire(&pWDICtx->wptMutex);
   /*------------------------------------------------------------------------
-    Fetch an empty session block 
+    Fetch an empty session block
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindEmptySession( pWDICtx, &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindEmptySession( pWDICtx, &pBSSSes);
   if ( NULL == pBSSSes )
   {
 
@@ -7039,24 +7111,24 @@
               "DAL has no free sessions - cannot run another join");
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_RES_FAILURE; 
+    return WDI_STATUS_RES_FAILURE;
   }
 
   /*Save BSS Session Info*/
-  pBSSSes->bInUse = eWLAN_PAL_TRUE; 
-  wpalMemoryCopy( pBSSSes->macBSSID, pwdiJoinParams->wdiReqInfo.macBSSID, 
+  pBSSSes->bInUse = eWLAN_PAL_TRUE;
+  wpalMemoryCopy( pBSSSes->macBSSID, pwdiJoinParams->wdiReqInfo.macBSSID,
                   WDI_MAC_ADDR_LEN);
 
   /*Transition to state Joining*/
-  pBSSSes->wdiAssocState      = WDI_ASSOC_JOINING_ST; 
+  pBSSSes->wdiAssocState      = WDI_ASSOC_JOINING_ST;
   pWDICtx->ucCurrentBSSSesIdx = ucCurrentBSSSesIdx;
-  
+
   wpalMutexRelease(&pWDICtx->wptMutex);
 
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_JOIN_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_JOIN_REQ,
                         sizeof(halJoinReqMsg.joinReqParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halJoinReqMsg.joinReqParams) )))
@@ -7065,58 +7137,58 @@
               "Unable to get send buffer in join req %x %x %x",
                 pUserData, pwdiJoinParams, wdiJoinRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wpalMemoryCopy(halJoinReqMsg.joinReqParams.bssId,
-                 pwdiJoinParams->wdiReqInfo.macBSSID, WDI_MAC_ADDR_LEN); 
+                 pwdiJoinParams->wdiReqInfo.macBSSID, WDI_MAC_ADDR_LEN);
 
   wpalMemoryCopy(halJoinReqMsg.joinReqParams.selfStaMacAddr,
-                 pwdiJoinParams->wdiReqInfo.macSTASelf, 
-                 WDI_MAC_ADDR_LEN); 
+                 pwdiJoinParams->wdiReqInfo.macSTASelf,
+                 WDI_MAC_ADDR_LEN);
 
-  halJoinReqMsg.joinReqParams.ucChannel = 
+  halJoinReqMsg.joinReqParams.ucChannel =
     pwdiJoinParams->wdiReqInfo.wdiChannelInfo.ucChannel;
 
   halJoinReqMsg.joinReqParams.linkState = pwdiJoinParams->wdiReqInfo.linkState;
 
 #ifndef WLAN_FEATURE_VOWIFI
-  halJoinReqMsg.joinReqParams.ucLocalPowerConstraint = 
+  halJoinReqMsg.joinReqParams.ucLocalPowerConstraint =
     pwdiJoinParams->wdiReqInfo.wdiChannelInfo.ucLocalPowerConstraint;
 #endif
 
-  halJoinReqMsg.joinReqParams.secondaryChannelOffset =     
+  halJoinReqMsg.joinReqParams.secondaryChannelOffset =
      WDI_2_HAL_SEC_CH_OFFSET(pwdiJoinParams->wdiReqInfo.wdiChannelInfo.
                              wdiSecondaryChannelOffset);
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halJoinReqMsg.joinReqParams, 
-                  sizeof(halJoinReqMsg.joinReqParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halJoinReqMsg.joinReqParams,
+                  sizeof(halJoinReqMsg.joinReqParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiJoinParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiJoinParams->pUserData;  
+  pWDICtx->pReqStatusUserData = pwdiJoinParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Join Request to HAL 
+    Send Join Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiJoinRspCb, pUserData, WDI_JOIN_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiJoinRspCb, pUserData, WDI_JOIN_RESP);
 
 }/*WDI_ProcessBSSSessionJoinReq*/
 
 /**
- @brief Process Join Request function (called when Main FSM 
+ @brief Process Join Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessJoinReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -7127,7 +7199,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == (pwdiJoinParams = (WDI_JoinReqParamsType*)pEventData->pEventData)) ||
@@ -7136,12 +7208,12 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
-  
+
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
@@ -7151,12 +7223,12 @@
               "Association is currently in progress, queueing new join req");
 
     /*Association is in progress - queue current one*/
-    wdiStatus = WDI_QueueNewAssocRequest(pWDICtx, pEventData, 
+    wdiStatus = WDI_QueueNewAssocRequest(pWDICtx, pEventData,
                              pwdiJoinParams->wdiReqInfo.macBSSID);
 
     wpalMutexRelease(&pWDICtx->wptMutex);
 
-    return wdiStatus; 
+    return wdiStatus;
   }
 
   /*Starting a new association */
@@ -7171,37 +7243,37 @@
 
 
 /**
- @brief Process Config BSS Request function (called when Main 
+ @brief Process Config BSS Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessConfigBSSReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_ConfigBSSReqParamsType*  pwdiConfigBSSParams;
   WDI_ConfigBSSRspCb           wdiConfigBSSRspCb;
-  wpt_uint8                    ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                    ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*          pBSSSes             = NULL;
-  wpt_uint16                   uMsgSize            = 0; 
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint16                   uMsgSize            = 0;
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
-  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS;
 
-  tConfigBssReqMsg             halConfigBssReqMsg; 
+  tConfigBssReqMsg             halConfigBssReqMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData ) ||
@@ -7210,51 +7282,51 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiConfigBSSParams = (WDI_ConfigBSSReqParamsType*)pEventData->pEventData;
   wdiConfigBSSRspCb   = (WDI_ConfigBSSRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
-                                 pwdiConfigBSSParams->wdiReqInfo.macBSSID, 
-                                 &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx,
+                                 pwdiConfigBSSParams->wdiReqInfo.macBSSID,
+                                 &pBSSSes);
 
-  if ( NULL == pBSSSes ) 
+  if ( NULL == pBSSSes )
   {
 #ifdef WLAN_FEATURE_VOWIFI_11R
       /*------------------------------------------------------------------------
-        Fetch an empty session block 
+        Fetch an empty session block
       ------------------------------------------------------------------------*/
-      ucCurrentBSSSesIdx = WDI_FindEmptySession( pWDICtx, &pBSSSes); 
+      ucCurrentBSSSesIdx = WDI_FindEmptySession( pWDICtx, &pBSSSes);
       if ( NULL == pBSSSes )
       {
-    
+
         WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
                   "DAL has no free sessions - cannot run another join");
-    
+
         wpalMutexRelease(&pWDICtx->wptMutex);
-        return WDI_STATUS_RES_FAILURE; 
+        return WDI_STATUS_RES_FAILURE;
       }
-    
+
       /*Save BSS Session Info*/
-      pBSSSes->bInUse = eWLAN_PAL_TRUE; 
-      wpalMemoryCopy( pBSSSes->macBSSID, pwdiConfigBSSParams->wdiReqInfo.macBSSID, 
+      pBSSSes->bInUse = eWLAN_PAL_TRUE;
+      wpalMemoryCopy( pBSSSes->macBSSID, pwdiConfigBSSParams->wdiReqInfo.macBSSID,
                       WDI_MAC_ADDR_LEN);
-    
+
       /*Transition to state Joining*/
-      pBSSSes->wdiAssocState      = WDI_ASSOC_JOINING_ST; 
+      pBSSSes->wdiAssocState      = WDI_ASSOC_JOINING_ST;
       pWDICtx->ucCurrentBSSSesIdx = ucCurrentBSSSesIdx;
 #else
-    /* If the BSS type is IBSS create the session here as there is no Join 
+    /* If the BSS type is IBSS create the session here as there is no Join
      * Request in case of IBSS*/
     if((pwdiConfigBSSParams->wdiReqInfo.wdiBSSType == WDI_IBSS_MODE) ||
        (pwdiConfigBSSParams->wdiReqInfo.wdiBSSType == WDI_INFRA_AP_MODE) ||
@@ -7262,68 +7334,79 @@
        (pwdiConfigBSSParams->wdiReqInfo.wdiBSSType == WDI_BTAMP_STA_MODE))
     {
       /*------------------------------------------------------------------------
-        Fetch an empty session block 
+        Fetch an empty session block
       ------------------------------------------------------------------------*/
-      ucCurrentBSSSesIdx = WDI_FindEmptySession( pWDICtx, &pBSSSes); 
+      ucCurrentBSSSesIdx = WDI_FindEmptySession( pWDICtx, &pBSSSes);
       if ( NULL == pBSSSes )
       {
-    
+
         WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
                   "DAL has no free sessions - cannot run another join");
-    
+
         wpalMutexRelease(&pWDICtx->wptMutex);
-        return WDI_STATUS_RES_FAILURE; 
+        return WDI_STATUS_RES_FAILURE;
       }
-    
+
       /*Save BSS Session Info*/
-      pBSSSes->bInUse = eWLAN_PAL_TRUE; 
-      wpalMemoryCopy( pBSSSes->macBSSID, pwdiConfigBSSParams->wdiReqInfo.macBSSID, 
+      pBSSSes->bInUse = eWLAN_PAL_TRUE;
+      wpalMemoryCopy( pBSSSes->macBSSID, pwdiConfigBSSParams->wdiReqInfo.macBSSID,
                       WDI_MAC_ADDR_LEN);
-    
+
       /*Transition to state Joining*/
-      pBSSSes->wdiAssocState      = WDI_ASSOC_JOINING_ST; 
+      pBSSSes->wdiAssocState      = WDI_ASSOC_JOINING_ST;
       pWDICtx->ucCurrentBSSSesIdx = ucCurrentBSSSesIdx;
     }
     else
     {
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-                "Association sequence for this BSS does not yet exist");
+                "%s: Association sequence for this BSS does not yet exist." MAC_ADDRESS_STR "wdiBssType %d",
+                __func__, MAC_ADDR_ARRAY(pwdiConfigBSSParams->wdiReqInfo.macBSSID), 
+                pwdiConfigBSSParams->wdiReqInfo.wdiBSSType);
+      
       /* for IBSS testing */
       wpalMutexRelease(&pWDICtx->wptMutex);
-      return WDI_STATUS_E_NOT_ALLOWED; 
+      return WDI_STATUS_E_NOT_ALLOWED;
     }
 #endif
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. " MAC_ADDRESS_STR " bssIdx %d", 
+              __func__, MAC_ADDR_ARRAY(pwdiConfigBSSParams->wdiReqInfo.macBSSID), 
+              ucCurrentBSSSesIdx);
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
 
     wpalMutexRelease(&pWDICtx->wptMutex);
 
-    return wdiStatus; 
+    return wdiStatus;
   }
 
   /* Cache the request for response processing */
-  wpalMemoryCopy(&pWDICtx->wdiCachedConfigBssReq, 
-                 pwdiConfigBSSParams, 
+  wpalMemoryCopy(&pWDICtx->wdiCachedConfigBssReq,
+                 pwdiConfigBSSParams,
                  sizeof(pWDICtx->wdiCachedConfigBssReq));
 
   wpalMutexRelease(&pWDICtx->wptMutex);
 
-  uMsgSize = sizeof(halConfigBssReqMsg.configBssParams); 
+  /* Allocation of BssReqMsg Memory Based on Firmware Capabilities */
+#ifdef WLAN_FEATURE_11AC
+  if (WDI_getFwWlanFeatCaps(DOT11AC))
+	  uMsgSize = sizeof(halConfigBssReqMsg.uBssParams.configBssParams_V1); // Version - 1 For 11AC
+  else
+#endif
+	  uMsgSize = sizeof(halConfigBssReqMsg.uBssParams.configBssParams); // default Version - 0 Structure
 
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_CONFIG_BSS_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_CONFIG_BSS_REQ,
                     uMsgSize, &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + uMsgSize )))
   {
@@ -7331,68 +7414,68 @@
               "Unable to get send buffer in config bss req %x %x %x",
                 pEventData, pwdiConfigBSSParams, wdiConfigBSSRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*Copy the BSS request */
-  WDI_CopyWDIConfigBSSToHALConfigBSS( &halConfigBssReqMsg.configBssParams,
+  WDI_CopyWDIConfigBSSToHALConfigBSS( &halConfigBssReqMsg.uBssParams.configBssParams,
                                       &pwdiConfigBSSParams->wdiReqInfo);
 
   /* Need to fill in the STA Index to invalid, since at this point we have not
      yet received it from HAL */
-  halConfigBssReqMsg.configBssParams.staContext.staIdx = WDI_STA_INVALID_IDX;
+  halConfigBssReqMsg.uBssParams.configBssParams.staContext.staIdx = WDI_STA_INVALID_IDX;
 
   /* Need to fill in the BSS index */
-  halConfigBssReqMsg.configBssParams.staContext.bssIdx = pBSSSes->ucBSSIdx;
-  
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halConfigBssReqMsg.configBssParams, 
-                  sizeof(halConfigBssReqMsg.configBssParams)); 
+  halConfigBssReqMsg.uBssParams.configBssParams.staContext.bssIdx = pBSSSes->ucBSSIdx;
+
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halConfigBssReqMsg.uBssParams.configBssParams,
+                  uMsgSize);
 
   pWDICtx->wdiReqStatusCB     = pwdiConfigBSSParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiConfigBSSParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiConfigBSSParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Config BSS Request to HAL 
+    Send Config BSS Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiConfigBSSRspCb, pEventData->pUserData, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiConfigBSSRspCb, pEventData->pUserData,
                        WDI_CONFIG_BSS_RESP);
 
 }/*WDI_ProcessConfigBSSReq*/
 
 
 /**
- @brief Process Del BSS Request function (called when Main FSM 
+ @brief Process Del BSS Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessDelBSSReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_DelBSSReqParamsType*  pwdiDelBSSParams    = NULL;
   WDI_DelBSSRspCb           wdiDelBSSRspCb      = NULL;
-  wpt_uint8                 ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                 ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*       pBSSSes             = NULL;
-  wpt_uint8*                pSendBuffer         = NULL; 
+  wpt_uint8*                pSendBuffer         = NULL;
   wpt_uint16                usDataOffset        = 0;
   wpt_uint16                usSendSize          = 0;
-  WDI_Status                wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status                wdiStatus           = WDI_STATUS_SUCCESS;
 
-  tDeleteBssReqMsg          halBssReqMsg; 
+  tDeleteBssReqMsg          halBssReqMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == (pwdiDelBSSParams = (WDI_DelBSSReqParamsType*)pEventData->pEventData)) ||
@@ -7401,53 +7484,55 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSessionByBSSIdx( pWDICtx, 
-                                             pwdiDelBSSParams->ucBssIdx, 
-                                            &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSessionByBSSIdx( pWDICtx,
+                                             pwdiDelBSSParams->ucBssIdx,
+                                            &pBSSSes);
 
-  if ( NULL == pBSSSes ) 
+  if ( NULL == pBSSSes )
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+        "%s: BSS does not yet exist. ucBssIdx %d",
+        __func__, pwdiDelBSSParams->ucBssIdx);
 
     wpalMutexRelease(&pWDICtx->wptMutex);
 
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. ucBssIdx %d", 
+              __func__, pwdiDelBSSParams->ucBssIdx);
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
 
     wpalMutexRelease(&pWDICtx->wptMutex);
 
-    return wdiStatus; 
+    return wdiStatus;
   }
 
   /*-----------------------------------------------------------------------
     If we receive a Del BSS request for an association that is already in
     progress, it indicates that the assoc has failed => we no longer have
     an association in progress => we must check for pending associations
-    that were queued and start as soon as the Del BSS response is received 
+    that were queued and start as soon as the Del BSS response is received
   -----------------------------------------------------------------------*/
   if ( ucCurrentBSSSesIdx == pWDICtx->ucCurrentBSSSesIdx )
   {
@@ -7465,7 +7550,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_DEL_BSS_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_DEL_BSS_REQ,
                         sizeof(halBssReqMsg.deleteBssParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halBssReqMsg.deleteBssParams) )))
@@ -7474,64 +7559,64 @@
               "Unable to get send buffer in start req %x %x %x",
                 pEventData, pwdiDelBSSParams, wdiDelBSSRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*Fill in the message request structure*/
 
   /*BSS Index is saved on config BSS response and Post Assoc Response */
-  halBssReqMsg.deleteBssParams.bssIdx = pBSSSes->ucBSSIdx; 
+  halBssReqMsg.deleteBssParams.bssIdx = pBSSSes->ucBSSIdx;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halBssReqMsg.deleteBssParams, 
-                  sizeof(halBssReqMsg.deleteBssParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halBssReqMsg.deleteBssParams,
+                  sizeof(halBssReqMsg.deleteBssParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiDelBSSParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiDelBSSParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiDelBSSParams->pUserData;
 
- 
+
   /*-------------------------------------------------------------------------
-    Send Del BSS Request to HAL 
+    Send Del BSS Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiDelBSSRspCb, pEventData->pUserData, WDI_DEL_BSS_RESP);
 
-  
+
 }/*WDI_ProcessDelBSSReq*/
 
 /**
- @brief Process Post Assoc Request function (called when Main 
+ @brief Process Post Assoc Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessPostAssocReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_PostAssocReqParamsType* pwdiPostAssocParams   = NULL;
   WDI_PostAssocRspCb          wdiPostAssocRspCb     = NULL;
-  wpt_uint8                   ucCurrentBSSSesIdx    = 0; 
+  wpt_uint8                   ucCurrentBSSSesIdx    = 0;
   WDI_BSSSessionType*         pBSSSes               = NULL;
-  wpt_uint8*                  pSendBuffer           = NULL; 
+  wpt_uint8*                  pSendBuffer           = NULL;
   wpt_uint16                  usDataOffset          = 0;
   wpt_uint16                  usSendSize            = 0;
   wpt_uint16                  uMsgSize              = 0;
   wpt_uint16                  uOffset               = 0;
-  WDI_Status                  wdiStatus             = WDI_STATUS_SUCCESS; 
+  WDI_Status                  wdiStatus             = WDI_STATUS_SUCCESS;
 
-  tPostAssocReqMsg            halPostAssocReqMsg; 
+  tPostAssocReqMsg            halPostAssocReqMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == (pwdiPostAssocParams = (WDI_PostAssocReqParamsType*)pEventData->pEventData)) ||
@@ -7540,53 +7625,55 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
-                              pwdiPostAssocParams->wdiBSSParams.macBSSID, 
-                              &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx,
+                              pwdiPostAssocParams->wdiBSSParams.macBSSID,
+                              &pBSSSes);
 
   if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist - "
-              "operation not allowed");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+              "%s: Association sequence for this BSS does not yet exist - " 
+              "operation not allowed. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(pwdiPostAssocParams->wdiBSSParams.macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(pwdiPostAssocParams->wdiBSSParams.macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
 
     wpalMutexRelease(&pWDICtx->wptMutex);
 
-    return wdiStatus; 
+    return wdiStatus;
   }
 
   /*-----------------------------------------------------------------------
     If Post Assoc was not yet received - the current association must
     be in progress
     -----------------------------------------------------------------------*/
-  if (( ucCurrentBSSSesIdx != pWDICtx->ucCurrentBSSSesIdx ) || 
+  if (( ucCurrentBSSSesIdx != pWDICtx->ucCurrentBSSSesIdx ) ||
       ( eWLAN_PAL_FALSE == pWDICtx->bAssociationInProgress ))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
@@ -7594,11 +7681,11 @@
               "progress - not allowed");
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*-----------------------------------------------------------------------
-    Post Assoc Request is only allowed in Joining state 
+    Post Assoc Request is only allowed in Joining state
   -----------------------------------------------------------------------*/
   if ( WDI_ASSOC_JOINING_ST != pBSSSes->wdiAssocState)
   {
@@ -7606,7 +7693,7 @@
               "Post Assoc not allowed before JOIN - failing request");
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   wpalMutexRelease(&pWDICtx->wptMutex);
@@ -7614,9 +7701,9 @@
   uMsgSize = sizeof(halPostAssocReqMsg.postAssocReqParams.configStaParams) +
              sizeof(halPostAssocReqMsg.postAssocReqParams.configBssParams) ;
   /*-----------------------------------------------------------------------
-    Fill message for tx over the bus 
+    Fill message for tx over the bus
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_POST_ASSOC_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_POST_ASSOC_REQ,
                         uMsgSize,&pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + uMsgSize )))
   {
@@ -7624,7 +7711,7 @@
               "Unable to get send buffer in start req %x %x %x",
                 pEventData, pwdiPostAssocParams, wdiPostAssocRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*Copy the STA parameters */
@@ -7632,7 +7719,7 @@
                                &pwdiPostAssocParams->wdiSTAParams );
 
   /* Need to fill in the self STA Index */
-  if ( WDI_STATUS_SUCCESS != 
+  if ( WDI_STATUS_SUCCESS !=
        WDI_STATableFindStaidByAddr(pWDICtx,
                                    pwdiPostAssocParams->wdiSTAParams.macSTA,
                                    (wpt_uint8*)&halPostAssocReqMsg.postAssocReqParams.configStaParams.staIdx ))
@@ -7640,11 +7727,11 @@
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   /* Need to fill in the BSS index */
-  halPostAssocReqMsg.postAssocReqParams.configStaParams.bssIdx = 
+  halPostAssocReqMsg.postAssocReqParams.configStaParams.bssIdx =
      pBSSSes->ucBSSIdx;
 
   /*Copy the BSS parameters */
@@ -7652,82 +7739,82 @@
                                       &pwdiPostAssocParams->wdiBSSParams);
 
   /* Need to fill in the STA index of the peer */
-  if ( WDI_STATUS_SUCCESS != 
+  if ( WDI_STATUS_SUCCESS !=
        WDI_STATableFindStaidByAddr(pWDICtx,
                                    pwdiPostAssocParams->wdiBSSParams.wdiSTAContext.macSTA,
-                                   (wpt_uint8*)&halPostAssocReqMsg.postAssocReqParams.configBssParams.staContext.staIdx)) 
+                                   (wpt_uint8*)&halPostAssocReqMsg.postAssocReqParams.configBssParams.staContext.staIdx))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   /* Need to fill in the BSS index */
-  halPostAssocReqMsg.postAssocReqParams.configStaParams.bssIdx = 
+  halPostAssocReqMsg.postAssocReqParams.configStaParams.bssIdx =
      pBSSSes->ucBSSIdx;
 
-  
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halPostAssocReqMsg.postAssocReqParams.configStaParams, 
-                  sizeof(halPostAssocReqMsg.postAssocReqParams.configStaParams)); 
+
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halPostAssocReqMsg.postAssocReqParams.configStaParams,
+                  sizeof(halPostAssocReqMsg.postAssocReqParams.configStaParams));
 
   uOffset = sizeof(halPostAssocReqMsg.postAssocReqParams.configStaParams);
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset + uOffset, 
-                  &halPostAssocReqMsg.postAssocReqParams.configBssParams, 
-                  sizeof(halPostAssocReqMsg.postAssocReqParams.configBssParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset + uOffset,
+                  &halPostAssocReqMsg.postAssocReqParams.configBssParams,
+                  sizeof(halPostAssocReqMsg.postAssocReqParams.configBssParams));
 
- 
+
   pWDICtx->wdiReqStatusCB     = pwdiPostAssocParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiPostAssocParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiPostAssocParams->pUserData;
 
- 
-  wpalMemoryCopy( &pWDICtx->wdiCachedPostAssocReq, 
+
+  wpalMemoryCopy( &pWDICtx->wdiCachedPostAssocReq,
                   pwdiPostAssocParams,
-                  sizeof(pWDICtx->wdiCachedPostAssocReq));  
+                  sizeof(pWDICtx->wdiCachedPostAssocReq));
 
   /*-------------------------------------------------------------------------
-    Send Post Assoc Request to HAL 
+    Send Post Assoc Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiPostAssocRspCb, pEventData->pUserData, WDI_POST_ASSOC_RESP);
 
-  
+
 }/*WDI_ProcessPostAssocReq*/
 
 /**
- @brief Process Del STA Request function (called when Main FSM 
+ @brief Process Del STA Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessDelSTAReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_DelSTAReqParamsType*  pwdiDelSTAParams;
   WDI_DelSTARspCb           wdiDelSTARspCb;
-  wpt_uint8                 ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                 ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*       pBSSSes             = NULL;
-  wpt_uint8*                pSendBuffer         = NULL; 
+  wpt_uint8*                pSendBuffer         = NULL;
   wpt_uint16                usDataOffset        = 0;
   wpt_uint16                usSendSize          = 0;
-  wpt_macAddr               macBSSID; 
+  wpt_macAddr               macBSSID;
   WDI_Status                wdiStatus           = WDI_STATUS_SUCCESS;
 
-  tDeleteStaReqMsg          halDelStaReqMsg; 
+  tDeleteStaReqMsg          halDelStaReqMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -7735,59 +7822,61 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiDelSTAParams = (WDI_DelSTAReqParamsType*)pEventData->pEventData;
   wdiDelSTARspCb   = (WDI_DelSTARspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
     Find the BSS for which the request is made and identify WDI session
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                                                         pwdiDelSTAParams->ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                                                         pwdiDelSTAParams->ucSTAIdx,
                                                          &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
-  if ( NULL == pBSSSes ) 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+              "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR,
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
   wpalMutexRelease(&pWDICtx->wptMutex);
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_DEL_STA_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_DEL_STA_REQ,
                         sizeof(halDelStaReqMsg.delStaParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halDelStaReqMsg.delStaParams) )))
@@ -7796,61 +7885,61 @@
               "Unable to get send buffer in start req %x %x %x",
                 pEventData, pwdiDelSTAParams, wdiDelSTARspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  halDelStaReqMsg.delStaParams.staIdx = pwdiDelSTAParams->ucSTAIdx; 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halDelStaReqMsg.delStaParams, 
-                  sizeof(halDelStaReqMsg.delStaParams)); 
+  halDelStaReqMsg.delStaParams.staIdx = pwdiDelSTAParams->ucSTAIdx;
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halDelStaReqMsg.delStaParams,
+                  sizeof(halDelStaReqMsg.delStaParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiDelSTAParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiDelSTAParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiDelSTAParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Del STA Request to HAL 
+    Send Del STA Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiDelSTARspCb, pEventData->pUserData, WDI_DEL_STA_RESP);
 
 }/*WDI_ProcessDelSTAReq*/
 
 
 /*==========================================================================
-                 SECURITY REQUEST PROCESSING API 
+                 SECURITY REQUEST PROCESSING API
 ==========================================================================*/
 /**
  @brief Process Set BSS Key Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessSetBssKeyReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_SetBSSKeyReqParamsType*  pwdiSetBSSKeyParams;
   WDI_SetBSSKeyRspCb           wdiSetBSSKeyRspCb;
-  wpt_uint8                    ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                    ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*          pBSSSes             = NULL;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
-  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS;
   tSetBssKeyReqMsg             halSetBssKeyReqMsg  = {{0}};
   wpt_uint8                    keyIndex            = 0;
 
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -7858,45 +7947,47 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiSetBSSKeyParams = (WDI_SetBSSKeyReqParamsType*)pEventData->pEventData;
   wdiSetBSSKeyRspCb   = (WDI_SetBSSKeyRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSessionByBSSIdx( pWDICtx, 
-                           pwdiSetBSSKeyParams->wdiBSSKeyInfo.ucBssIdx, 
-                          &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSessionByBSSIdx( pWDICtx,
+                           pwdiSetBSSKeyParams->wdiBSSKeyInfo.ucBssIdx,
+                          &pBSSSes);
 
-  if ( NULL == pBSSSes ) 
+  if ( NULL == pBSSSes )
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+              "%s: Association sequence for this BSS does not yet exist. ucBssIdx %d", 
+              __func__, pwdiSetBSSKeyParams->wdiBSSKeyInfo.ucBssIdx);
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. ucBssIdx %d",
+              __func__, pwdiSetBSSKeyParams->wdiBSSKeyInfo.ucBssIdx);
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
@@ -7904,7 +7995,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_BSS_KEY_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_BSS_KEY_REQ,
                         sizeof(halSetBssKeyReqMsg.setBssKeyParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halSetBssKeyReqMsg.setBssKeyParams) )))
@@ -7913,88 +8004,88 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiSetBSSKeyParams, wdiSetBSSKeyRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-----------------------------------------------------------------------
     Copy the Key parameters into the HAL message
   -----------------------------------------------------------------------*/
 
-  halSetBssKeyReqMsg.setBssKeyParams.bssIdx = ucCurrentBSSSesIdx; 
+  halSetBssKeyReqMsg.setBssKeyParams.bssIdx = ucCurrentBSSSesIdx;
 
-  halSetBssKeyReqMsg.setBssKeyParams.encType = 
+  halSetBssKeyReqMsg.setBssKeyParams.encType =
              WDI_2_HAL_ENC_TYPE (pwdiSetBSSKeyParams->wdiBSSKeyInfo.wdiEncType);
 
-  halSetBssKeyReqMsg.setBssKeyParams.numKeys = 
+  halSetBssKeyReqMsg.setBssKeyParams.numKeys =
                                   pwdiSetBSSKeyParams->wdiBSSKeyInfo.ucNumKeys;
 
   for(keyIndex = 0; keyIndex < pwdiSetBSSKeyParams->wdiBSSKeyInfo.ucNumKeys ;
                                                                  keyIndex++)
   {
-    halSetBssKeyReqMsg.setBssKeyParams.key[keyIndex].keyId = 
+    halSetBssKeyReqMsg.setBssKeyParams.key[keyIndex].keyId =
                       pwdiSetBSSKeyParams->wdiBSSKeyInfo.aKeys[keyIndex].keyId;
     halSetBssKeyReqMsg.setBssKeyParams.key[keyIndex].unicast =
                      pwdiSetBSSKeyParams->wdiBSSKeyInfo.aKeys[keyIndex].unicast;
     halSetBssKeyReqMsg.setBssKeyParams.key[keyIndex].keyDirection =
                 pwdiSetBSSKeyParams->wdiBSSKeyInfo.aKeys[keyIndex].keyDirection;
     wpalMemoryCopy(halSetBssKeyReqMsg.setBssKeyParams.key[keyIndex].keyRsc,
-                     pwdiSetBSSKeyParams->wdiBSSKeyInfo.aKeys[keyIndex].keyRsc, 
+                     pwdiSetBSSKeyParams->wdiBSSKeyInfo.aKeys[keyIndex].keyRsc,
                      WDI_MAX_KEY_RSC_LEN);
-    halSetBssKeyReqMsg.setBssKeyParams.key[keyIndex].paeRole = 
+    halSetBssKeyReqMsg.setBssKeyParams.key[keyIndex].paeRole =
                      pwdiSetBSSKeyParams->wdiBSSKeyInfo.aKeys[keyIndex].paeRole;
-    halSetBssKeyReqMsg.setBssKeyParams.key[keyIndex].keyLength = 
+    halSetBssKeyReqMsg.setBssKeyParams.key[keyIndex].keyLength =
                    pwdiSetBSSKeyParams->wdiBSSKeyInfo.aKeys[keyIndex].keyLength;
     wpalMemoryCopy(halSetBssKeyReqMsg.setBssKeyParams.key[keyIndex].key,
-                         pwdiSetBSSKeyParams->wdiBSSKeyInfo.aKeys[keyIndex].key, 
+                         pwdiSetBSSKeyParams->wdiBSSKeyInfo.aKeys[keyIndex].key,
                         WDI_MAX_KEY_LENGTH);
    }
-                                                                  
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                    &halSetBssKeyReqMsg.setBssKeyParams, 
-                    sizeof(halSetBssKeyReqMsg.setBssKeyParams)); 
+
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                    &halSetBssKeyReqMsg.setBssKeyParams,
+                    sizeof(halSetBssKeyReqMsg.setBssKeyParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiSetBSSKeyParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiSetBSSKeyParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiSetBSSKeyParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Set BSS Key Request to HAL 
+    Send Set BSS Key Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiSetBSSKeyRspCb, pEventData->pUserData, 
-                       WDI_SET_BSS_KEY_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiSetBSSKeyRspCb, pEventData->pUserData,
+                       WDI_SET_BSS_KEY_RESP);
 
 }/*WDI_ProcessSetBssKeyReq*/
 
 /**
- @brief Process Remove BSS Key Request function (called when Main    
+ @brief Process Remove BSS Key Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessRemoveBssKeyReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_RemoveBSSKeyReqParamsType*  pwdiRemoveBSSKeyParams;
   WDI_RemoveBSSKeyRspCb           wdiRemoveBSSKeyRspCb;
-  wpt_uint8                       ucCurrentBSSSesIdx     = 0; 
+  wpt_uint8                       ucCurrentBSSSesIdx     = 0;
   WDI_BSSSessionType*             pBSSSes                = NULL;
-  wpt_uint8*                      pSendBuffer            = NULL; 
+  wpt_uint8*                      pSendBuffer            = NULL;
   wpt_uint16                      usDataOffset           = 0;
   wpt_uint16                      usSendSize             = 0;
-  WDI_Status                      wdiStatus              = WDI_STATUS_SUCCESS; 
+  WDI_Status                      wdiStatus              = WDI_STATUS_SUCCESS;
   tRemoveBssKeyReqMsg             halRemoveBssKeyReqMsg  = {{0}};
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -8002,45 +8093,47 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiRemoveBSSKeyParams = (WDI_RemoveBSSKeyReqParamsType*)pEventData->pEventData;
   wdiRemoveBSSKeyRspCb   = (WDI_RemoveBSSKeyRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSessionByBSSIdx( pWDICtx, 
-                           pwdiRemoveBSSKeyParams->wdiKeyInfo.ucBssIdx, 
-                          &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSessionByBSSIdx( pWDICtx,
+                           pwdiRemoveBSSKeyParams->wdiKeyInfo.ucBssIdx,
+                          &pBSSSes);
 
-  if ( NULL == pBSSSes ) 
+  if ( NULL == pBSSSes )
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+              "%s: Association sequence for this BSS does not yet exist. ucBssIdx %d", 
+              __func__, pwdiRemoveBSSKeyParams->wdiKeyInfo.ucBssIdx);
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. ucBssIdx %d",
+              __func__, pwdiRemoveBSSKeyParams->wdiKeyInfo.ucBssIdx);
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
@@ -8049,7 +8142,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_RMV_BSS_KEY_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_RMV_BSS_KEY_REQ,
                         sizeof(halRemoveBssKeyReqMsg.removeBssKeyParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halRemoveBssKeyReqMsg.removeBssKeyParams) )))
@@ -8058,49 +8151,49 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiRemoveBSSKeyParams, wdiRemoveBSSKeyRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
   /*-----------------------------------------------------------------------
     Copy the Key parameters into the HAL message
   -----------------------------------------------------------------------*/
   halRemoveBssKeyReqMsg.removeBssKeyParams.bssIdx = ucCurrentBSSSesIdx;
 
-  halRemoveBssKeyReqMsg.removeBssKeyParams.encType = 
+  halRemoveBssKeyReqMsg.removeBssKeyParams.encType =
       WDI_2_HAL_ENC_TYPE (pwdiRemoveBSSKeyParams->wdiKeyInfo.wdiEncType);
 
   halRemoveBssKeyReqMsg.removeBssKeyParams.keyId = pwdiRemoveBSSKeyParams->wdiKeyInfo.ucKeyId;
 
-  halRemoveBssKeyReqMsg.removeBssKeyParams.wepType = 
+  halRemoveBssKeyReqMsg.removeBssKeyParams.wepType =
       WDI_2_HAL_WEP_TYPE(pwdiRemoveBSSKeyParams->wdiKeyInfo.wdiWEPType);
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                    &halRemoveBssKeyReqMsg.removeBssKeyParams, 
-                    sizeof(halRemoveBssKeyReqMsg.removeBssKeyParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                    &halRemoveBssKeyReqMsg.removeBssKeyParams,
+                    sizeof(halRemoveBssKeyReqMsg.removeBssKeyParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiRemoveBSSKeyParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiRemoveBSSKeyParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiRemoveBSSKeyParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Remove BSS Key Request to HAL 
+    Send Remove BSS Key Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiRemoveBSSKeyRspCb, pEventData->pUserData,
-                       WDI_RMV_BSS_KEY_RESP); 
+                       WDI_RMV_BSS_KEY_RESP);
 }/*WDI_ProcessRemoveBssKeyReq*/
 
 /**
- @brief Process Set STA KeyRequest function (called when Main FSM 
+ @brief Process Set STA KeyRequest function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessSetStaKeyReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -8108,19 +8201,19 @@
   WDI_SetSTAKeyReqParamsType*  pwdiSetSTAKeyParams;
   WDI_SetSTAKeyRspCb           wdiSetSTAKeyRspCb;
   WDI_BSSSessionType*          pBSSSes             = NULL;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
-  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS;
   wpt_macAddr                  macBSSID;
-  wpt_uint8                    ucCurrentBSSSesIdx; 
+  wpt_uint8                    ucCurrentBSSSesIdx;
   tSetStaKeyReqMsg             halSetStaKeyReqMsg  = {{0}};
   wpt_uint8                    keyIndex            = 0;
 
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -8128,52 +8221,54 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
    pwdiSetSTAKeyParams = (WDI_SetSTAKeyReqParamsType*)pEventData->pEventData;
    wdiSetSTAKeyRspCb   = (WDI_SetSTAKeyRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
     Find the BSS for which the request is made and identify WDI session
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                                  pwdiSetSTAKeyParams->wdiKeyInfo.ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                                  pwdiSetSTAKeyParams->wdiKeyInfo.ucSTAIdx,
                                   &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
-  if ( NULL == pBSSSes ) 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+              "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
- 
+
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR,
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
@@ -8181,7 +8276,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_STA_KEY_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_STA_KEY_REQ,
                         sizeof(halSetStaKeyReqMsg.setStaKeyParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halSetStaKeyReqMsg.setStaKeyParams) )))
@@ -8190,15 +8285,15 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiSetSTAKeyParams, wdiSetSTAKeyRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
   /*-----------------------------------------------------------------------
     Copy the STA Key parameters into the HAL message
   -----------------------------------------------------------------------*/
-  halSetStaKeyReqMsg.setStaKeyParams.encType = 
+  halSetStaKeyReqMsg.setStaKeyParams.encType =
       WDI_2_HAL_ENC_TYPE (pwdiSetSTAKeyParams->wdiKeyInfo.wdiEncType);
 
-  halSetStaKeyReqMsg.setStaKeyParams.wepType = 
+  halSetStaKeyReqMsg.setStaKeyParams.wepType =
       WDI_2_HAL_WEP_TYPE (pwdiSetSTAKeyParams->wdiKeyInfo.wdiWEPType );
 
   halSetStaKeyReqMsg.setStaKeyParams.staIdx = pwdiSetSTAKeyParams->wdiKeyInfo.ucSTAIdx;
@@ -8211,71 +8306,71 @@
   for(keyIndex = 0; keyIndex < pwdiSetSTAKeyParams->wdiKeyInfo.ucNumKeys ;
                                                                  keyIndex++)
   {
-    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyId = 
+    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyId =
                       pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].keyId;
     halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].unicast =
                      pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].unicast;
     halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyDirection =
                 pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].keyDirection;
     wpalMemoryCopy(halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyRsc,
-                     pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].keyRsc, 
+                     pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
                      WDI_MAX_KEY_RSC_LEN);
-    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].paeRole = 
+    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].paeRole =
                      pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].paeRole;
-    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyLength = 
+    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyLength =
                    pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].keyLength;
     wpalMemoryCopy(halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].key,
-                         pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].key, 
+                         pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].key,
                         WDI_MAX_KEY_LENGTH);
    }
 #else
-  halSetStaKeyReqMsg.setStaKeyParams.key.keyId = 
+  halSetStaKeyReqMsg.setStaKeyParams.key.keyId =
                       pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].keyId;
   halSetStaKeyReqMsg.setStaKeyParams.key.unicast =
                      pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].unicast;
   halSetStaKeyReqMsg.setStaKeyParams.key.keyDirection =
                 pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].keyDirection;
   wpalMemoryCopy(halSetStaKeyReqMsg.setStaKeyParams.key.keyRsc,
-                     pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].keyRsc, 
+                     pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].keyRsc,
                      WDI_MAX_KEY_RSC_LEN);
-  halSetStaKeyReqMsg.setStaKeyParams.key.paeRole = 
+  halSetStaKeyReqMsg.setStaKeyParams.key.paeRole =
                      pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].paeRole;
-  halSetStaKeyReqMsg.setStaKeyParams.key.keyLength = 
+  halSetStaKeyReqMsg.setStaKeyParams.key.keyLength =
                    pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].keyLength;
   wpalMemoryCopy(halSetStaKeyReqMsg.setStaKeyParams.key.key,
-                         pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].key, 
+                         pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].key,
                         WDI_MAX_KEY_LENGTH);
 #endif
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                    &halSetStaKeyReqMsg.setStaKeyParams, 
-                    sizeof(halSetStaKeyReqMsg.setStaKeyParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                    &halSetStaKeyReqMsg.setStaKeyParams,
+                    sizeof(halSetStaKeyReqMsg.setStaKeyParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiSetSTAKeyParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiSetSTAKeyParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiSetSTAKeyParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Set STA Key Request to HAL 
+    Send Set STA Key Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiSetSTAKeyRspCb, pEventData->pUserData, 
-                       WDI_SET_STA_KEY_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiSetSTAKeyRspCb, pEventData->pUserData,
+                       WDI_SET_STA_KEY_RESP);
 
 }/*WDI_ProcessSetSTAKeyReq*/
 
 /**
- @brief Process Remove STA Key Request function (called when 
+ @brief Process Remove STA Key Request function (called when
         Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessRemoveStaKeyReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -8283,17 +8378,17 @@
   WDI_RemoveSTAKeyReqParamsType*  pwdiRemoveSTAKeyParams;
   WDI_RemoveSTAKeyRspCb           wdiRemoveSTAKeyRspCb;
   WDI_BSSSessionType*             pBSSSes                = NULL;
-  wpt_uint8*                      pSendBuffer            = NULL; 
+  wpt_uint8*                      pSendBuffer            = NULL;
   wpt_uint16                      usDataOffset           = 0;
   wpt_uint16                      usSendSize             = 0;
-  WDI_Status                      wdiStatus              = WDI_STATUS_SUCCESS; 
+  WDI_Status                      wdiStatus              = WDI_STATUS_SUCCESS;
   wpt_macAddr                     macBSSID;
   wpt_uint8                       ucCurrentBSSSesIdx;
   tRemoveStaKeyReqMsg             halRemoveStaKeyReqMsg  = {{0}};
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
  if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -8301,52 +8396,54 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiRemoveSTAKeyParams = (WDI_RemoveSTAKeyReqParamsType*)pEventData->pEventData;
   wdiRemoveSTAKeyRspCb   = (WDI_RemoveSTAKeyRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
     Find the BSS for which the request is made and identify WDI session
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                             pwdiRemoveSTAKeyParams->wdiKeyInfo.ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                             pwdiRemoveSTAKeyParams->wdiKeyInfo.ucSTAIdx,
                              &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
-  if ( NULL == pBSSSes ) 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+              "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
- 
+
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
@@ -8355,7 +8452,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_RMV_STA_KEY_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_RMV_STA_KEY_REQ,
                         sizeof(halRemoveStaKeyReqMsg.removeStaKeyParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halRemoveStaKeyReqMsg.removeStaKeyParams) )))
@@ -8364,54 +8461,54 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiRemoveSTAKeyParams, wdiRemoveSTAKeyRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-----------------------------------------------------------------------
     Copy the Key parameters into the HAL message
   -----------------------------------------------------------------------*/
 
-  halRemoveStaKeyReqMsg.removeStaKeyParams.staIdx = 
+  halRemoveStaKeyReqMsg.removeStaKeyParams.staIdx =
       pwdiRemoveSTAKeyParams->wdiKeyInfo.ucSTAIdx;
 
-  halRemoveStaKeyReqMsg.removeStaKeyParams.encType = 
+  halRemoveStaKeyReqMsg.removeStaKeyParams.encType =
       WDI_2_HAL_ENC_TYPE (pwdiRemoveSTAKeyParams->wdiKeyInfo.wdiEncType);
 
-  halRemoveStaKeyReqMsg.removeStaKeyParams.keyId = 
+  halRemoveStaKeyReqMsg.removeStaKeyParams.keyId =
       pwdiRemoveSTAKeyParams->wdiKeyInfo.ucKeyId;
 
-  halRemoveStaKeyReqMsg.removeStaKeyParams.unicast = 
+  halRemoveStaKeyReqMsg.removeStaKeyParams.unicast =
       pwdiRemoveSTAKeyParams->wdiKeyInfo.ucUnicast;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                    &halRemoveStaKeyReqMsg.removeStaKeyParams, 
-                    sizeof(halRemoveStaKeyReqMsg.removeStaKeyParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                    &halRemoveStaKeyReqMsg.removeStaKeyParams,
+                    sizeof(halRemoveStaKeyReqMsg.removeStaKeyParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiRemoveSTAKeyParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiRemoveSTAKeyParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiRemoveSTAKeyParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Remove STA Key Request to HAL 
+    Send Remove STA Key Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiRemoveSTAKeyRspCb, pEventData->pUserData,
-                       WDI_RMV_STA_KEY_RESP); 
+                       WDI_RMV_STA_KEY_RESP);
 
 }/*WDI_ProcessRemoveSTAKeyReq*/
 
 /**
- @brief Process Set STA KeyRequest function (called when Main FSM 
+ @brief Process Set STA KeyRequest function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessSetStaBcastKeyReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -8419,19 +8516,19 @@
   WDI_SetSTAKeyReqParamsType*  pwdiSetSTAKeyParams;
   WDI_SetSTAKeyRspCb           wdiSetSTAKeyRspCb;
   WDI_BSSSessionType*          pBSSSes             = NULL;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
-  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS;
   wpt_macAddr                  macBSSID;
-  wpt_uint8                    ucCurrentBSSSesIdx; 
+  wpt_uint8                    ucCurrentBSSSesIdx;
   tSetStaKeyReqMsg             halSetStaKeyReqMsg  = {{0}};
   wpt_uint8                    keyIndex            = 0;
 
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -8439,52 +8536,54 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
    pwdiSetSTAKeyParams = (WDI_SetSTAKeyReqParamsType*)pEventData->pEventData;
    wdiSetSTAKeyRspCb   = (WDI_SetSTAKeyRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
     Find the BSS for which the request is made and identify WDI session
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                                  pwdiSetSTAKeyParams->wdiKeyInfo.ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                                  pwdiSetSTAKeyParams->wdiKeyInfo.ucSTAIdx,
                                   &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
-  if ( NULL == pBSSSes ) 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
+  if ( NULL == pBSSSes )
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+              "Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR,
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
- 
+
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR,
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
@@ -8492,7 +8591,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_STA_KEY_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_STA_KEY_REQ,
                         sizeof(halSetStaKeyReqMsg.setStaKeyParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halSetStaKeyReqMsg.setStaKeyParams) )))
@@ -8501,15 +8600,15 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiSetSTAKeyParams, wdiSetSTAKeyRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
   /*-----------------------------------------------------------------------
     Copy the STA Key parameters into the HAL message
   -----------------------------------------------------------------------*/
-  halSetStaKeyReqMsg.setStaKeyParams.encType = 
+  halSetStaKeyReqMsg.setStaKeyParams.encType =
       WDI_2_HAL_ENC_TYPE (pwdiSetSTAKeyParams->wdiKeyInfo.wdiEncType);
 
-  halSetStaKeyReqMsg.setStaKeyParams.wepType = 
+  halSetStaKeyReqMsg.setStaKeyParams.wepType =
       WDI_2_HAL_WEP_TYPE (pwdiSetSTAKeyParams->wdiKeyInfo.wdiWEPType );
 
   halSetStaKeyReqMsg.setStaKeyParams.staIdx = pwdiSetSTAKeyParams->wdiKeyInfo.ucSTAIdx;
@@ -8522,71 +8621,71 @@
   for(keyIndex = 0; keyIndex < pwdiSetSTAKeyParams->wdiKeyInfo.ucNumKeys ;
                                                                  keyIndex++)
   {
-    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyId = 
+    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyId =
                       pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].keyId;
     halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].unicast =
                      pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].unicast;
     halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyDirection =
                 pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].keyDirection;
     wpalMemoryCopy(halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyRsc,
-                     pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].keyRsc, 
+                     pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
                      WDI_MAX_KEY_RSC_LEN);
-    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].paeRole = 
+    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].paeRole =
                      pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].paeRole;
-    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyLength = 
+    halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].keyLength =
                    pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].keyLength;
     wpalMemoryCopy(halSetStaKeyReqMsg.setStaKeyParams.key[keyIndex].key,
-                         pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].key, 
+                         pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[keyIndex].key,
                         WDI_MAX_KEY_LENGTH);
    }
 #else
-  halSetStaKeyReqMsg.setStaKeyParams.key.keyId = 
+  halSetStaKeyReqMsg.setStaKeyParams.key.keyId =
                       pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].keyId;
   halSetStaKeyReqMsg.setStaKeyParams.key.unicast =
                      pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].unicast;
   halSetStaKeyReqMsg.setStaKeyParams.key.keyDirection =
                 pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].keyDirection;
   wpalMemoryCopy(halSetStaKeyReqMsg.setStaKeyParams.key.keyRsc,
-                     pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].keyRsc, 
+                     pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].keyRsc,
                      WDI_MAX_KEY_RSC_LEN);
-  halSetStaKeyReqMsg.setStaKeyParams.key.paeRole = 
+  halSetStaKeyReqMsg.setStaKeyParams.key.paeRole =
                      pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].paeRole;
-  halSetStaKeyReqMsg.setStaKeyParams.key.keyLength = 
+  halSetStaKeyReqMsg.setStaKeyParams.key.keyLength =
                    pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].keyLength;
   wpalMemoryCopy(halSetStaKeyReqMsg.setStaKeyParams.key.key,
-                         pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].key, 
+                         pwdiSetSTAKeyParams->wdiKeyInfo.wdiKey[0].key,
                         WDI_MAX_KEY_LENGTH);
 #endif
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                    &halSetStaKeyReqMsg.setStaKeyParams, 
-                    sizeof(halSetStaKeyReqMsg.setStaKeyParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                    &halSetStaKeyReqMsg.setStaKeyParams,
+                    sizeof(halSetStaKeyReqMsg.setStaKeyParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiSetSTAKeyParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiSetSTAKeyParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiSetSTAKeyParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Set STA Key Request to HAL 
+    Send Set STA Key Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiSetSTAKeyRspCb, pEventData->pUserData, 
-                       WDI_SET_STA_KEY_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiSetSTAKeyRspCb, pEventData->pUserData,
+                       WDI_SET_STA_KEY_RESP);
 
 }/*WDI_ProcessSetSTABcastKeyReq*/
 
 /**
- @brief Process Remove STA Key Request function (called when 
+ @brief Process Remove STA Key Request function (called when
         Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessRemoveStaBcastKeyReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -8594,17 +8693,17 @@
   WDI_RemoveSTAKeyReqParamsType*  pwdiRemoveSTABcastKeyParams;
   WDI_RemoveSTAKeyRspCb           wdiRemoveSTAKeyRspCb;
   WDI_BSSSessionType*             pBSSSes                = NULL;
-  wpt_uint8*                      pSendBuffer            = NULL; 
+  wpt_uint8*                      pSendBuffer            = NULL;
   wpt_uint16                      usDataOffset           = 0;
   wpt_uint16                      usSendSize             = 0;
-  WDI_Status                      wdiStatus              = WDI_STATUS_SUCCESS; 
+  WDI_Status                      wdiStatus              = WDI_STATUS_SUCCESS;
   wpt_macAddr                     macBSSID;
   wpt_uint8                       ucCurrentBSSSesIdx;
   tRemoveStaKeyReqMsg             halRemoveStaBcastKeyReqMsg = {{0}};
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
  if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -8612,52 +8711,54 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiRemoveSTABcastKeyParams = (WDI_RemoveSTAKeyReqParamsType*)pEventData->pEventData;
   wdiRemoveSTAKeyRspCb   = (WDI_RemoveSTAKeyRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
     Find the BSS for which the request is made and identify WDI session
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                             pwdiRemoveSTABcastKeyParams->wdiKeyInfo.ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                             pwdiRemoveSTABcastKeyParams->wdiKeyInfo.ucSTAIdx,
                              &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
-  if ( NULL == pBSSSes ) 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+              "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
- 
+
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR, 
+               __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
@@ -8666,7 +8767,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_RMV_STA_BCAST_KEY_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_RMV_STA_BCAST_KEY_REQ,
                         sizeof(halRemoveStaBcastKeyReqMsg.removeStaKeyParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halRemoveStaBcastKeyReqMsg.removeStaKeyParams) )))
@@ -8675,76 +8776,76 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiRemoveSTABcastKeyParams, wdiRemoveSTAKeyRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-----------------------------------------------------------------------
     Copy the Key parameters into the HAL message
   -----------------------------------------------------------------------*/
 
-  halRemoveStaBcastKeyReqMsg.removeStaKeyParams.staIdx = 
+  halRemoveStaBcastKeyReqMsg.removeStaKeyParams.staIdx =
       pwdiRemoveSTABcastKeyParams->wdiKeyInfo.ucSTAIdx;
 
-  halRemoveStaBcastKeyReqMsg.removeStaKeyParams.encType = 
+  halRemoveStaBcastKeyReqMsg.removeStaKeyParams.encType =
       WDI_2_HAL_ENC_TYPE (pwdiRemoveSTABcastKeyParams->wdiKeyInfo.wdiEncType);
 
-  halRemoveStaBcastKeyReqMsg.removeStaKeyParams.keyId = 
+  halRemoveStaBcastKeyReqMsg.removeStaKeyParams.keyId =
       pwdiRemoveSTABcastKeyParams->wdiKeyInfo.ucKeyId;
 
-  halRemoveStaBcastKeyReqMsg.removeStaKeyParams.unicast = 
+  halRemoveStaBcastKeyReqMsg.removeStaKeyParams.unicast =
       pwdiRemoveSTABcastKeyParams->wdiKeyInfo.ucUnicast;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                    &halRemoveStaBcastKeyReqMsg.removeStaKeyParams, 
-                    sizeof(halRemoveStaBcastKeyReqMsg.removeStaKeyParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                    &halRemoveStaBcastKeyReqMsg.removeStaKeyParams,
+                    sizeof(halRemoveStaBcastKeyReqMsg.removeStaKeyParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiRemoveSTABcastKeyParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiRemoveSTABcastKeyParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiRemoveSTABcastKeyParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Remove STA Key Request to HAL 
+    Send Remove STA Key Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiRemoveSTAKeyRspCb, pEventData->pUserData,
-                       WDI_RMV_STA_KEY_RESP); 
+                       WDI_RMV_STA_KEY_RESP);
 
 }/*WDI_ProcessRemoveSTABcastKeyReq*/
 
 /*==========================================================================
-                   QOS and BA PROCESSING REQUEST API 
+                   QOS and BA PROCESSING REQUEST API
 ==========================================================================*/
 /**
  @brief Process Add TSpec Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessAddTSpecReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_AddTSReqParamsType*  pwdiAddTSParams;
   WDI_AddTsRspCb           wdiAddTSRspCb;
-  wpt_uint8                ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*      pBSSSes             = NULL;
-  wpt_uint8*               pSendBuffer         = NULL; 
+  wpt_uint8*               pSendBuffer         = NULL;
   wpt_uint16               usDataOffset        = 0;
   wpt_uint16               usSendSize          = 0;
-  WDI_Status               wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status               wdiStatus           = WDI_STATUS_SUCCESS;
   wpt_macAddr              macBSSID;
   tAddTsParams             halAddTsParams      = {0};
-  
+
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -8752,62 +8853,64 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiAddTSParams = (WDI_AddTSReqParamsType*)pEventData->pEventData;
   wdiAddTSRspCb   = (WDI_AddTsRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
     Find the BSS for which the request is made and identify WDI session
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                                        pwdiAddTSParams->wdiTsInfo.ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                                        pwdiAddTSParams->wdiTsInfo.ucSTAIdx,
                                         &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
-  if ( NULL == pBSSSes ) 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+              "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
- 
+
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR,
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
   wpalMutexRelease(&pWDICtx->wptMutex);
   /*-----------------------------------------------------------------------
     Get message buffer
-    ! TO DO : proper conversion into the HAL Message Request Format 
+    ! TO DO : proper conversion into the HAL Message Request Format
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_ADD_TS_REQ, 
-                                                    sizeof(halAddTsParams), 
-                                                    &pSendBuffer, &usDataOffset, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_ADD_TS_REQ,
+                                                    sizeof(halAddTsParams),
+                                                    &pSendBuffer, &usDataOffset,
                                                     &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halAddTsParams) )))
   {
@@ -8815,7 +8918,7 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiAddTSParams, wdiAddTSRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   halAddTsParams.staIdx = pwdiAddTSParams->wdiTsInfo.ucSTAIdx;
@@ -8824,104 +8927,104 @@
   //TSPEC IE
   halAddTsParams.tspec.type = pwdiAddTSParams->wdiTsInfo.wdiTspecIE.ucType;
   halAddTsParams.tspec.length = pwdiAddTSParams->wdiTsInfo.wdiTspecIE.ucLength;
-  halAddTsParams.tspec.nomMsduSz = 
+  halAddTsParams.tspec.nomMsduSz =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.usNomMsduSz;
-  halAddTsParams.tspec.maxMsduSz = 
+  halAddTsParams.tspec.maxMsduSz =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.usMaxMsduSz;
-  halAddTsParams.tspec.minSvcInterval = 
+  halAddTsParams.tspec.minSvcInterval =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.uMinSvcInterval;
-  halAddTsParams.tspec.maxSvcInterval = 
+  halAddTsParams.tspec.maxSvcInterval =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.uMaxSvcInterval;
-  halAddTsParams.tspec.inactInterval = 
+  halAddTsParams.tspec.inactInterval =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.uInactInterval;
-  halAddTsParams.tspec.suspendInterval = 
+  halAddTsParams.tspec.suspendInterval =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.uSuspendInterval;
-  halAddTsParams.tspec.svcStartTime = 
+  halAddTsParams.tspec.svcStartTime =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.uSvcStartTime;
-  halAddTsParams.tspec.minDataRate = 
+  halAddTsParams.tspec.minDataRate =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.uMinDataRate;
-  halAddTsParams.tspec.meanDataRate = 
+  halAddTsParams.tspec.meanDataRate =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.uMeanDataRate;
-  halAddTsParams.tspec.peakDataRate = 
+  halAddTsParams.tspec.peakDataRate =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.uPeakDataRate;
-  halAddTsParams.tspec.maxBurstSz = 
+  halAddTsParams.tspec.maxBurstSz =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.uMaxBurstSz;
-  halAddTsParams.tspec.delayBound = 
+  halAddTsParams.tspec.delayBound =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.uDelayBound;
-  halAddTsParams.tspec.minPhyRate = 
+  halAddTsParams.tspec.minPhyRate =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.uMinPhyRate;
-  halAddTsParams.tspec.surplusBw = 
+  halAddTsParams.tspec.surplusBw =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.usSurplusBw;
-  halAddTsParams.tspec.mediumTime = 
+  halAddTsParams.tspec.mediumTime =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.usMediumTime;
 
   //TSPEC IE : TS INFO : TRAFFIC
-  halAddTsParams.tspec.tsinfo.traffic.ackPolicy = 
+  halAddTsParams.tspec.tsinfo.traffic.ackPolicy =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.accessPolicy;
-  halAddTsParams.tspec.tsinfo.traffic.userPrio = 
+  halAddTsParams.tspec.tsinfo.traffic.userPrio =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.userPrio;
-  halAddTsParams.tspec.tsinfo.traffic.psb = 
+  halAddTsParams.tspec.tsinfo.traffic.psb =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.psb;
-  halAddTsParams.tspec.tsinfo.traffic.aggregation = 
+  halAddTsParams.tspec.tsinfo.traffic.aggregation =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.aggregation;
-  halAddTsParams.tspec.tsinfo.traffic.direction = 
+  halAddTsParams.tspec.tsinfo.traffic.direction =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.direction;
-  halAddTsParams.tspec.tsinfo.traffic.tsid = 
+  halAddTsParams.tspec.tsinfo.traffic.tsid =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.tsid;
-  halAddTsParams.tspec.tsinfo.traffic.trafficType = 
+  halAddTsParams.tspec.tsinfo.traffic.trafficType =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.trafficType;
 
   //TSPEC IE : TS INFO : SCHEDULE
-  halAddTsParams.tspec.tsinfo.schedule.rsvd = 
+  halAddTsParams.tspec.tsinfo.schedule.rsvd =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.rsvd;
-  halAddTsParams.tspec.tsinfo.schedule.schedule = 
+  halAddTsParams.tspec.tsinfo.schedule.schedule =
      pwdiAddTSParams->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.schedule;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halAddTsParams, 
-                  sizeof(halAddTsParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halAddTsParams,
+                  sizeof(halAddTsParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiAddTSParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiAddTSParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiAddTSParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Add TS Request to HAL 
+    Send Add TS Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiAddTSRspCb, pEventData->pUserData,
-                       WDI_ADD_TS_RESP); 
+                       WDI_ADD_TS_RESP);
 }/*WDI_ProcessAddTSpecReq*/
 
 
 /**
  @brief Process Del TSpec Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessDelTSpecReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_DelTSReqParamsType*      pwdiDelTSParams;
   WDI_DelTsRspCb               wdiDelTSRspCb;
-  wpt_uint8                    ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                    ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*          pBSSSes             = NULL;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
-  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -8929,7 +9032,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiDelTSParams = (WDI_DelTSReqParamsType*)pEventData->pEventData;
@@ -8937,47 +9040,49 @@
 
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
-                           pwdiDelTSParams->wdiDelTSInfo.macBSSID, 
-                          &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx,
+                           pwdiDelTSParams->wdiDelTSInfo.macBSSID,
+                          &pBSSSes);
 
-  if ( NULL == pBSSSes ) 
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
-
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+            "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+            __func__, MAC_ADDR_ARRAY(pwdiDelTSParams->wdiDelTSInfo.macBSSID));
+    
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(pwdiDelTSParams->wdiDelTSInfo.macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
   wpalMutexRelease(&pWDICtx->wptMutex);
   /*-----------------------------------------------------------------------
     Get message buffer
-    ! TO DO : proper conversion into the HAL Message Request Format 
+    ! TO DO : proper conversion into the HAL Message Request Format
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_DEL_TS_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_DEL_TS_REQ,
                         sizeof(pwdiDelTSParams->wdiDelTSInfo),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(pwdiDelTSParams->wdiDelTSInfo) )))
@@ -8986,52 +9091,52 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiDelTSParams, wdiDelTSRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &pwdiDelTSParams->wdiDelTSInfo, 
-                  sizeof(pwdiDelTSParams->wdiDelTSInfo)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &pwdiDelTSParams->wdiDelTSInfo,
+                  sizeof(pwdiDelTSParams->wdiDelTSInfo));
 
   pWDICtx->wdiReqStatusCB     = pwdiDelTSParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiDelTSParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiDelTSParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Del TS Request to HAL 
+    Send Del TS Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiDelTSRspCb, pEventData->pUserData, WDI_DEL_TS_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiDelTSRspCb, pEventData->pUserData, WDI_DEL_TS_RESP);
 }/*WDI_ProcessDelTSpecReq*/
 
 /**
  @brief Process Update EDCA Params Request function (called when
         Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessUpdateEDCAParamsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_UpdateEDCAParamsType*    pwdiUpdateEDCAParams;
   WDI_UpdateEDCAParamsRspCb    wdiUpdateEDCARspCb;
-  wpt_uint8                    ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                    ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*          pBSSSes             = NULL;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset         = 0;
   wpt_uint16                   usSendSize           = 0;
-  WDI_Status                   wdiStatus; 
+  WDI_Status                   wdiStatus;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -9039,54 +9144,56 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiUpdateEDCAParams = (WDI_UpdateEDCAParamsType*)pEventData->pEventData;
   wdiUpdateEDCARspCb   = (WDI_UpdateEDCAParamsRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSessionByBSSIdx( pWDICtx, 
-                           pwdiUpdateEDCAParams->wdiEDCAInfo.ucBssIdx, 
-                          &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSessionByBSSIdx( pWDICtx,
+                           pwdiUpdateEDCAParams->wdiEDCAInfo.ucBssIdx,
+                          &pBSSSes);
 
-  if ( NULL == pBSSSes ) 
+  if ( NULL == pBSSSes )
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+            "%s: Association sequence for this BSS does not yet exist. ucBssIdx %d", 
+            __func__, pwdiUpdateEDCAParams->wdiEDCAInfo.ucBssIdx);
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. ucBssIdx %d",
+              __func__, pwdiUpdateEDCAParams->wdiEDCAInfo.ucBssIdx);
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
   wpalMutexRelease(&pWDICtx->wptMutex);
   /*-----------------------------------------------------------------------
     Get message buffer
-    ! TO DO : proper conversion into the HAL Message Request Format 
+    ! TO DO : proper conversion into the HAL Message Request Format
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPD_EDCA_PRMS_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPD_EDCA_PRMS_REQ,
                         sizeof(pwdiUpdateEDCAParams->wdiEDCAInfo),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(pwdiUpdateEDCAParams->wdiEDCAInfo) )))
@@ -9095,56 +9202,56 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiUpdateEDCAParams, wdiUpdateEDCARspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &pwdiUpdateEDCAParams->wdiEDCAInfo, 
-                  sizeof(pwdiUpdateEDCAParams->wdiEDCAInfo)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &pwdiUpdateEDCAParams->wdiEDCAInfo,
+                  sizeof(pwdiUpdateEDCAParams->wdiEDCAInfo));
 
   pWDICtx->wdiReqStatusCB     = pwdiUpdateEDCAParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiUpdateEDCAParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiUpdateEDCAParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Update EDCA Params Request to HAL 
+    Send Update EDCA Params Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiUpdateEDCARspCb, pEventData->pUserData, 
-                       WDI_UPD_EDCA_PRMS_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiUpdateEDCARspCb, pEventData->pUserData,
+                       WDI_UPD_EDCA_PRMS_RESP);
 }/*WDI_ProcessUpdateEDCAParamsReq*/
 
 /**
- @brief Process Add BA Request function (called when Main FSM 
+ @brief Process Add BA Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessAddBASessionReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_AddBASessionReqParamsType*  pwdiAddBASessionParams;
   WDI_AddBASessionRspCb           wdiAddBASessionRspCb;
-  wpt_uint8                       ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                       ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*             pBSSSes             = NULL;
-  wpt_uint8*                      pSendBuffer         = NULL; 
+  wpt_uint8*                      pSendBuffer         = NULL;
   wpt_uint16                      usDataOffset        = 0;
   wpt_uint16                      usSendSize          = 0;
-  WDI_Status                      wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status                      wdiStatus           = WDI_STATUS_SUCCESS;
   wpt_macAddr                     macBSSID;
 
   tAddBASessionReqMsg             halAddBASessionReq;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -9152,56 +9259,58 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  pwdiAddBASessionParams = 
+  pwdiAddBASessionParams =
                   (WDI_AddBASessionReqParamsType*)pEventData->pEventData;
-  wdiAddBASessionRspCb = 
+  wdiAddBASessionRspCb =
                   (WDI_AddBASessionRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                   pwdiAddBASessionParams->wdiBASessionInfoType.ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                   pwdiAddBASessionParams->wdiBASessionInfoType.ucSTAIdx,
                    &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
 
-  if ( NULL == pBSSSes ) 
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
-
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+          "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+          __func__, MAC_ADDR_ARRAY(macBSSID));
+      
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR, 
+               __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
@@ -9209,18 +9318,18 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, 
-                        WDI_ADD_BA_SESSION_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+                        WDI_ADD_BA_SESSION_REQ,
                         sizeof(halAddBASessionReq.addBASessionParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
-      ( usSendSize < 
+      ( usSendSize <
             (usDataOffset + sizeof(halAddBASessionReq.addBASessionParams) )))
   {
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
               "Unable to get send buffer in Add BA session req %x %x %x",
                 pEventData, pwdiAddBASessionParams, wdiAddBASessionRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   halAddBASessionReq.addBASessionParams.staIdx =
@@ -9241,52 +9350,52 @@
   halAddBASessionReq.addBASessionParams.baDirection =
                   pwdiAddBASessionParams->wdiBASessionInfoType.ucBaDirection;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halAddBASessionReq.addBASessionParams, 
-                  sizeof(halAddBASessionReq.addBASessionParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halAddBASessionReq.addBASessionParams,
+                  sizeof(halAddBASessionReq.addBASessionParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiAddBASessionParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiAddBASessionParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiAddBASessionParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Start Request to HAL 
+    Send Start Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiAddBASessionRspCb, pEventData->pUserData, 
-                        WDI_ADD_BA_SESSION_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiAddBASessionRspCb, pEventData->pUserData,
+                        WDI_ADD_BA_SESSION_RESP);
 }/*WDI_ProcessAddBASessionReq*/
 
 /**
- @brief Process Del BA Request function (called when Main FSM 
+ @brief Process Del BA Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessDelBAReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_DelBAReqParamsType*      pwdiDelBAParams;
   WDI_DelBARspCb               wdiDelBARspCb;
-  wpt_uint8                    ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                    ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*          pBSSSes             = NULL;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
-  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS;
   wpt_macAddr                  macBSSID;
   tDelBAParams                 halDelBAparam;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -9294,57 +9403,59 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiDelBAParams = (WDI_DelBAReqParamsType*)pEventData->pEventData;
   wdiDelBARspCb   = (WDI_DelBARspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                                     pwdiDelBAParams->wdiBAInfo.ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                                     pwdiDelBAParams->wdiBAInfo.ucSTAIdx,
                                      &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
 
-  if ( NULL == pBSSSes ) 
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+            "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+            __func__, MAC_ADDR_ARRAY(macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR,
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
   wpalMutexRelease(&pWDICtx->wptMutex);
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_DEL_BA_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_DEL_BA_REQ,
                         sizeof(halDelBAparam),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halDelBAparam) )))
@@ -9353,25 +9464,25 @@
               "Unable to get send buffer for DEL BA req %x %x %x",
                 pEventData, pwdiDelBAParams, wdiDelBARspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   halDelBAparam.staIdx = pwdiDelBAParams->wdiBAInfo.ucSTAIdx;
   halDelBAparam.baTID = pwdiDelBAParams->wdiBAInfo.ucBaTID;
   halDelBAparam.baDirection = pwdiDelBAParams->wdiBAInfo.ucBaDirection;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halDelBAparam, 
-                  sizeof(halDelBAparam)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halDelBAparam,
+                  sizeof(halDelBAparam));
 
   pWDICtx->wdiReqStatusCB     = pwdiDelBAParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiDelBAParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiDelBAParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Start Request to HAL 
+    Send Start Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiDelBARspCb, pEventData->pUserData, WDI_DEL_BA_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiDelBARspCb, pEventData->pUserData, WDI_DEL_BA_RESP);
 }/*WDI_ProcessDelBAReq*/
 
 #ifdef FEATURE_WLAN_CCX
@@ -9418,8 +9529,9 @@
   ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, pwdiTSMParams->wdiTsmStatsParamsInfo.bssid, &pBSSSes); 
   if ( NULL == pBSSSes ) 
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+            "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+            __func__, MAC_ADDR_ARRAY(pwdiTSMParams->wdiTsmStatsParamsInfo.bssid));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
     return WDI_STATUS_E_NOT_ALLOWED; 
@@ -9431,8 +9543,9 @@
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(pwdiTSMParams->wdiTsmStatsParamsInfo.bssid));
 
     wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
     wpalMutexRelease(&pWDICtx->wptMutex);
@@ -9479,31 +9592,31 @@
 
 
 /**
- @brief Process Flush AC Request function (called when Main FSM 
+ @brief Process Flush AC Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessFlushAcReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_FlushAcReqParamsType*    pwdiFlushAcParams = NULL;
    WDI_FlushAcRspCb             wdiFlushAcRspCb;
-   wpt_uint8*                   pSendBuffer         = NULL; 
+   wpt_uint8*                   pSendBuffer         = NULL;
    wpt_uint16                   usDataOffset        = 0;
    wpt_uint16                   usSendSize          = 0;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
        ( NULL == pEventData->pCBfnc ))
@@ -9511,16 +9624,16 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    pwdiFlushAcParams = (WDI_FlushAcReqParamsType*)pEventData->pEventData;
    wdiFlushAcRspCb   = (WDI_FlushAcRspCb)pEventData->pCBfnc;
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_FLUSH_AC_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_FLUSH_AC_REQ,
                          sizeof(pwdiFlushAcParams->wdiFlushAcInfo),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(pwdiFlushAcParams->wdiFlushAcInfo) )))
@@ -9529,43 +9642,43 @@
                "Unable to get send buffer in set bss key req %x %x %x",
                  pEventData, pwdiFlushAcParams, wdiFlushAcRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &pwdiFlushAcParams->wdiFlushAcInfo, 
-                   sizeof(pwdiFlushAcParams->wdiFlushAcInfo)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &pwdiFlushAcParams->wdiFlushAcInfo,
+                   sizeof(pwdiFlushAcParams->wdiFlushAcInfo));
 
    pWDICtx->wdiReqStatusCB     = pwdiFlushAcParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiFlushAcParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiFlushAcParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Start Request to HAL 
+     Send Start Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiFlushAcRspCb, pEventData->pUserData, WDI_FLUSH_AC_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiFlushAcRspCb, pEventData->pUserData, WDI_FLUSH_AC_RESP);
 }/*WDI_ProcessFlushAcReq*/
 
 /**
- @brief Process BT AMP event Request function (called when Main 
+ @brief Process BT AMP event Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessBtAmpEventReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_BtAmpEventParamsType*    pwdiBtAmpEventParams = NULL;
    WDI_BtAmpEventRspCb          wdiBtAmpEventRspCb;
-   wpt_uint8*                   pSendBuffer         = NULL; 
+   wpt_uint8*                   pSendBuffer         = NULL;
    wpt_uint16                   usDataOffset        = 0;
    wpt_uint16                   usSendSize          = 0;
 
@@ -9573,7 +9686,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
        ( NULL == pEventData->pCBfnc ))
@@ -9581,16 +9694,16 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    pwdiBtAmpEventParams = (WDI_BtAmpEventParamsType*)pEventData->pEventData;
    wdiBtAmpEventRspCb   = (WDI_BtAmpEventRspCb)pEventData->pCBfnc;
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_BTAMP_EVENT_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_BTAMP_EVENT_REQ,
                          sizeof(haltBtAmpEventMsg.btAmpEventParams),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(haltBtAmpEventMsg.btAmpEventParams) )))
@@ -9599,52 +9712,52 @@
                "Unable to get send buffer in BT AMP event req %x %x %x",
                  pEventData, pwdiBtAmpEventParams, wdiBtAmpEventRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   haltBtAmpEventMsg.btAmpEventParams.btAmpEventType = 
+   haltBtAmpEventMsg.btAmpEventParams.btAmpEventType =
       pwdiBtAmpEventParams->wdiBtAmpEventInfo.ucBtAmpEventType;
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &haltBtAmpEventMsg.btAmpEventParams, 
-                   sizeof(haltBtAmpEventMsg.btAmpEventParams)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &haltBtAmpEventMsg.btAmpEventParams,
+                   sizeof(haltBtAmpEventMsg.btAmpEventParams));
 
    pWDICtx->wdiReqStatusCB     = pwdiBtAmpEventParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiBtAmpEventParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiBtAmpEventParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Start Request to HAL 
+     Send Start Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiBtAmpEventRspCb, pEventData->pUserData, WDI_BTAMP_EVENT_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiBtAmpEventRspCb, pEventData->pUserData, WDI_BTAMP_EVENT_RESP);
 }/*WDI_ProcessBtAmpEventReq*/
 
 /**
  @brief Process Add STA self Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessAddSTASelfReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_AddSTASelfReqParamsType*          pwdiAddSTASelfReqParams;
   WDI_AddSTASelfParamsRspCb             wdiAddSTASelfReqRspCb;
-  wpt_uint8*                            pSendBuffer         = NULL; 
+  wpt_uint8*                            pSendBuffer         = NULL;
   wpt_uint16                            usDataOffset        = 0;
   wpt_uint16                            usSendSize          = 0;
-  tAddStaSelfParams                     halAddSTASelfParams; 
+  tAddStaSelfParams                     halAddSTASelfParams;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData) ||
@@ -9653,18 +9766,18 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  pwdiAddSTASelfReqParams = 
+  pwdiAddSTASelfReqParams =
     (WDI_AddSTASelfReqParamsType*)pEventData->pEventData;
-  wdiAddSTASelfReqRspCb = 
+  wdiAddSTASelfReqRspCb =
     (WDI_AddSTASelfParamsRspCb)pEventData->pCBfnc;
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, 
-                        WDI_ADD_STA_SELF_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+                        WDI_ADD_STA_SELF_REQ,
                         sizeof(tAddStaSelfParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(tAddStaSelfParams) )))
@@ -9673,59 +9786,59 @@
               "Unable to get send buffer in ADD STA SELF REQ %x %x %x",
      pEventData, pwdiAddSTASelfReqParams, wdiAddSTASelfReqRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /* Cache the request for response processing */
-  wpalMemoryCopy(&pWDICtx->wdiCacheAddSTASelfReq, pwdiAddSTASelfReqParams, 
+  wpalMemoryCopy(&pWDICtx->wdiCacheAddSTASelfReq, pwdiAddSTASelfReqParams,
                  sizeof(pWDICtx->wdiCacheAddSTASelfReq));
 
-  wpalMemoryCopy(halAddSTASelfParams.selfMacAddr, 
+  wpalMemoryCopy(halAddSTASelfParams.selfMacAddr,
                    pwdiAddSTASelfReqParams->wdiAddSTASelfInfo.selfMacAddr, 6) ;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, &halAddSTASelfParams, 
-                                         sizeof(tAddStaSelfParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset, &halAddSTASelfParams,
+                                         sizeof(tAddStaSelfParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiAddSTASelfReqParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiAddSTASelfReqParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiAddSTASelfReqParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Update Probe Resp Template Request to HAL 
+    Send Update Probe Resp Template Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiAddSTASelfReqRspCb, pEventData->pUserData, 
-                       WDI_ADD_STA_SELF_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiAddSTASelfReqRspCb, pEventData->pUserData,
+                       WDI_ADD_STA_SELF_RESP);
 }/*WDI_ProcessAddSTASelfReq*/
 
 
 
 /**
- @brief Process Del Sta Self Request function (called when Main 
+ @brief Process Del Sta Self Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessDelSTASelfReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_DelSTASelfReqParamsType*      pwdiDelStaSelfReqParams;
   WDI_DelSTASelfRspCb               wdiDelStaSelfRspCb;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
   tDelStaSelfParams            halSetDelSelfSTAParams;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -9733,69 +9846,145 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  pwdiDelStaSelfReqParams = 
+  pwdiDelStaSelfReqParams =
                  (WDI_DelSTASelfReqParamsType*)pEventData->pEventData;
   wdiDelStaSelfRspCb      = (WDI_DelSTASelfRspCb)pEventData->pCBfnc;
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_DEL_STA_SELF_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_DEL_STA_SELF_REQ,
                          sizeof(pwdiDelStaSelfReqParams->wdiDelStaSelfInfo),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
-    ( usSendSize < 
+    ( usSendSize <
          (usDataOffset + sizeof(pwdiDelStaSelfReqParams->wdiDelStaSelfInfo) )))
    {
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
                "Unable to get send buffer in Del Sta Self req %x %x %x",
                  pEventData, pwdiDelStaSelfReqParams, wdiDelStaSelfRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
   }
 
-  wpalMemoryCopy(halSetDelSelfSTAParams.selfMacAddr, 
+  wpalMemoryCopy(halSetDelSelfSTAParams.selfMacAddr,
                    pwdiDelStaSelfReqParams->wdiDelStaSelfInfo.selfMacAddr, 6) ;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, &halSetDelSelfSTAParams, 
-                                         sizeof(tDelStaSelfParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset, &halSetDelSelfSTAParams,
+                                         sizeof(tDelStaSelfParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiDelStaSelfReqParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiDelStaSelfReqParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiDelStaSelfReqParams->pUserData;
 
   /*-------------------------------------------------------------------------
-     Send Start Request to HAL 
+     Send Start Request to HAL
    -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiDelStaSelfRspCb, pEventData->pUserData, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiDelStaSelfRspCb, pEventData->pUserData,
                                                      WDI_DEL_STA_SELF_RESP);
 
 }
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/**
+ @brief Process Start Oem Data 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_ProcessStartOemDataReq
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+)
+{
+  WDI_oemDataReqParamsType*    pwdiOemDataReqParams = NULL;
+  WDI_oemDataRspCb             wdiOemDataRspCb;
+  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint16                   usDataOffset        = 0;
+  wpt_uint16                   usSendSize          = 0;
+  wpt_uint16                   reqLen;
+  tStartOemDataReqParams*      halStartOemDataReqParams;
+
+  /*-------------------------------------------------------------------------
+  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", __FUNCTION__);
+      WDI_ASSERT(0);
+      return WDI_STATUS_E_FAILURE;
+  }
+
+  pwdiOemDataReqParams = (WDI_oemDataReqParamsType*)pEventData->pEventData;
+  wdiOemDataRspCb   = (WDI_oemDataRspCb)pEventData->pCBfnc;
+
+  /*-----------------------------------------------------------------------
+     Get message buffer
+   -----------------------------------------------------------------------*/
+
+  reqLen = sizeof(tStartOemDataReqParams);
+
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, 
+                         WDI_START_OEM_DATA_REQ, reqLen,
+                              &pSendBuffer, &usDataOffset, &usSendSize))||
+        (usSendSize < (usDataOffset + reqLen)))
+  {
+      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
+               "Unable to get send buffer in Start Oem Data req %x %x %x",
+                 pEventData, pwdiOemDataReqParams, wdiOemDataRspCb);
+      WDI_ASSERT(0);
+      return WDI_STATUS_E_FAILURE;
+  }
+
+  //copying WDI OEM DATA REQ PARAMS to shared memory
+  halStartOemDataReqParams = (tStartOemDataReqParams *)(pSendBuffer + usDataOffset );
+
+  wpalMemoryCopy(&halStartOemDataReqParams->selfMacAddr, &pwdiOemDataReqParams->wdiOemDataReqInfo.selfMacAddr, sizeof(wpt_macAddr));
+  wpalMemoryCopy(&halStartOemDataReqParams->oemDataReq, &pwdiOemDataReqParams->wdiOemDataReqInfo.oemDataReq, OEM_DATA_REQ_SIZE);
+
+  pWDICtx->wdiReqStatusCB     = pwdiOemDataReqParams->wdiReqStatusCB;
+  pWDICtx->pReqStatusUserData = pwdiOemDataReqParams->pUserData; 
+
+  /*-------------------------------------------------------------------------
+    Send Start Request to HAL
+  -------------------------------------------------------------------------*/
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+                        wdiOemDataRspCb, pEventData->pUserData, 
+                                            WDI_START_OEM_DATA_RESP); 
+}/*WDI_ProcessStartOemDataReq*/
+#endif
 
 /**
- @brief Process Host Resume Request function (called when Main 
+ @brief Process Host Resume Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessHostResumeReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_ResumeParamsType*          pwdiHostResumeParams = NULL;
   WDI_HostResumeEventRspCb       wdiHostResumeRspCb;
-  wpt_uint8*                     pSendBuffer         = NULL; 
+  wpt_uint8*                     pSendBuffer         = NULL;
   wpt_uint16                     usDataOffset        = 0;
   wpt_uint16                     usSendSize          = 0;
   tHalWlanHostResumeReqParam     halResumeReqParams;
@@ -9803,7 +9992,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-  Sanity check 
+  Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -9811,7 +10000,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
                "%s: Invalid parameters ",__FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
   }
 
    pwdiHostResumeParams = (WDI_ResumeParamsType*)pEventData->pEventData;
@@ -9820,63 +10009,63 @@
   /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
                          WDI_HOST_RESUME_REQ, sizeof(halResumeReqParams),
                               &pSendBuffer, &usDataOffset, &usSendSize))||
         (usSendSize < (usDataOffset + sizeof(halResumeReqParams))))
   {
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
-               "Unable to get send buffer in Start In Nav Meas req %x %x %x",
+               "Unable to get send buffer in Start Oem Data req %x %x %x",
                  pEventData, pwdiHostResumeParams, wdiHostResumeRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
   }
 
-  halResumeReqParams.configuredMcstBcstFilterSetting = 
+  halResumeReqParams.configuredMcstBcstFilterSetting =
      pwdiHostResumeParams->wdiResumeParams.ucConfiguredMcstBcstFilterSetting;
-       
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halResumeReqParams, 
-                  sizeof(halResumeReqParams)); 
+
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halResumeReqParams,
+                  sizeof(halResumeReqParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiHostResumeParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiHostResumeParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiHostResumeParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Start Request to HAL 
+    Send Start Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiHostResumeRspCb, pEventData->pUserData, 
-                                            WDI_HOST_RESUME_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiHostResumeRspCb, pEventData->pUserData,
+                                            WDI_HOST_RESUME_RESP);
 }/*WDI_ProcessHostResumeReq*/
 
 /**
- @brief Process set Tx Per Tracking Parameters Request function (called 
+ @brief Process set Tx Per Tracking Parameters Request function (called
         when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessSetTxPerTrackingReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_SetTxPerTrackingReqParamsType* pwdiSetTxPerTrackingReqParams = NULL;
    WDI_SetTxPerTrackingRspCb          pwdiSetTxPerTrackingRspCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    tHalTxPerTrackingReqParam     halTxPerTrackingReqParam;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
        ( NULL == pEventData->pCBfnc ))
@@ -9884,17 +10073,17 @@
        WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters ",__FUNCTION__);
        WDI_ASSERT(0);
-       return WDI_STATUS_E_FAILURE; 
+       return WDI_STATUS_E_FAILURE;
    }
 
    pwdiSetTxPerTrackingReqParams = (WDI_SetTxPerTrackingReqParamsType*)pEventData->pEventData;
    pwdiSetTxPerTrackingRspCb   = (WDI_SetTxPerTrackingRspCb)pEventData->pCBfnc;
-   
+
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_TX_PER_TRACKING_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_TX_PER_TRACKING_REQ,
                          sizeof(halTxPerTrackingReqParam),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(halTxPerTrackingReqParam) )))
@@ -9903,26 +10092,26 @@
                   "Unable to get send buffer in set tx per tracking req %x %x %x",
                   pEventData, pwdiSetTxPerTrackingReqParams, pwdiSetTxPerTrackingRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
-   
+
    halTxPerTrackingReqParam.ucTxPerTrackingEnable = pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingEnable;
    halTxPerTrackingReqParam.ucTxPerTrackingPeriod = pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingPeriod;
    halTxPerTrackingReqParam.ucTxPerTrackingRatio = pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingRatio;
    halTxPerTrackingReqParam.uTxPerTrackingWatermark = pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.uTxPerTrackingWatermark;
-      
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &halTxPerTrackingReqParam, 
-                   sizeof(halTxPerTrackingReqParam)); 
+
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &halTxPerTrackingReqParam,
+                   sizeof(halTxPerTrackingReqParam));
 
    pWDICtx->wdiReqStatusCB     = pwdiSetTxPerTrackingReqParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiSetTxPerTrackingReqParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiSetTxPerTrackingReqParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        pwdiSetTxPerTrackingRspCb, pEventData->pUserData, WDI_SET_TX_PER_TRACKING_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        pwdiSetTxPerTrackingRspCb, pEventData->pUserData, WDI_SET_TX_PER_TRACKING_RESP);
 }/*WDI_ProcessSetTxPerTrackingReq*/
 
 /*=========================================================================
@@ -9931,22 +10120,22 @@
 
 /**
  @brief Process Suspend Indications function (called when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessHostSuspendInd
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_SuspendParamsType          *pSuspendIndParams;
-  wpt_uint8*                     pSendBuffer         = NULL; 
+  wpt_uint8*                     pSendBuffer         = NULL;
   wpt_uint16                     usDataOffset        = 0;
   wpt_uint16                     usSendSize          = 0;
   WDI_Status                     wdiStatus;
@@ -9954,14 +10143,14 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ))
   {
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
                "%s: Invalid parameters in Suspend ind",__FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
   }
 
   pSuspendIndParams = (WDI_SuspendParamsType *)pEventData->pEventData;
@@ -9969,8 +10158,8 @@
    /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, 
-                         WDI_HOST_SUSPEND_IND, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+                         WDI_HOST_SUSPEND_IND,
                      sizeof(halWlanSuspendIndparams),
                      &pSendBuffer, &usDataOffset, &usSendSize))||
         (usSendSize < (usDataOffset + sizeof(halWlanSuspendIndparams))))
@@ -9978,58 +10167,58 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
                   "Unable to get send buffer in Suspend Ind ");
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
   }
 
   halWlanSuspendIndparams.configuredMcstBcstFilterSetting =
        pSuspendIndParams->wdiSuspendParams.ucConfiguredMcstBcstFilterSetting;
 
-  halWlanSuspendIndparams.activeSessionCount = 
+  halWlanSuspendIndparams.activeSessionCount =
        WDI_GetActiveSessionsCount(pWDICtx);
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, &halWlanSuspendIndparams, 
-                                         sizeof(tHalWlanHostSuspendIndParam)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset, &halWlanSuspendIndparams,
+                                         sizeof(tHalWlanHostSuspendIndParam));
 
   /*-------------------------------------------------------------------------
-    Send Suspend Request to HAL 
+    Send Suspend Request to HAL
   -------------------------------------------------------------------------*/
   pWDICtx->wdiReqStatusCB     = pSuspendIndParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pSuspendIndParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pSuspendIndParams->pUserData;
 
-  wdiStatus = WDI_SendIndication( pWDICtx, pSendBuffer, usSendSize); 
+  wdiStatus = WDI_SendIndication( pWDICtx, pSendBuffer, usSendSize);
   return  ( wdiStatus != WDI_STATUS_SUCCESS )?wdiStatus:WDI_STATUS_SUCCESS_SYNC;
 }/*WDI_ProcessHostSuspendInd*/
 
 /*==========================================================================
-                  MISC CONTROL PROCESSING REQUEST API 
+                  MISC CONTROL PROCESSING REQUEST API
 ==========================================================================*/
 /**
- @brief Process Channel Switch Request function (called when 
+ @brief Process Channel Switch Request function (called when
         Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessChannelSwitchReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_SwitchChReqParamsType*   pwdiSwitchChParams;
   WDI_SwitchChRspCb            wdiSwitchChRspCb;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
   tSwitchChannelReqMsg         halSwitchChannelReq = {{0}};
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -10037,16 +10226,16 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiSwitchChParams = (WDI_SwitchChReqParamsType*)pEventData->pEventData;
   wdiSwitchChRspCb   = (WDI_SwitchChRspCb)pEventData->pCBfnc;
   /*-----------------------------------------------------------------------
     Get message buffer
-    ! TO DO : proper conversion into the HAL Message Request Format 
+    ! TO DO : proper conversion into the HAL Message Request Format
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_CH_SWITCH_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_CH_SWITCH_REQ,
                         sizeof(halSwitchChannelReq.switchChannelParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halSwitchChannelReq.switchChannelParams) )))
@@ -10055,21 +10244,21 @@
               "Unable to get send buffer in channel switch req %x %x %x",
                 pEventData, pwdiSwitchChParams, wdiSwitchChRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  halSwitchChannelReq.switchChannelParams.channelNumber = 
+  halSwitchChannelReq.switchChannelParams.channelNumber =
                        pwdiSwitchChParams->wdiChInfo.ucChannel;
-#ifndef WLAN_FEATURE_VOWIFI    
-  halSwitchChannelReq.switchChannelParams.localPowerConstraint = 
+#ifndef WLAN_FEATURE_VOWIFI
+  halSwitchChannelReq.switchChannelParams.localPowerConstraint =
                        pwdiSwitchChParams->wdiChInfo.ucLocalPowerConstraint;
 #endif
-  halSwitchChannelReq.switchChannelParams.secondaryChannelOffset = 
+  halSwitchChannelReq.switchChannelParams.secondaryChannelOffset =
                        pwdiSwitchChParams->wdiChInfo.wdiSecondaryChannelOffset;
 
 #ifdef WLAN_FEATURE_VOWIFI
   halSwitchChannelReq.switchChannelParams.maxTxPower
-                            = pwdiSwitchChParams->wdiChInfo.cMaxTxPower; 
+                            = pwdiSwitchChParams->wdiChInfo.cMaxTxPower;
   wpalMemoryCopy(halSwitchChannelReq.switchChannelParams.selfStaMacAddr,
                   pwdiSwitchChParams->wdiChInfo.macSelfStaMacAddr,
                   WDI_MAC_ADDR_LEN);
@@ -10077,51 +10266,52 @@
                   pwdiSwitchChParams->wdiChInfo.macBSSId,
                   WDI_MAC_ADDR_LEN);
 #endif
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halSwitchChannelReq.switchChannelParams, 
-                  sizeof(halSwitchChannelReq.switchChannelParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halSwitchChannelReq.switchChannelParams,
+                  sizeof(halSwitchChannelReq.switchChannelParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiSwitchChParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiSwitchChParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiSwitchChParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Switch Channel Request to HAL 
+    Send Switch Channel Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiSwitchChRspCb, pEventData->pUserData, WDI_CH_SWITCH_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiSwitchChRspCb, pEventData->pUserData, WDI_CH_SWITCH_RESP);
 }/*WDI_ProcessChannelSwitchReq*/
 
 /**
- @brief Process Config STA Request function (called when Main FSM 
+ @brief Process Config STA Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessConfigStaReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_ConfigSTAReqParamsType*  pwdiConfigSTAParams;
   WDI_ConfigSTARspCb           wdiConfigSTARspCb;
-  wpt_uint8                    ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                    ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*          pBSSSes             = NULL;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
-  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS;
 
-  tConfigStaReqMsg             halConfigStaReqMsg; 
+  tConfigStaReqMsg             halConfigStaReqMsg;
+  wpt_uint16                   uMsgSize            = 0;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -10129,140 +10319,151 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiConfigSTAParams = (WDI_ConfigSTAReqParamsType*)pEventData->pEventData;
   wdiConfigSTARspCb   = (WDI_ConfigSTARspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
-                           pwdiConfigSTAParams->wdiReqInfo.macBSSID, 
-                          &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx,
+                           pwdiConfigSTAParams->wdiReqInfo.macBSSID,
+                          &pBSSSes);
 
-  if ( NULL == pBSSSes ) 
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+          "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+          __func__, MAC_ADDR_ARRAY(pwdiConfigSTAParams->wdiReqInfo.macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(pwdiConfigSTAParams->wdiReqInfo.macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
   wpalMutexRelease(&pWDICtx->wptMutex);
+  
+  /* Allocation of StaReqMsg Memory Based on Firmware Capabilities */
+#ifdef WLAN_FEATURE_11AC
+  if (WDI_getFwWlanFeatCaps(DOT11AC))
+	  uMsgSize = sizeof(halConfigStaReqMsg.uStaParams.configStaParams_V1); // Version-1 For 11AC
+  else
+#endif
+	  uMsgSize = sizeof(halConfigStaReqMsg.uStaParams.configStaParams); // Version-0 Default
+
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_CONFIG_STA_REQ, 
-                        sizeof(halConfigStaReqMsg.configStaParams),
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_CONFIG_STA_REQ,
+                        uMsgSize,
                         &pSendBuffer, &usDataOffset, &usSendSize))||
-      ( usSendSize < (usDataOffset + sizeof(halConfigStaReqMsg.configStaParams) )))
+      ( usSendSize < (usDataOffset + uMsgSize )))
   {
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
               "Unable to get send buffer in config sta req %x %x %x",
                 pEventData, pwdiConfigSTAParams, wdiConfigSTARspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*Copy the station context*/
-  WDI_CopyWDIStaCtxToHALStaCtx( &halConfigStaReqMsg.configStaParams,
+  WDI_CopyWDIStaCtxToHALStaCtx( &halConfigStaReqMsg.uStaParams.configStaParams,
                                 &pwdiConfigSTAParams->wdiReqInfo);
 
   if(pwdiConfigSTAParams->wdiReqInfo.wdiSTAType == WDI_STA_ENTRY_SELF)
   {
     /* Need to fill in the self STA Index */
-    if ( WDI_STATUS_SUCCESS != 
+    if ( WDI_STATUS_SUCCESS !=
          WDI_STATableFindStaidByAddr(pWDICtx,
                                      pwdiConfigSTAParams->wdiReqInfo.macSTA,
-                                     (wpt_uint8*)&halConfigStaReqMsg.configStaParams.staIdx ))
+                                     (wpt_uint8*)&halConfigStaReqMsg.uStaParams.configStaParams.staIdx ))
     {
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
                "This station does not exist in the WDI Station Table %d");
       wpalMutexRelease(&pWDICtx->wptMutex);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
     }
   }
   else
   {
   /* Need to fill in the STA Index to invalid, since at this point we have not
      yet received it from HAL */
-    halConfigStaReqMsg.configStaParams.staIdx = WDI_STA_INVALID_IDX;
+    halConfigStaReqMsg.uStaParams.configStaParams.staIdx = WDI_STA_INVALID_IDX;
   }
 
   /* Need to fill in the BSS index */
-  halConfigStaReqMsg.configStaParams.bssIdx = pBSSSes->ucBSSIdx;
+  halConfigStaReqMsg.uStaParams.configStaParams.bssIdx = pBSSSes->ucBSSIdx;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halConfigStaReqMsg.configStaParams, 
-                  sizeof(halConfigStaReqMsg.configStaParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halConfigStaReqMsg.uStaParams,
+                  sizeof(halConfigStaReqMsg.uStaParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiConfigSTAParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiConfigSTAParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiConfigSTAParams->pUserData;
 
-  wpalMemoryCopy( &pWDICtx->wdiCachedConfigStaReq, 
-                  pwdiConfigSTAParams, 
+  wpalMemoryCopy( &pWDICtx->wdiCachedConfigStaReq,
+                  pwdiConfigSTAParams,
                   sizeof(pWDICtx->wdiCachedConfigStaReq));
 
   /*-------------------------------------------------------------------------
-    Send Config STA Request to HAL 
+    Send Config STA Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiConfigSTARspCb, pEventData->pUserData, WDI_CONFIG_STA_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiConfigSTARspCb, pEventData->pUserData, WDI_CONFIG_STA_RESP);
 }/*WDI_ProcessConfigStaReq*/
 
 
 /**
- @brief Process Set Link State Request function (called when 
+ @brief Process Set Link State Request function (called when
         Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessSetLinkStateReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_SetLinkReqParamsType*    pwdiSetLinkParams;
   WDI_SetLinkStateRspCb        wdiSetLinkRspCb;
-  wpt_uint8                    ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                    ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*          pBSSSes             = NULL;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
   WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS;
-  tLinkStateParams             halLinkStateReqMsg; 
+  tLinkStateParams             halLinkStateReqMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -10270,58 +10471,60 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiSetLinkParams = (WDI_SetLinkReqParamsType*)pEventData->pEventData;
   wdiSetLinkRspCb   = (WDI_SetLinkStateRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
-                           pwdiSetLinkParams->wdiLinkInfo.macBSSID, 
-                          &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx,
+                           pwdiSetLinkParams->wdiLinkInfo.macBSSID,
+                          &pBSSSes);
 
-  if ( NULL == pBSSSes ) 
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
-              "Set link request received outside association session");
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+     "%s: Set link request received outside association session. macBSSID " MAC_ADDRESS_STR, 
+     __func__, MAC_ADDR_ARRAY(pwdiSetLinkParams->wdiLinkInfo.macBSSID));
   }
   else
   {
     /*------------------------------------------------------------------------
       Check if this BSS is being currently processed or queued,
-      if queued - queue the new request as well 
+      if queued - queue the new request as well
     ------------------------------------------------------------------------*/
     if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
     {
-      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-                "Association sequence for this BSS exists but currently queued");
-  
-      wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+                "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR, 
+                __func__, MAC_ADDR_ARRAY(pwdiSetLinkParams->wdiLinkInfo.macBSSID));
+
+      wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
       wpalMutexRelease(&pWDICtx->wptMutex);
-      return wdiStatus; 
+      return wdiStatus;
     }
   }
   /* If the link is set to enter IDLE - the Session allocated for this BSS
      will be deleted on the Set Link State response coming from HAL
    - cache the request for response processing */
-  wpalMemoryCopy(&pWDICtx->wdiCacheSetLinkStReq, pwdiSetLinkParams, 
+  wpalMemoryCopy(&pWDICtx->wdiCacheSetLinkStReq, pwdiSetLinkParams,
                  sizeof(pWDICtx->wdiCacheSetLinkStReq));
 
   wpalMutexRelease(&pWDICtx->wptMutex);
   /*-----------------------------------------------------------------------
     Get message buffer
-    ! TO DO : proper conversion into the HAL Message Request Format 
+    ! TO DO : proper conversion into the HAL Message Request Format
   -----------------------------------------------------------------------*/
-  
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_LINK_ST_REQ, 
+
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_LINK_ST_REQ,
                         sizeof(halLinkStateReqMsg),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halLinkStateReqMsg) )))
@@ -10330,7 +10533,7 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiSetLinkParams, wdiSetLinkRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wpalMemoryCopy(halLinkStateReqMsg.bssid,
@@ -10339,55 +10542,55 @@
   wpalMemoryCopy(halLinkStateReqMsg.selfMacAddr,
                  pwdiSetLinkParams->wdiLinkInfo.macSelfStaMacAddr, WDI_MAC_ADDR_LEN);
 
-  halLinkStateReqMsg.state = 
+  halLinkStateReqMsg.state =
      WDI_2_HAL_LINK_STATE(pwdiSetLinkParams->wdiLinkInfo.wdiLinkState);
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halLinkStateReqMsg, 
-                  sizeof(halLinkStateReqMsg)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halLinkStateReqMsg,
+                  sizeof(halLinkStateReqMsg));
 
   pWDICtx->wdiReqStatusCB     = pwdiSetLinkParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiSetLinkParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiSetLinkParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Set Link State Request to HAL 
+    Send Set Link State Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiSetLinkRspCb, pEventData->pUserData, WDI_SET_LINK_ST_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiSetLinkRspCb, pEventData->pUserData, WDI_SET_LINK_ST_RESP);
 }/*WDI_ProcessSetLinkStateReq*/
 
 
 /**
  @brief Process Get Stats Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessGetStatsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_GetStatsReqParamsType*   pwdiGetStatsParams;
   WDI_GetStatsRspCb            wdiGetStatsRspCb;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
-  wpt_uint8                    ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                    ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*          pBSSSes             = NULL;
   wpt_macAddr                  macBSSID;
-  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS;
   tHalStatsReqMsg              halStatsReqMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData) ||
       ( NULL == pEventData->pCBfnc ) )
@@ -10395,7 +10598,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiGetStatsParams = (WDI_GetStatsReqParamsType*)pEventData->pEventData;
@@ -10403,45 +10606,47 @@
 
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                        pwdiGetStatsParams->wdiGetStatsParamsInfo.ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                        pwdiGetStatsParams->wdiGetStatsParamsInfo.ucSTAIdx,
                         &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
-  if ( NULL == pBSSSes ) 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+        "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+        __func__, MAC_ADDR_ARRAY(macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
@@ -10450,7 +10655,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_GET_STATS_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_GET_STATS_REQ,
                         sizeof(halStatsReqMsg.statsReqParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halStatsReqMsg.statsReqParams) )))
@@ -10459,40 +10664,40 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiGetStatsParams, wdiGetStatsRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  halStatsReqMsg.statsReqParams.staId = 
+  halStatsReqMsg.statsReqParams.staId =
                   pwdiGetStatsParams->wdiGetStatsParamsInfo.ucSTAIdx;
-  halStatsReqMsg.statsReqParams.statsMask = 
+  halStatsReqMsg.statsReqParams.statsMask =
                   pwdiGetStatsParams->wdiGetStatsParamsInfo.uStatsMask;
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halStatsReqMsg.statsReqParams, 
-                  sizeof(halStatsReqMsg.statsReqParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halStatsReqMsg.statsReqParams,
+                  sizeof(halStatsReqMsg.statsReqParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiGetStatsParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiGetStatsParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiGetStatsParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Get STA Request to HAL 
+    Send Get STA Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiGetStatsRspCb, pEventData->pUserData, WDI_GET_STATS_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiGetStatsRspCb, pEventData->pUserData, WDI_GET_STATS_RESP);
 }/*WDI_ProcessGetStatsReq*/
 
 /**
- @brief Process Update Cfg Request function (called when Main 
+ @brief Process Update Cfg Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessUpdateCfgReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -10500,13 +10705,13 @@
   WDI_UpdateCfgReqParamsType*  pwdiUpdateCfgParams = NULL;
   WDI_UpdateCfgRspCb           wdiUpdateCfgRspCb = NULL;
 
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset         = 0;
   wpt_uint16                   usSendSize          = 0;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc))
@@ -10514,7 +10719,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiUpdateCfgParams = (WDI_UpdateCfgReqParamsType*)pEventData->pEventData;
@@ -10522,10 +10727,10 @@
 
   /*-----------------------------------------------------------------------
     Get message buffer
-    ! TO DO : proper conversion into the HAL Message Request Format 
+    ! TO DO : proper conversion into the HAL Message Request Format
   -----------------------------------------------------------------------*/
 
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPDATE_CFG_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPDATE_CFG_REQ,
                         pwdiUpdateCfgParams->uConfigBufferLen + sizeof(wpt_uint32),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset +  pwdiUpdateCfgParams->uConfigBufferLen)))
@@ -10534,61 +10739,61 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiUpdateCfgParams, wdiUpdateCfgRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &pwdiUpdateCfgParams->uConfigBufferLen, 
-                  sizeof(wpt_uint32)); 
-  wpalMemoryCopy( pSendBuffer+usDataOffset+sizeof(wpt_uint32), 
-                  pwdiUpdateCfgParams->pConfigBuffer, 
-                  pwdiUpdateCfgParams->uConfigBufferLen); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &pwdiUpdateCfgParams->uConfigBufferLen,
+                  sizeof(wpt_uint32));
+  wpalMemoryCopy( pSendBuffer+usDataOffset+sizeof(wpt_uint32),
+                  pwdiUpdateCfgParams->pConfigBuffer,
+                  pwdiUpdateCfgParams->uConfigBufferLen);
 
   pWDICtx->wdiReqStatusCB     = pwdiUpdateCfgParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiUpdateCfgParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiUpdateCfgParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Update Cfg Request to HAL 
+    Send Update Cfg Request to HAL
   -------------------------------------------------------------------------*/
 
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiUpdateCfgRspCb, pEventData->pUserData, WDI_UPDATE_CFG_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiUpdateCfgRspCb, pEventData->pUserData, WDI_UPDATE_CFG_RESP);
 
 }/*WDI_ProcessUpdateCfgReq*/
 
 
 /**
- @brief Process Add BA Request function (called when Main FSM 
+ @brief Process Add BA Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessAddBAReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_AddBAReqParamsType*  pwdiAddBAParams;
   WDI_AddBARspCb           wdiAddBARspCb;
-  wpt_uint8                ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*      pBSSSes             = NULL;
-  wpt_uint8*               pSendBuffer         = NULL; 
+  wpt_uint8*               pSendBuffer         = NULL;
   wpt_uint16               usDataOffset        = 0;
   wpt_uint16               usSendSize          = 0;
-  WDI_Status               wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status               wdiStatus           = WDI_STATUS_SUCCESS;
   wpt_macAddr              macBSSID;
 
   tAddBAReqMsg             halAddBAReq;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData) ||
@@ -10597,7 +10802,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiAddBAParams = (WDI_AddBAReqParamsType*)pEventData->pEventData;
@@ -10605,45 +10810,47 @@
 
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                                  pwdiAddBAParams->wdiBAInfoType.ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                                  pwdiAddBAParams->wdiBAInfoType.ucSTAIdx,
                                   &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
-  if ( NULL == pBSSSes ) 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+            "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+            __func__, MAC_ADDR_ARRAY(macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
@@ -10651,79 +10858,79 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_ADD_BA_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_ADD_BA_REQ,
                         sizeof(halAddBAReq.addBAParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
-      ( usSendSize < 
+      ( usSendSize <
             (usDataOffset + sizeof(halAddBAReq.addBAParams) )))
   {
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
               "Unable to get send buffer in Add BA req %x %x %x",
                 pEventData, pwdiAddBAParams, wdiAddBARspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  halAddBAReq.addBAParams.baSessionID = 
+  halAddBAReq.addBAParams.baSessionID =
                              pwdiAddBAParams->wdiBAInfoType.ucBaSessionID;
   halAddBAReq.addBAParams.winSize = pwdiAddBAParams->wdiBAInfoType.ucWinSize;
 #ifdef FEATURE_ON_CHIP_REORDERING
-  halAddBAReq.addBAParams.isReorderingDoneOnChip = 
+  halAddBAReq.addBAParams.isReorderingDoneOnChip =
                        pwdiAddBAParams->wdiBAInfoType.bIsReorderingDoneOnChip;
 #endif
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halAddBAReq.addBAParams, 
-                  sizeof(halAddBAReq.addBAParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halAddBAReq.addBAParams,
+                  sizeof(halAddBAReq.addBAParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiAddBAParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiAddBAParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiAddBAParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Start Request to HAL 
+    Send Start Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiAddBARspCb, pEventData->pUserData, 
-                        WDI_ADD_BA_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiAddBARspCb, pEventData->pUserData,
+                        WDI_ADD_BA_RESP);
 }/*WDI_ProcessAddBAReq*/
 
 
 
 /**
- @brief Process Trigger BA Request function (called when Main FSM 
+ @brief Process Trigger BA Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessTriggerBAReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_TriggerBAReqParamsType*  pwdiTriggerBAParams;
   WDI_TriggerBARspCb           wdiTriggerBARspCb;
-  wpt_uint8                    ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                    ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*          pBSSSes             = NULL;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
-  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status                   wdiStatus           = WDI_STATUS_SUCCESS;
   wpt_uint16                   index;
   wpt_macAddr                  macBSSID;
-  
+
   tTriggerBAReqMsg               halTriggerBAReq;
   tTriggerBaReqCandidate*        halTriggerBACandidate;
   WDI_TriggerBAReqCandidateType* wdiTriggerBACandidate;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData ) ||
@@ -10732,52 +10939,54 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiTriggerBAParams = (WDI_TriggerBAReqParamsType*)pEventData->pEventData;
   wdiTriggerBARspCb = (WDI_TriggerBARspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                                  pwdiTriggerBAParams->wdiTriggerBAInfoType.ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                                  pwdiTriggerBAParams->wdiTriggerBAInfoType.ucSTAIdx,
                                   &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
-  if ( NULL == pBSSSes ) 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+        "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+        __func__, MAC_ADDR_ARRAY(macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR, 
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
 
@@ -10785,39 +10994,39 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, 
-                  WDI_TRIGGER_BA_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+                  WDI_TRIGGER_BA_REQ,
                   sizeof(halTriggerBAReq.triggerBAParams) +
-                  (sizeof(tTriggerBaReqCandidate) * 
+                  (sizeof(tTriggerBaReqCandidate) *
                   pwdiTriggerBAParams->wdiTriggerBAInfoType.usBACandidateCnt),
                   &pSendBuffer, &usDataOffset, &usSendSize))||
-      ( usSendSize < 
+      ( usSendSize <
             (usDataOffset + sizeof(halTriggerBAReq.triggerBAParams)+
-               (sizeof(tTriggerBaReqCandidate) * 
+               (sizeof(tTriggerBaReqCandidate) *
                pwdiTriggerBAParams->wdiTriggerBAInfoType.usBACandidateCnt) )))
   {
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
               "Unable to get send buffer in Trigger BA req %x %x %x",
                 pEventData, pwdiTriggerBAParams, wdiTriggerBARspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  halTriggerBAReq.triggerBAParams.baSessionID = 
+  halTriggerBAReq.triggerBAParams.baSessionID =
                   pwdiTriggerBAParams->wdiTriggerBAInfoType.ucBASessionID;
-  halTriggerBAReq.triggerBAParams.baCandidateCnt = 
+  halTriggerBAReq.triggerBAParams.baCandidateCnt =
                   pwdiTriggerBAParams->wdiTriggerBAInfoType.usBACandidateCnt;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halTriggerBAReq.triggerBAParams, 
-                  sizeof(halTriggerBAReq.triggerBAParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halTriggerBAReq.triggerBAParams,
+                  sizeof(halTriggerBAReq.triggerBAParams));
 
-  wdiTriggerBACandidate = 
+  wdiTriggerBACandidate =
     (WDI_TriggerBAReqCandidateType*)(pwdiTriggerBAParams + 1);
   halTriggerBACandidate = (tTriggerBaReqCandidate*)(pSendBuffer+usDataOffset+
                                  sizeof(halTriggerBAReq.triggerBAParams));
-  
-  for(index = 0 ; index < halTriggerBAReq.triggerBAParams.baCandidateCnt ; 
+
+  for(index = 0 ; index < halTriggerBAReq.triggerBAParams.baCandidateCnt ;
                                                                      index++)
   {
     halTriggerBACandidate->staIdx = wdiTriggerBACandidate->ucSTAIdx;
@@ -10827,14 +11036,14 @@
   }
 
   pWDICtx->wdiReqStatusCB     = pwdiTriggerBAParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiTriggerBAParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiTriggerBAParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Start Request to HAL 
+    Send Start Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiTriggerBARspCb, pEventData->pUserData, 
-                        WDI_TRIGGER_BA_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiTriggerBARspCb, pEventData->pUserData,
+                        WDI_TRIGGER_BA_RESP);
 }/*WDI_ProcessTriggerBAReq*/
 
 
@@ -10842,30 +11051,30 @@
 /**
  @brief Process Update Beacon Params  Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessUpdateBeaconParamsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_UpdateBeaconParamsType*  pwdiUpdateBeaconParams;
   WDI_UpdateBeaconParamsRspCb  wdiUpdateBeaconParamsRspCb;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
-  tUpdateBeaconParams          halUpdateBeaconParams; 
+  tUpdateBeaconParams          halUpdateBeaconParams;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData) ||
@@ -10874,7 +11083,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiUpdateBeaconParams = (WDI_UpdateBeaconParamsType*)pEventData->pEventData;
@@ -10882,7 +11091,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPD_BCON_PRMS_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPD_BCON_PRMS_REQ,
                         sizeof(halUpdateBeaconParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halUpdateBeaconParams) )))
@@ -10891,7 +11100,7 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiUpdateBeaconParams, wdiUpdateBeaconParamsRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*BSS Index of the BSS*/
@@ -10899,44 +11108,44 @@
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucBssIdx;
   /*shortPreamble mode. HAL should update all the STA rates when it
     receives this message*/
-  halUpdateBeaconParams.fShortPreamble = 
+  halUpdateBeaconParams.fShortPreamble =
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortPreamble;
   /* short Slot time.*/
-  halUpdateBeaconParams.fShortSlotTime = 
+  halUpdateBeaconParams.fShortSlotTime =
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortSlotTime;
   /* Beacon Interval */
-  halUpdateBeaconParams.beaconInterval = 
+  halUpdateBeaconParams.beaconInterval =
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usBeaconInterval;
 
   /*Protection related */
-  halUpdateBeaconParams.llaCoexist = 
+  halUpdateBeaconParams.llaCoexist =
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllaCoexist;
-  halUpdateBeaconParams.llbCoexist = 
+  halUpdateBeaconParams.llbCoexist =
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllbCoexist;
-  halUpdateBeaconParams.llgCoexist = 
+  halUpdateBeaconParams.llgCoexist =
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllgCoexist;
-  halUpdateBeaconParams.ht20MhzCoexist  = 
+  halUpdateBeaconParams.ht20MhzCoexist  =
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucHt20MhzCoexist;
-  halUpdateBeaconParams.llnNonGFCoexist = 
+  halUpdateBeaconParams.llnNonGFCoexist =
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllnNonGFCoexist;
-  halUpdateBeaconParams.fLsigTXOPProtectionFullSupport = 
+  halUpdateBeaconParams.fLsigTXOPProtectionFullSupport =
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfLsigTXOPProtectionFullSupport;
   halUpdateBeaconParams.fRIFSMode =
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfRIFSMode;
-  halUpdateBeaconParams.paramChangeBitmap = 
+  halUpdateBeaconParams.paramChangeBitmap =
     pwdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usChangeBitmap;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, &halUpdateBeaconParams, 
-                  sizeof(halUpdateBeaconParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset, &halUpdateBeaconParams,
+                  sizeof(halUpdateBeaconParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiUpdateBeaconParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiUpdateBeaconParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiUpdateBeaconParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Del TS Request to HAL 
+    Send Del TS Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiUpdateBeaconParamsRspCb, pEventData->pUserData, WDI_UPD_BCON_PRMS_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiUpdateBeaconParamsRspCb, pEventData->pUserData, WDI_UPD_BCON_PRMS_RESP);
 }/*WDI_ProcessUpdateBeaconParamsReq*/
 
 
@@ -10944,30 +11153,30 @@
 /**
  @brief Process Send Beacon template  Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessSendBeaconParamsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_SendBeaconParamsType*    pwdiSendBeaconParams;
   WDI_SendBeaconParamsRspCb    wdiSendBeaconParamsRspCb;
-  wpt_uint8*                   pSendBuffer         = NULL; 
+  wpt_uint8*                   pSendBuffer         = NULL;
   wpt_uint16                   usDataOffset        = 0;
   wpt_uint16                   usSendSize          = 0;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   tSendBeaconReqMsg            halSendBeaconReq;
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData ) ||
@@ -10976,7 +11185,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiSendBeaconParams = (WDI_SendBeaconParamsType*)pEventData->pEventData;
@@ -10984,7 +11193,7 @@
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SND_BCON_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SND_BCON_REQ,
                         sizeof(halSendBeaconReq.sendBeaconParam),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halSendBeaconReq.sendBeaconParam) )))
@@ -10993,67 +11202,67 @@
               "Unable to get send buffer in send beacon req %x %x %x",
                 pEventData, pwdiSendBeaconParams, wdiSendBeaconParamsRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wpalMemoryCopy(halSendBeaconReq.sendBeaconParam.bssId,
                   pwdiSendBeaconParams->wdiSendBeaconParamsInfo.macBSSID,
                   WDI_MAC_ADDR_LEN);
-  halSendBeaconReq.sendBeaconParam.beaconLength = 
+  halSendBeaconReq.sendBeaconParam.beaconLength =
                   pwdiSendBeaconParams->wdiSendBeaconParamsInfo.beaconLength;
   wpalMemoryCopy(halSendBeaconReq.sendBeaconParam.beacon,
                   pwdiSendBeaconParams->wdiSendBeaconParamsInfo.beacon,
                   pwdiSendBeaconParams->wdiSendBeaconParamsInfo.beaconLength);
 #ifdef WLAN_SOFTAP_FEATURE
-  halSendBeaconReq.sendBeaconParam.timIeOffset = 
+  halSendBeaconReq.sendBeaconParam.timIeOffset =
                   pwdiSendBeaconParams->wdiSendBeaconParamsInfo.timIeOffset;
 #endif
 #ifdef WLAN_FEATURE_P2P
-  halSendBeaconReq.sendBeaconParam.p2pIeOffset = 
+  halSendBeaconReq.sendBeaconParam.p2pIeOffset =
                   pwdiSendBeaconParams->wdiSendBeaconParamsInfo.usP2PIeOffset;
 #endif
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halSendBeaconReq.sendBeaconParam, 
-                  sizeof(halSendBeaconReq.sendBeaconParam)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halSendBeaconReq.sendBeaconParam,
+                  sizeof(halSendBeaconReq.sendBeaconParam));
 
   pWDICtx->wdiReqStatusCB     = pwdiSendBeaconParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiSendBeaconParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiSendBeaconParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Del TS Request to HAL 
+    Send Del TS Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiSendBeaconParamsRspCb, pEventData->pUserData, WDI_SND_BCON_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiSendBeaconParamsRspCb, pEventData->pUserData, WDI_SND_BCON_RESP);
 }/*WDI_ProcessSendBeaconParamsReq*/
 
 /**
  @brief Process Update Beacon Params  Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessUpdateProbeRspTemplateReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_UpdateProbeRspTemplateParamsType*  pwdiUpdateProbeRespTmplParams;
   WDI_UpdateProbeRspTemplateRspCb        wdiUpdateProbeRespTmplRspCb;
-  wpt_uint8*                             pSendBuffer         = NULL; 
+  wpt_uint8*                             pSendBuffer         = NULL;
   wpt_uint16                             usDataOffset        = 0;
   wpt_uint16                             usSendSize          = 0;
-  tSendProbeRespReqParams                halUpdateProbeRspTmplParams; 
+  tSendProbeRespReqParams                halUpdateProbeRspTmplParams;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData) ||
@@ -11062,17 +11271,17 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  pwdiUpdateProbeRespTmplParams = 
+  pwdiUpdateProbeRespTmplParams =
     (WDI_UpdateProbeRspTemplateParamsType*)pEventData->pEventData;
-  wdiUpdateProbeRespTmplRspCb = 
+  wdiUpdateProbeRespTmplRspCb =
     (WDI_UpdateProbeRspTemplateRspCb)pEventData->pCBfnc;
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPD_PROBE_RSP_TEMPLATE_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPD_PROBE_RSP_TEMPLATE_REQ,
                         sizeof(halUpdateProbeRspTmplParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halUpdateProbeRspTmplParams) )))
@@ -11081,53 +11290,53 @@
               "Unable to get send buffer in set bss key req %x %x %x",
      pEventData, pwdiUpdateProbeRespTmplParams, wdiUpdateProbeRespTmplRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wpalMemoryCopy(halUpdateProbeRspTmplParams.bssId,
-                 pwdiUpdateProbeRespTmplParams->wdiProbeRspTemplateInfo.macBSSID, 
+                 pwdiUpdateProbeRespTmplParams->wdiProbeRspTemplateInfo.macBSSID,
                  WDI_MAC_ADDR_LEN);
 
-  halUpdateProbeRspTmplParams.probeRespTemplateLen = 
+  halUpdateProbeRspTmplParams.probeRespTemplateLen =
     pwdiUpdateProbeRespTmplParams->wdiProbeRspTemplateInfo.uProbeRespTemplateLen;
 
   wpalMemoryCopy(halUpdateProbeRspTmplParams.pProbeRespTemplate,
     pwdiUpdateProbeRespTmplParams->wdiProbeRspTemplateInfo.pProbeRespTemplate,
-                 BEACON_TEMPLATE_SIZE);     
+                 BEACON_TEMPLATE_SIZE);
 
 
   wpalMemoryCopy(halUpdateProbeRspTmplParams.ucProxyProbeReqValidIEBmap,
            pwdiUpdateProbeRespTmplParams->wdiProbeRspTemplateInfo.uaProxyProbeReqValidIEBmap,
                  WDI_PROBE_REQ_BITMAP_IE_LEN);
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halUpdateProbeRspTmplParams, 
-                  sizeof(halUpdateProbeRspTmplParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halUpdateProbeRspTmplParams,
+                  sizeof(halUpdateProbeRspTmplParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiUpdateProbeRespTmplParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiUpdateProbeRespTmplParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiUpdateProbeRespTmplParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Update Probe Resp Template Request to HAL 
+    Send Update Probe Resp Template Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiUpdateProbeRespTmplRspCb, pEventData->pUserData, 
-                       WDI_UPD_PROBE_RSP_TEMPLATE_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiUpdateProbeRespTmplRspCb, pEventData->pUserData,
+                       WDI_UPD_PROBE_RSP_TEMPLATE_RESP);
 }/*WDI_ProcessUpdateProbeRspTemplateReq*/
 
 /**
- @brief Process NV blob download function (called when Main FSM 
+ @brief Process NV blob download function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessNvDownloadReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -11137,30 +11346,30 @@
   WDI_NvDownloadRspCb      wdiNvDownloadRspCb = NULL;
 
   /*-------------------------------------------------------------------------
-     Sanity check       
+     Sanity check
    -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
-      ( NULL == (pwdiNvDownloadReqParams = 
+      ( NULL == (pwdiNvDownloadReqParams =
                  (WDI_NvDownloadReqParamsType*)pEventData->pEventData)) ||
-      ( NULL == (wdiNvDownloadRspCb = 
+      ( NULL == (wdiNvDownloadRspCb =
                 (WDI_NvDownloadRspCb)pEventData->pCBfnc)))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
     WDI_ASSERT(0);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   /*Intialize the Nv Blob Info */
-  pWDICtx->wdiNvBlobInfo.usTotalFragment = 
+  pWDICtx->wdiNvBlobInfo.usTotalFragment =
                 TOTALFRAGMENTS(pwdiNvDownloadReqParams->wdiBlobInfo.uBlobSize);
 
   /*cache the wdi nv request message here if the the first fragment
    * To issue the request to HAL for the next fragment */
   if( 0 == pWDICtx->wdiNvBlobInfo.usCurrentFragment)
   {
-    wpalMemoryCopy(&pWDICtx->wdiCachedNvDownloadReq, 
-                 pwdiNvDownloadReqParams, 
+    wpalMemoryCopy(&pWDICtx->wdiCachedNvDownloadReq,
+                 pwdiNvDownloadReqParams,
                  sizeof(pWDICtx->wdiCachedNvDownloadReq)); 
 
     pWDICtx->pfncRspCB = pEventData->pCBfnc;
@@ -11171,12 +11380,12 @@
 }
 
 /**
- @brief Process Set Max Tx Power Request function (called when Main    
+ @brief Process Set Max Tx Power Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
+         pEventData:      pointer to the event information structure
+
  @see
  @return Result of the function call
 */
@@ -11188,14 +11397,14 @@
 {
   WDI_SetMaxTxPowerParamsType*      pwdiSetMaxTxPowerParams = NULL;
   WDA_SetMaxTxPowerRspCb            wdiSetMaxTxPowerRspCb;
-  wpt_uint8*                        pSendBuffer         = NULL; 
+  wpt_uint8*                        pSendBuffer         = NULL;
   wpt_uint16                        usDataOffset        = 0;
   wpt_uint16                        usSendSize          = 0;
   tSetMaxTxPwrReq                   halSetMaxTxPower;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData ) ||
@@ -11204,27 +11413,27 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
-  pwdiSetMaxTxPowerParams = 
+  pwdiSetMaxTxPowerParams =
     (WDI_SetMaxTxPowerParamsType*)pEventData->pEventData;
-  wdiSetMaxTxPowerRspCb = 
+  wdiSetMaxTxPowerRspCb =
     (WDA_SetMaxTxPowerRspCb)pEventData->pCBfnc;
 
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_MAX_TX_POWER_REQ, 
+if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_MAX_TX_POWER_REQ,
                         sizeof(halSetMaxTxPower.setMaxTxPwrParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
-      ( usSendSize < (usDataOffset + sizeof(halSetMaxTxPower.setMaxTxPwrParams) 
+      ( usSendSize < (usDataOffset + sizeof(halSetMaxTxPower.setMaxTxPwrParams)
 )))
   {
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_ERROR,
               "Unable to get Set Max Tx Power req %x %x %x",
                 pEventData, pwdiSetMaxTxPowerParams, wdiSetMaxTxPowerRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wpalMemoryCopy(halSetMaxTxPower.setMaxTxPwrParams.bssId,
@@ -11234,23 +11443,23 @@
   wpalMemoryCopy(halSetMaxTxPower.setMaxTxPwrParams.selfStaMacAddr,
                   pwdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macSelfStaMacAddr,
                   WDI_MAC_ADDR_LEN);
-  halSetMaxTxPower.setMaxTxPwrParams.power = 
+  halSetMaxTxPower.setMaxTxPwrParams.power =
                   pwdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.ucPower;
-  
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halSetMaxTxPower.setMaxTxPwrParams, 
-                  sizeof(halSetMaxTxPower.setMaxTxPwrParams)); 
+
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halSetMaxTxPower.setMaxTxPwrParams,
+                  sizeof(halSetMaxTxPower.setMaxTxPwrParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiSetMaxTxPowerParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiSetMaxTxPowerParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiSetMaxTxPowerParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Del TS Request to HAL 
+    Send Del TS Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiSetMaxTxPowerRspCb, pEventData->pUserData, 
-                                                      WDI_SET_MAX_TX_POWER_RESP); 
-  
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiSetMaxTxPowerRspCb, pEventData->pUserData,
+                                                      WDI_SET_MAX_TX_POWER_RESP);
+
 }
 
 #ifdef WLAN_FEATURE_P2P
@@ -11258,30 +11467,30 @@
 /**
  @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 
-  
+
+ @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_ProcessP2PGONOAReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_SetP2PGONOAReqParamsType*          pwdiP2PGONOAReqParams;
   WDI_SetP2PGONOAReqParamsRspCb          wdiP2PGONOAReqRspCb;
-  wpt_uint8*                             pSendBuffer         = NULL; 
+  wpt_uint8*                             pSendBuffer         = NULL;
   wpt_uint16                             usDataOffset        = 0;
   wpt_uint16                             usSendSize          = 0;
-  tSetP2PGONOAParams                     halSetP2PGONOAParams; 
+  tSetP2PGONOAParams                     halSetP2PGONOAParams;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData) ||
@@ -11290,18 +11499,18 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  pwdiP2PGONOAReqParams = 
+  pwdiP2PGONOAReqParams =
     (WDI_SetP2PGONOAReqParamsType*)pEventData->pEventData;
-  wdiP2PGONOAReqRspCb = 
+  wdiP2PGONOAReqRspCb =
     (WDI_SetP2PGONOAReqParamsRspCb)pEventData->pCBfnc;
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, 
-                        WDI_P2P_GO_NOTICE_OF_ABSENCE_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+                        WDI_P2P_GO_NOTICE_OF_ABSENCE_REQ,
                         sizeof(halSetP2PGONOAParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halSetP2PGONOAParams) )))
@@ -11310,48 +11519,48 @@
               "Unable to get send buffer in set P2P GO NOA REQ %x %x %x",
      pEventData, pwdiP2PGONOAReqParams, wdiP2PGONOAReqRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  halSetP2PGONOAParams.opp_ps = 
+  halSetP2PGONOAParams.opp_ps =
                            pwdiP2PGONOAReqParams->wdiP2PGONOAInfo.ucOpp_ps;
-  halSetP2PGONOAParams.ctWindow = 
+  halSetP2PGONOAParams.ctWindow =
                            pwdiP2PGONOAReqParams->wdiP2PGONOAInfo.uCtWindow;
   halSetP2PGONOAParams.count = pwdiP2PGONOAReqParams->wdiP2PGONOAInfo.ucCount;
-  halSetP2PGONOAParams.duration = 
+  halSetP2PGONOAParams.duration =
                            pwdiP2PGONOAReqParams->wdiP2PGONOAInfo.uDuration;
-  halSetP2PGONOAParams.interval = 
+  halSetP2PGONOAParams.interval =
                            pwdiP2PGONOAReqParams->wdiP2PGONOAInfo.uInterval;
-  halSetP2PGONOAParams.single_noa_duration = 
+  halSetP2PGONOAParams.single_noa_duration =
                  pwdiP2PGONOAReqParams->wdiP2PGONOAInfo.uSingle_noa_duration;
-  halSetP2PGONOAParams.psSelection = 
+  halSetP2PGONOAParams.psSelection =
                    pwdiP2PGONOAReqParams->wdiP2PGONOAInfo.ucPsSelection;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halSetP2PGONOAParams, 
-                  sizeof(halSetP2PGONOAParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halSetP2PGONOAParams,
+                  sizeof(halSetP2PGONOAParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiP2PGONOAReqParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiP2PGONOAReqParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiP2PGONOAReqParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Update Probe Resp Template Request to HAL 
+    Send Update Probe Resp Template Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiP2PGONOAReqRspCb, pEventData->pUserData, 
-                       WDI_P2P_GO_NOTICE_OF_ABSENCE_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiP2PGONOAReqRspCb, pEventData->pUserData,
+                       WDI_P2P_GO_NOTICE_OF_ABSENCE_RESP);
 }/*WDI_ProcessP2PGONOAReq*/
 
 #endif
 
 
 /**
- @brief    Function to handle the ack from DXE once the power 
+ @brief    Function to handle the ack from DXE once the power
            state is set.
- @param    None 
-    
- @see 
- @return void 
+ @param    None
+
+ @see
+ @return void
 */
 void
 WDI_SetPowerStateCb
@@ -11368,17 +11577,17 @@
    {
       //it shouldn't happen, put an error msg
    }
-   /* 
-    * Trigger the event to bring the Enter BMPS req function to come 
-    * out of wait 
+   /*
+    * Trigger the event to bring the Enter BMPS req function to come
+    * out of wait
 */
    if( NULL != pContext )
    {
-      pCB = (WDI_ControlBlockType *)pContext; 
+      pCB = (WDI_ControlBlockType *)pContext;
    }
    else
    {
-      //put an error msg 
+      //put an error msg
       pCB = &gWDICb;
    }
    pCB->dxePhyAddr = dxePhyAddr;
@@ -11388,38 +11597,38 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "Failed to set an event");
 
-      WDI_ASSERT(0); 
+      WDI_ASSERT(0);
    }
    return;
 }
 
 
 /**
- @brief Process Enter IMPS Request function (called when 
+ @brief Process Enter IMPS Request function (called when
         Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessEnterImpsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    wpt_status               wptStatus; 
    WDI_EnterImpsRspCb       wdiEnterImpsRspCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (wdiEnterImpsRspCb   = (WDI_EnterImpsRspCb)pEventData->pCBfnc)))
@@ -11427,14 +11636,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_ENTER_IMPS_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_ENTER_IMPS_REQ,
                                                      0,
                                                      &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset )))
@@ -11443,7 +11652,7 @@
                "Unable to get send buffer in Enter IMPS req %x %x",
                  pEventData, wdiEnterImpsRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /* Reset the event to be not signalled */
@@ -11453,7 +11662,7 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "WDI Init failed to reset an event");
 
-      WDI_ASSERT(0); 
+      WDI_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
 
@@ -11461,7 +11670,7 @@
    WDTS_SetPowerState(pWDICtx, WDTS_POWER_STATE_IMPS, WDI_SetPowerStateCb);
 
    /*
-    * Wait for the event to be set once the ACK comes back from DXE 
+    * Wait for the event to be set once the ACK comes back from DXE
     */
    wptStatus = wpalEventWait(&pWDICtx->setPowerStateEvent, 
                              WDI_SET_POWER_STATE_TIMEOUT);
@@ -11470,42 +11679,42 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "WDI Init failed to wait on an event");
 
-      WDI_ASSERT(0); 
+      WDI_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiEnterImpsRspCb, pEventData->pUserData, WDI_ENTER_IMPS_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiEnterImpsRspCb, pEventData->pUserData, WDI_ENTER_IMPS_RESP);
 }/*WDI_ProcessEnterImpsReq*/
 
 /**
- @brief Process Exit IMPS Request function (called when 
+ @brief Process Exit IMPS Request function (called when
         Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessExitImpsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_ExitImpsRspCb        wdiExitImpsRspCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (wdiExitImpsRspCb   = (WDI_ExitImpsRspCb)pEventData->pCBfnc)))
@@ -11513,14 +11722,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_EXIT_IMPS_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_EXIT_IMPS_REQ,
                                                      0,
                                                      &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset )))
@@ -11529,36 +11738,36 @@
                "Unable to get send buffer in Exit IMPS req %x %x",
                  pEventData, wdiExitImpsRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiExitImpsRspCb, pEventData->pUserData, WDI_EXIT_IMPS_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiExitImpsRspCb, pEventData->pUserData, WDI_EXIT_IMPS_RESP);
 }/*WDI_ProcessExitImpsReq*/
 
 /**
- @brief Process Enter BMPS Request function (called when Main 
+ @brief Process Enter BMPS Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessEnterBmpsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_EnterBmpsReqParamsType*  pwdiEnterBmpsReqParams = NULL;
    WDI_EnterBmpsRspCb           wdiEnterBmpsRspCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    tHalEnterBmpsReqParams   enterBmpsReq;
@@ -11567,7 +11776,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
   -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiEnterBmpsReqParams = (WDI_EnterBmpsReqParamsType*)pEventData->pEventData)) ||
@@ -11576,14 +11785,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_ENTER_BMPS_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_ENTER_BMPS_REQ,
                          sizeof(enterBmpsReq),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(enterBmpsReq) )))
@@ -11592,7 +11801,7 @@
                "Unable to get send buffer in Enter BMPS req %x %x %x",
                  pEventData, pwdiEnterBmpsReqParams, wdiEnterBmpsRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /* Reset the event to be not signalled */
@@ -11602,7 +11811,7 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "WDI Init failed to reset an event");
 
-      WDI_ASSERT(0); 
+      WDI_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
 
@@ -11610,7 +11819,7 @@
    WDTS_SetPowerState(pWDICtx, WDTS_POWER_STATE_BMPS, WDI_SetPowerStateCb);
 
 /*
-    * Wait for the event to be set once the ACK comes back from DXE 
+    * Wait for the event to be set once the ACK comes back from DXE
     */
    wptStatus = wpalEventWait(&pWDICtx->setPowerStateEvent, 
                              WDI_SET_POWER_STATE_TIMEOUT);
@@ -11619,7 +11828,7 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "WDI Init failed to wait on an event");
 
-      WDI_ASSERT(0); 
+      WDI_ASSERT(0);
       return VOS_STATUS_E_FAILURE;
    }
 
@@ -11640,42 +11849,42 @@
                    sizeof(enterBmpsReq)); 
 
    pWDICtx->wdiReqStatusCB     = pwdiEnterBmpsReqParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiEnterBmpsReqParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiEnterBmpsReqParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiEnterBmpsRspCb, pEventData->pUserData, WDI_ENTER_BMPS_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiEnterBmpsRspCb, pEventData->pUserData, WDI_ENTER_BMPS_RESP);
 }/*WDI_ProcessEnterBmpsReq*/
 
 /**
  @brief Process Exit BMPS Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessExitBmpsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_ExitBmpsReqParamsType*  pwdiExitBmpsReqParams = NULL;
    WDI_ExitBmpsRspCb           wdiExitBmpsRspCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    tHalExitBmpsReqParams    exitBmpsReq;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiExitBmpsReqParams = (WDI_ExitBmpsReqParamsType*)pEventData->pEventData)) ||
@@ -11684,14 +11893,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_EXIT_BMPS_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_EXIT_BMPS_REQ,
                          sizeof(exitBmpsReq),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(exitBmpsReq) )))
@@ -11700,51 +11909,53 @@
                "Unable to get send buffer in Exit BMPS req %x %x %x",
                  pEventData, pwdiExitBmpsReqParams, wdiExitBmpsRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
    exitBmpsReq.sendDataNull = pwdiExitBmpsReqParams->wdiExitBmpsInfo.ucSendDataNull;
 
+   exitBmpsReq.bssIdx = pwdiExitBmpsReqParams->wdiExitBmpsInfo.bssIdx;
+
    wpalMemoryCopy( pSendBuffer+usDataOffset, 
                    &exitBmpsReq, 
                    sizeof(exitBmpsReq)); 
 
    pWDICtx->wdiReqStatusCB     = pwdiExitBmpsReqParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiExitBmpsReqParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiExitBmpsReqParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiExitBmpsRspCb, pEventData->pUserData, WDI_EXIT_BMPS_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiExitBmpsRspCb, pEventData->pUserData, WDI_EXIT_BMPS_RESP);
 }/*WDI_ProcessExitBmpsReq*/
 
 /**
- @brief Process Enter UAPSD Request function (called when Main 
+ @brief Process Enter UAPSD Request function (called when Main
         FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessEnterUapsdReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_EnterUapsdReqParamsType*  pwdiEnterUapsdReqParams = NULL;
    WDI_EnterUapsdRspCb           wdiEnterUapsdRspCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    tUapsdReqParams          enterUapsdReq;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiEnterUapsdReqParams = (WDI_EnterUapsdReqParamsType*)pEventData->pEventData)) ||
@@ -11753,14 +11964,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_ENTER_UAPSD_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_ENTER_UAPSD_REQ,
                          sizeof(enterUapsdReq),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(enterUapsdReq) )))
@@ -11769,7 +11980,7 @@
                "Unable to get send buffer in Enter UAPSD req %x %x %x",
                  pEventData, pwdiEnterUapsdReqParams, wdiEnterUapsdRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    enterUapsdReq.beDeliveryEnabled  = pwdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeDeliveryEnabled;
@@ -11780,46 +11991,47 @@
    enterUapsdReq.viTriggerEnabled   = pwdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViTriggerEnabled;
    enterUapsdReq.voDeliveryEnabled  = pwdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoDeliveryEnabled;
    enterUapsdReq.voTriggerEnabled   = pwdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoTriggerEnabled;
+   enterUapsdReq.bssIdx             = pwdiEnterUapsdReqParams->wdiEnterUapsdInfo.bssIdx;
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &enterUapsdReq, 
-                   sizeof(enterUapsdReq)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &enterUapsdReq,
+                   sizeof(enterUapsdReq));
 
    pWDICtx->wdiReqStatusCB     = pwdiEnterUapsdReqParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiEnterUapsdReqParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiEnterUapsdReqParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiEnterUapsdRspCb, pEventData->pUserData, WDI_ENTER_UAPSD_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiEnterUapsdRspCb, pEventData->pUserData, WDI_ENTER_UAPSD_RESP);
 }/*WDI_ProcessEnterUapsdReq*/
 
 /**
- @brief Process Exit UAPSD Request function (called when 
+ @brief Process Exit UAPSD Request function (called when
         Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessExitUapsdReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_ExitUapsdRspCb       wdiExitUapsdRspCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (wdiExitUapsdRspCb   = (WDI_ExitUapsdRspCb)pEventData->pCBfnc)))
@@ -11827,14 +12039,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_EXIT_UAPSD_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_EXIT_UAPSD_REQ,
                                                      0,
                                                      &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset )))
@@ -11843,43 +12055,43 @@
                "Unable to get send buffer in Exit UAPSD req %x %x",
                  pEventData, wdiExitUapsdRspCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiExitUapsdRspCb, pEventData->pUserData, WDI_EXIT_UAPSD_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiExitUapsdRspCb, pEventData->pUserData, WDI_EXIT_UAPSD_RESP);
 }/*WDI_ProcessExitUapsdReq*/
 
 /**
- @brief Process Set UAPSD params Request function (called when 
+ @brief Process Set UAPSD params Request function (called when
         Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessSetUapsdAcParamsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_SetUapsdAcParamsReqParamsType*  pwdiSetUapsdAcParams = NULL;
   WDI_SetUapsdAcParamsCb              wdiSetUapsdAcParamsCb = NULL;
-  wpt_uint8*               pSendBuffer         = NULL; 
+  wpt_uint8*               pSendBuffer         = NULL;
   wpt_uint16               usDataOffset        = 0;
   wpt_uint16               usSendSize          = 0;
   tUapsdInfo               uapsdAcParamsReq;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == (pwdiSetUapsdAcParams = (WDI_SetUapsdAcParamsReqParamsType*)pEventData->pEventData)) ||
@@ -11888,14 +12100,14 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-----------------------------------------------------------------------
     Get message buffer
-    ! TO DO : proper conversion into the HAL Message Request Format 
+    ! TO DO : proper conversion into the HAL Message Request Format
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_UAPSD_PARAM_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_UAPSD_PARAM_REQ,
                         sizeof(uapsdAcParamsReq),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(uapsdAcParamsReq) )))
@@ -11904,7 +12116,7 @@
               "Unable to get send buffer in Set UAPSD params req %x %x %x",
                 pEventData, pwdiSetUapsdAcParams, wdiSetUapsdAcParamsCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   uapsdAcParamsReq.ac = pwdiSetUapsdAcParams->wdiUapsdInfo.ucAc;
@@ -11914,46 +12126,46 @@
   uapsdAcParamsReq.srvInterval = pwdiSetUapsdAcParams->wdiUapsdInfo.uSrvInterval;
   uapsdAcParamsReq.susInterval = pwdiSetUapsdAcParams->wdiUapsdInfo.uSusInterval;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &uapsdAcParamsReq, 
-                  sizeof(uapsdAcParamsReq)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &uapsdAcParamsReq,
+                  sizeof(uapsdAcParamsReq));
 
   pWDICtx->wdiReqStatusCB     = pwdiSetUapsdAcParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiSetUapsdAcParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiSetUapsdAcParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Get STA Request to HAL 
+    Send Get STA Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiSetUapsdAcParamsCb, pEventData->pUserData, WDI_SET_UAPSD_PARAM_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiSetUapsdAcParamsCb, pEventData->pUserData, WDI_SET_UAPSD_PARAM_RESP);
 }/*WDI_ProcessSetUapsdAcParamsReq*/
 
 /**
- @brief Process update UAPSD params Request function (called 
+ @brief Process update UAPSD params Request function (called
         when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessUpdateUapsdParamsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_UpdateUapsdReqParamsType*  pwdiUpdateUapsdReqParams = NULL;
    WDI_UpdateUapsdParamsCb        wdiUpdateUapsdParamsCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiUpdateUapsdReqParams = (WDI_UpdateUapsdReqParamsType*)pEventData->pEventData)) ||
@@ -11962,14 +12174,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPDATE_UAPSD_PARAM_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPDATE_UAPSD_PARAM_REQ,
                          sizeof(pwdiUpdateUapsdReqParams->wdiUpdateUapsdInfo),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(pwdiUpdateUapsdReqParams->wdiUpdateUapsdInfo) )))
@@ -11978,43 +12190,43 @@
                "Unable to get send buffer in Update UAPSD params req %x %x %x",
                  pEventData, pwdiUpdateUapsdReqParams, wdiUpdateUapsdParamsCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &pwdiUpdateUapsdReqParams->wdiUpdateUapsdInfo, 
-                   sizeof(pwdiUpdateUapsdReqParams->wdiUpdateUapsdInfo)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &pwdiUpdateUapsdReqParams->wdiUpdateUapsdInfo,
+                   sizeof(pwdiUpdateUapsdReqParams->wdiUpdateUapsdInfo));
 
    pWDICtx->wdiReqStatusCB     = pwdiUpdateUapsdReqParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiUpdateUapsdReqParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiUpdateUapsdReqParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiUpdateUapsdParamsCb, pEventData->pUserData, WDI_UPDATE_UAPSD_PARAM_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiUpdateUapsdParamsCb, pEventData->pUserData, WDI_UPDATE_UAPSD_PARAM_RESP);
 }/*WDI_ProcessUpdateUapsdParamsReq*/
 
 /**
- @brief Process Configure RXP filter Request function (called 
+ @brief Process Configure RXP filter Request function (called
         when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessConfigureRxpFilterReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_ConfigureRxpFilterReqParamsType*  pwdiRxpFilterParams = NULL;
   WDI_ConfigureRxpFilterCb              wdiConfigureRxpFilterCb = NULL;
-  wpt_uint8*               pSendBuffer         = NULL; 
+  wpt_uint8*               pSendBuffer         = NULL;
   wpt_uint16               usDataOffset        = 0;
   wpt_uint16               usSendSize          = 0;
   tHalConfigureRxpFilterReqParams     halRxpFilterParams;
@@ -12022,7 +12234,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == (pwdiRxpFilterParams = (WDI_ConfigureRxpFilterReqParamsType*)pEventData->pEventData)) ||
@@ -12031,13 +12243,13 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
    /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_CONFIGURE_RXP_FILTER_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_CONFIGURE_RXP_FILTER_REQ,
                         sizeof(halRxpFilterParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(halRxpFilterParams) )))
@@ -12046,54 +12258,54 @@
               "Unable to get send buffer in Set UAPSD params req %x %x %x",
                 pEventData, pwdiRxpFilterParams, wdiConfigureRxpFilterCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  halRxpFilterParams.setMcstBcstFilterSetting = 
+  halRxpFilterParams.setMcstBcstFilterSetting =
       pwdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilterSetting;
-  halRxpFilterParams.setMcstBcstFilter = 
+  halRxpFilterParams.setMcstBcstFilter =
       pwdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilter;
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halRxpFilterParams, 
-                  sizeof(halRxpFilterParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halRxpFilterParams,
+                  sizeof(halRxpFilterParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiRxpFilterParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiRxpFilterParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiRxpFilterParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Get STA Request to HAL 
+    Send Get STA Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                       wdiConfigureRxpFilterCb, pEventData->pUserData, WDI_CONFIGURE_RXP_FILTER_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiConfigureRxpFilterCb, pEventData->pUserData, WDI_CONFIGURE_RXP_FILTER_RESP);
 }/*WDI_ProcessConfigureRxpFilterReq*/
 
 /**
- @brief Process set beacon filter Request function (called 
+ @brief Process set beacon filter Request function (called
         when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessSetBeaconFilterReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_BeaconFilterReqParamsType*  pwdiBeaconFilterParams = NULL;
    WDI_SetBeaconFilterCb           wdiBeaconFilterCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiBeaconFilterParams = (WDI_BeaconFilterReqParamsType*)pEventData->pEventData)) ||
@@ -12102,14 +12314,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_BEACON_FILTER_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_BEACON_FILTER_REQ,
                          sizeof(pwdiBeaconFilterParams->wdiBeaconFilterInfo) + pwdiBeaconFilterParams->wdiBeaconFilterInfo.usIeNum * sizeof(tBeaconFilterIe),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(pwdiBeaconFilterParams->wdiBeaconFilterInfo) )))
@@ -12118,52 +12330,52 @@
                "Unable to get send buffer in Set beacon filter req %x %x %x",
                  pEventData, pwdiBeaconFilterParams, wdiBeaconFilterCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &pwdiBeaconFilterParams->wdiBeaconFilterInfo, 
-                   sizeof(pwdiBeaconFilterParams->wdiBeaconFilterInfo)); 
-   wpalMemoryCopy( pSendBuffer+usDataOffset+sizeof(pwdiBeaconFilterParams->wdiBeaconFilterInfo), 
-                   &pwdiBeaconFilterParams->aFilters[0], 
-                   pwdiBeaconFilterParams->wdiBeaconFilterInfo.usIeNum * sizeof(tBeaconFilterIe)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &pwdiBeaconFilterParams->wdiBeaconFilterInfo,
+                   sizeof(pwdiBeaconFilterParams->wdiBeaconFilterInfo));
+   wpalMemoryCopy( pSendBuffer+usDataOffset+sizeof(pwdiBeaconFilterParams->wdiBeaconFilterInfo),
+                   &pwdiBeaconFilterParams->aFilters[0],
+                   pwdiBeaconFilterParams->wdiBeaconFilterInfo.usIeNum * sizeof(tBeaconFilterIe));
 
    pWDICtx->wdiReqStatusCB     = pwdiBeaconFilterParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiBeaconFilterParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiBeaconFilterParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiBeaconFilterCb, pEventData->pUserData, WDI_SET_BEACON_FILTER_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiBeaconFilterCb, pEventData->pUserData, WDI_SET_BEACON_FILTER_RESP);
 }/*WDI_ProcessSetBeaconFilterReq*/
 
 /**
- @brief Process remove beacon filter Request function (called 
+ @brief Process remove beacon filter Request function (called
         when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessRemBeaconFilterReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_RemBeaconFilterReqParamsType*  pwdiBeaconFilterParams = NULL;
    WDI_RemBeaconFilterCb              wdiBeaconFilterCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiBeaconFilterParams = (WDI_RemBeaconFilterReqParamsType*)pEventData->pEventData)) ||
@@ -12172,14 +12384,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_REM_BEACON_FILTER_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_REM_BEACON_FILTER_REQ,
                          sizeof(pwdiBeaconFilterParams->wdiBeaconFilterInfo),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(pwdiBeaconFilterParams->wdiBeaconFilterInfo) )))
@@ -12188,43 +12400,43 @@
                   "Unable to get send buffer in remove beacon filter req %x %x %x",
                   pEventData, pwdiBeaconFilterParams, wdiBeaconFilterCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &pwdiBeaconFilterParams->wdiBeaconFilterInfo, 
-                   sizeof(pwdiBeaconFilterParams->wdiBeaconFilterInfo)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &pwdiBeaconFilterParams->wdiBeaconFilterInfo,
+                   sizeof(pwdiBeaconFilterParams->wdiBeaconFilterInfo));
 
    pWDICtx->wdiReqStatusCB     = pwdiBeaconFilterParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiBeaconFilterParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiBeaconFilterParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiBeaconFilterCb, pEventData->pUserData, WDI_REM_BEACON_FILTER_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiBeaconFilterCb, pEventData->pUserData, WDI_REM_BEACON_FILTER_RESP);
 }
 
 /**
- @brief Process set RSSI thresholds Request function (called 
+ @brief Process set RSSI thresholds Request function (called
         when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessSetRSSIThresholdsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_SetRSSIThresholdsReqParamsType*  pwdiRSSIThresholdsParams = NULL;
    WDI_SetRSSIThresholdsCb              wdiRSSIThresholdsCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    tHalRSSIThresholds       rssiThresholdsReq;
@@ -12232,7 +12444,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiRSSIThresholdsParams = (WDI_SetRSSIThresholdsReqParamsType*)pEventData->pEventData)) ||
@@ -12241,14 +12453,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_RSSI_THRESHOLDS_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_RSSI_THRESHOLDS_REQ,
                          sizeof(rssiThresholdsReq),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(rssiThresholdsReq) )))
@@ -12257,36 +12469,36 @@
                   "Unable to get send buffer in remove beacon filter req %x %x %x",
                   pEventData, pwdiRSSIThresholdsParams, wdiRSSIThresholdsCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   rssiThresholdsReq.bReserved10 = 
+   rssiThresholdsReq.bReserved10 =
       pwdiRSSIThresholdsParams->wdiRSSIThresholdsInfo.bReserved10;
-   rssiThresholdsReq.bRssiThres1NegNotify = 
+   rssiThresholdsReq.bRssiThres1NegNotify =
       pwdiRSSIThresholdsParams->wdiRSSIThresholdsInfo.bRssiThres1NegNotify;
-   rssiThresholdsReq.bRssiThres1PosNotify = 
+   rssiThresholdsReq.bRssiThres1PosNotify =
       pwdiRSSIThresholdsParams->wdiRSSIThresholdsInfo.bRssiThres1PosNotify;
-   rssiThresholdsReq.bRssiThres2NegNotify = 
+   rssiThresholdsReq.bRssiThres2NegNotify =
       pwdiRSSIThresholdsParams->wdiRSSIThresholdsInfo.bRssiThres2NegNotify;
-   rssiThresholdsReq.bRssiThres2PosNotify = 
+   rssiThresholdsReq.bRssiThres2PosNotify =
       pwdiRSSIThresholdsParams->wdiRSSIThresholdsInfo.bRssiThres2PosNotify;
-   rssiThresholdsReq.bRssiThres3NegNotify = 
+   rssiThresholdsReq.bRssiThres3NegNotify =
       pwdiRSSIThresholdsParams->wdiRSSIThresholdsInfo.bRssiThres3NegNotify;
-   rssiThresholdsReq.bRssiThres3PosNotify = 
+   rssiThresholdsReq.bRssiThres3PosNotify =
       pwdiRSSIThresholdsParams->wdiRSSIThresholdsInfo.bRssiThres3PosNotify;
-   rssiThresholdsReq.ucRssiThreshold1 = 
+   rssiThresholdsReq.ucRssiThreshold1 =
       pwdiRSSIThresholdsParams->wdiRSSIThresholdsInfo.ucRssiThreshold1;
-   rssiThresholdsReq.ucRssiThreshold2 = 
+   rssiThresholdsReq.ucRssiThreshold2 =
       pwdiRSSIThresholdsParams->wdiRSSIThresholdsInfo.ucRssiThreshold2;
-   rssiThresholdsReq.ucRssiThreshold3 = 
+   rssiThresholdsReq.ucRssiThreshold3 =
       pwdiRSSIThresholdsParams->wdiRSSIThresholdsInfo.ucRssiThreshold3;
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &rssiThresholdsReq, 
-                   sizeof(rssiThresholdsReq)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &rssiThresholdsReq,
+                   sizeof(rssiThresholdsReq));
 
    pWDICtx->wdiReqStatusCB     = pwdiRSSIThresholdsParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiRSSIThresholdsParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiRSSIThresholdsParams->pUserData;
 
    /*-------------------------------------------------------------------------
      Send Set threshold req to HAL 
@@ -12307,25 +12519,25 @@
 }
 
 /**
- @brief Process set RSSI thresholds Request function (called 
+ @brief Process set RSSI thresholds Request function (called
         when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessHostOffloadReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_HostOffloadReqParamsType*  pwdiHostOffloadParams = NULL;
    WDI_HostOffloadCb              wdiHostOffloadCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    tHalHostOffloadReq       hostOffloadParams;
@@ -12334,7 +12546,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiHostOffloadParams = (WDI_HostOffloadReqParamsType*)pEventData->pEventData)) ||
@@ -12343,14 +12555,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_HOST_OFFLOAD_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_HOST_OFFLOAD_REQ,
                          sizeof(hostOffloadParams)+sizeof(nsOffloadParams),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(hostOffloadParams) + sizeof(nsOffloadParams) )))
@@ -12359,11 +12571,12 @@
                   "Unable to get send buffer in host offload req %x %x %x",
                   pEventData, pwdiHostOffloadParams, wdiHostOffloadCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    hostOffloadParams.offloadType = pwdiHostOffloadParams->wdiHostOffloadInfo.ucOffloadType;
    hostOffloadParams.enableOrDisable = pwdiHostOffloadParams->wdiHostOffloadInfo.ucEnableOrDisable;
+
    if( HAL_IPV4_ARP_REPLY_OFFLOAD == hostOffloadParams.offloadType )
    {
       // ARP Offload
@@ -12398,6 +12611,9 @@
         nsOffloadParams.srcIPv6AddrValid = pwdiHostOffloadParams->wdiNsOffloadParams.srcIPv6AddrValid;
         nsOffloadParams.targetIPv6Addr1Valid = pwdiHostOffloadParams->wdiNsOffloadParams.targetIPv6Addr1Valid;
         nsOffloadParams.targetIPv6Addr2Valid = pwdiHostOffloadParams->wdiNsOffloadParams.targetIPv6Addr2Valid;
+
+        nsOffloadParams.bssIdx = pwdiHostOffloadParams->wdiNsOffloadParams.bssIdx;
+
 #endif // WLAN_NS_OFFLOAD
    }
 
@@ -12417,42 +12633,42 @@
 #endif // WLAN_NS_OFFLOAD
 
    pWDICtx->wdiReqStatusCB     = pwdiHostOffloadParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiHostOffloadParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiHostOffloadParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiHostOffloadCb, pEventData->pUserData, WDI_HOST_OFFLOAD_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiHostOffloadCb, pEventData->pUserData, WDI_HOST_OFFLOAD_RESP);
 }/*WDI_ProcessHostOffloadReq*/
 
 /**
- @brief Process Keep Alive Request function (called 
+ @brief Process Keep Alive Request function (called
         when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessKeepAliveReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_KeepAliveReqParamsType*  pwdiKeepAliveParams = NULL;
    WDI_KeepAliveCb              wdiKeepAliveCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    tHalKeepAliveReq         keepAliveReq;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiKeepAliveParams = (WDI_KeepAliveReqParamsType*)pEventData->pEventData)) ||
@@ -12461,14 +12677,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_ERROR,
                "Invalid parameters in Keep Alive req");
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_KEEP_ALIVE_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_KEEP_ALIVE_REQ,
                          sizeof(keepAliveReq),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(keepAliveReq) )))
@@ -12477,12 +12693,14 @@
                   "Unable to get send buffer in keep alive req %x %x %x",
                   pEventData, pwdiKeepAliveParams, wdiKeepAliveCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    keepAliveReq.packetType = pwdiKeepAliveParams->wdiKeepAliveInfo.ucPacketType;
    keepAliveReq.timePeriod = pwdiKeepAliveParams->wdiKeepAliveInfo.ucTimePeriod;
 
+   keepAliveReq.bssIdx = pwdiKeepAliveParams->wdiKeepAliveInfo.bssIdx;
+
    if(pwdiKeepAliveParams->wdiKeepAliveInfo.ucPacketType == 2)
    {
    wpalMemoryCopy(keepAliveReq.hostIpv4Addr,
@@ -12490,15 +12708,15 @@
                      HAL_IPV4_ADDR_LEN);
    wpalMemoryCopy(keepAliveReq.destIpv4Addr,
                      pwdiKeepAliveParams->wdiKeepAliveInfo.aDestIpv4Addr,
-                     HAL_IPV4_ADDR_LEN);   
+                     HAL_IPV4_ADDR_LEN);
    wpalMemoryCopy(keepAliveReq.destMacAddr,
                      pwdiKeepAliveParams->wdiKeepAliveInfo.aDestMacAddr,
                      HAL_MAC_ADDR_LEN);
    }
-      
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &keepAliveReq, 
-                   sizeof(keepAliveReq)); 
+
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &keepAliveReq,
+                   sizeof(keepAliveReq));
 
    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_INFO,
                "Process keep alive req %d",sizeof(keepAliveReq));
@@ -12507,46 +12725,46 @@
                "Process keep alive req time period %d",keepAliveReq.timePeriod);
 
    pWDICtx->wdiReqStatusCB     = pwdiKeepAliveParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiKeepAliveParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiKeepAliveParams->pUserData;
 
   WPAL_TRACE(eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_INFO,
                   "Sending keep alive req to HAL");
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiKeepAliveCb, pEventData->pUserData, WDI_KEEP_ALIVE_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiKeepAliveCb, pEventData->pUserData, WDI_KEEP_ALIVE_RESP);
 }/*WDI_ProcessKeepAliveReq*/
 
 
 /**
- @brief Process Wowl add bc ptrn Request function (called 
+ @brief Process Wowl add bc ptrn Request function (called
         when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessWowlAddBcPtrnReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_WowlAddBcPtrnReqParamsType*  pwdiWowlAddBcPtrnParams = NULL;
    WDI_WowlAddBcPtrnCb              wdiWowlAddBcPtrnCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    tHalWowlAddBcastPtrn     wowlAddBcPtrnReq;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiWowlAddBcPtrnParams = (WDI_WowlAddBcPtrnReqParamsType*)pEventData->pEventData)) ||
@@ -12555,14 +12773,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_WOWL_ADD_BC_PTRN_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_WOWL_ADD_BC_PTRN_REQ,
                          sizeof(wowlAddBcPtrnReq),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(wowlAddBcPtrnReq) )))
@@ -12571,16 +12789,16 @@
                   "Unable to get send buffer in Wowl add bc ptrn req %x %x %x",
                   pEventData, pwdiWowlAddBcPtrnParams, wdiWowlAddBcPtrnCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wowlAddBcPtrnReq.ucPatternId = 
+   wowlAddBcPtrnReq.ucPatternId =
       pwdiWowlAddBcPtrnParams->wdiWowlAddBcPtrnInfo.ucPatternId;
-   wowlAddBcPtrnReq.ucPatternByteOffset = 
+   wowlAddBcPtrnReq.ucPatternByteOffset =
       pwdiWowlAddBcPtrnParams->wdiWowlAddBcPtrnInfo.ucPatternByteOffset;
-   wowlAddBcPtrnReq.ucPatternMaskSize = 
+   wowlAddBcPtrnReq.ucPatternMaskSize =
       pwdiWowlAddBcPtrnParams->wdiWowlAddBcPtrnInfo.ucPatternMaskSize;
-   wowlAddBcPtrnReq.ucPatternSize = 
+   wowlAddBcPtrnReq.ucPatternSize =
       pwdiWowlAddBcPtrnParams->wdiWowlAddBcPtrnInfo.ucPatternSize;
 
    if (pwdiWowlAddBcPtrnParams->wdiWowlAddBcPtrnInfo.ucPatternSize <= HAL_WOWL_BCAST_PATTERN_MAX_SIZE)
@@ -12614,42 +12832,42 @@
                    sizeof(wowlAddBcPtrnReq)); 
 
    pWDICtx->wdiReqStatusCB     = pwdiWowlAddBcPtrnParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiWowlAddBcPtrnParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiWowlAddBcPtrnParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiWowlAddBcPtrnCb, pEventData->pUserData, WDI_WOWL_ADD_BC_PTRN_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiWowlAddBcPtrnCb, pEventData->pUserData, WDI_WOWL_ADD_BC_PTRN_RESP);
 }/*WDI_ProcessWowlAddBcPtrnReq*/
 
 /**
- @brief Process Wowl delete bc ptrn Request function (called 
+ @brief Process Wowl delete bc ptrn Request function (called
         when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessWowlDelBcPtrnReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_WowlDelBcPtrnReqParamsType*  pwdiWowlDelBcPtrnParams = NULL;
    WDI_WowlDelBcPtrnCb              wdiWowlDelBcPtrnCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    tHalWowlDelBcastPtrn     wowlDelBcPtrnReq;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiWowlDelBcPtrnParams = (WDI_WowlDelBcPtrnReqParamsType*)pEventData->pEventData)) ||
@@ -12658,14 +12876,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_WOWL_DEL_BC_PTRN_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_WOWL_DEL_BC_PTRN_REQ,
                          sizeof(wowlDelBcPtrnReq),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(wowlDelBcPtrnReq) )))
@@ -12674,52 +12892,52 @@
                   "Unable to get send buffer in Wowl del bc ptrn req %x %x %x",
                   pEventData, pwdiWowlDelBcPtrnParams, wdiWowlDelBcPtrnCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wowlDelBcPtrnReq.ucPatternId = 
+   wowlDelBcPtrnReq.ucPatternId =
       pwdiWowlDelBcPtrnParams->wdiWowlDelBcPtrnInfo.ucPatternId;
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &wowlDelBcPtrnReq, 
-                   sizeof(wowlDelBcPtrnReq)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &wowlDelBcPtrnReq,
+                   sizeof(wowlDelBcPtrnReq));
 
    pWDICtx->wdiReqStatusCB     = pwdiWowlDelBcPtrnParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiWowlDelBcPtrnParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiWowlDelBcPtrnParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiWowlDelBcPtrnCb, pEventData->pUserData, WDI_WOWL_DEL_BC_PTRN_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiWowlDelBcPtrnCb, pEventData->pUserData, WDI_WOWL_DEL_BC_PTRN_RESP);
 }/*WDI_ProcessWowlDelBcPtrnReq*/
 
 /**
- @brief Process Wowl enter Request function (called 
+ @brief Process Wowl enter Request function (called
         when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessWowlEnterReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_WowlEnterReqParamsType*  pwdiWowlEnterParams = NULL;
    WDI_WowlEnterReqCb           wdiWowlEnterCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    tHalWowlEnterParams      wowlEnterReq;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiWowlEnterParams = (WDI_WowlEnterReqParamsType*)pEventData->pEventData)) ||
@@ -12728,14 +12946,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_WOWL_ENTER_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_WOWL_ENTER_REQ,
                          sizeof(wowlEnterReq),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(wowlEnterReq) )))
@@ -12744,24 +12962,24 @@
                   "Unable to get send buffer in Wowl enter req %x %x %x",
                   pEventData, pwdiWowlEnterParams, wdiWowlEnterCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wowlEnterReq.ucMagicPktEnable = 
+   wowlEnterReq.ucMagicPktEnable =
       pwdiWowlEnterParams->wdiWowlEnterInfo.ucMagicPktEnable;
-   wowlEnterReq.ucPatternFilteringEnable = 
+   wowlEnterReq.ucPatternFilteringEnable =
       pwdiWowlEnterParams->wdiWowlEnterInfo.ucPatternFilteringEnable;
-   wowlEnterReq.ucUcastPatternFilteringEnable = 
+   wowlEnterReq.ucUcastPatternFilteringEnable =
       pwdiWowlEnterParams->wdiWowlEnterInfo.ucUcastPatternFilteringEnable;
-   wowlEnterReq.ucWowChnlSwitchRcv = 
+   wowlEnterReq.ucWowChnlSwitchRcv =
       pwdiWowlEnterParams->wdiWowlEnterInfo.ucWowChnlSwitchRcv;
-   wowlEnterReq.ucWowDeauthRcv = 
+   wowlEnterReq.ucWowDeauthRcv =
       pwdiWowlEnterParams->wdiWowlEnterInfo.ucWowDeauthRcv;
-   wowlEnterReq.ucWowDisassocRcv = 
+   wowlEnterReq.ucWowDisassocRcv =
       pwdiWowlEnterParams->wdiWowlEnterInfo.ucWowDisassocRcv;
-   wowlEnterReq.ucWowMaxMissedBeacons = 
+   wowlEnterReq.ucWowMaxMissedBeacons =
       pwdiWowlEnterParams->wdiWowlEnterInfo.ucWowMaxMissedBeacons;
-   wowlEnterReq.ucWowMaxSleepUsec = 
+   wowlEnterReq.ucWowMaxSleepUsec =
       pwdiWowlEnterParams->wdiWowlEnterInfo.ucWowMaxSleepUsec;
 
 #ifdef WLAN_WAKEUP_EVENTS
@@ -12785,45 +13003,45 @@
                   pwdiWowlEnterParams->wdiWowlEnterInfo.magicPtrn,
                   sizeof(tSirMacAddr));
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &wowlEnterReq, 
-                   sizeof(wowlEnterReq)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &wowlEnterReq,
+                   sizeof(wowlEnterReq));
 
    pWDICtx->wdiReqStatusCB     = pwdiWowlEnterParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiWowlEnterParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiWowlEnterParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiWowlEnterCb, pEventData->pUserData, WDI_WOWL_ENTER_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiWowlEnterCb, pEventData->pUserData, WDI_WOWL_ENTER_RESP);
 }/*WDI_ProcessWowlEnterReq*/
 
 /**
  @brief Process Wowl exit Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessWowlExitReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_WowlExitReqCb           wdiWowlExitCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (wdiWowlExitCb   = (WDI_WowlExitReqCb)pEventData->pCBfnc)))
@@ -12831,14 +13049,14 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
-     ! TO DO : proper conversion into the HAL Message Request Format 
+     ! TO DO : proper conversion into the HAL Message Request Format
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_WOWL_EXIT_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_WOWL_EXIT_REQ,
                                                      0,
                                                      &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset )))
@@ -12847,43 +13065,43 @@
                "Unable to get send buffer in Wowl Exit req %x %x",
                  pEventData, wdiWowlExitCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiWowlExitCb, pEventData->pUserData, WDI_WOWL_EXIT_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiWowlExitCb, pEventData->pUserData, WDI_WOWL_EXIT_RESP);
 }/*WDI_ProcessWowlExitReq*/
 
 /**
  @brief Process Configure Apps Cpu Wakeup State Request function
         (called when Main FSM allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessConfigureAppsCpuWakeupStateReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_ConfigureAppsCpuWakeupStateReqParamsType*  pwdiAppsCpuWakeupStateParams = NULL;
    WDI_ConfigureAppsCpuWakeupStateCb              wdiConfigureAppsCpuWakeupStateCb = NULL;
-   wpt_uint8*               pSendBuffer         = NULL; 
+   wpt_uint8*               pSendBuffer         = NULL;
    wpt_uint16               usDataOffset        = 0;
    wpt_uint16               usSendSize          = 0;
    tHalConfigureAppsCpuWakeupStateReqParams  halCfgAppsCpuWakeupStateReqParams;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiAppsCpuWakeupStateParams = (WDI_ConfigureAppsCpuWakeupStateReqParamsType*)pEventData->pEventData)) ||
@@ -12892,13 +13110,13 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_CONFIGURE_APPS_CPU_WAKEUP_STATE_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_CONFIGURE_APPS_CPU_WAKEUP_STATE_REQ,
                          sizeof(halCfgAppsCpuWakeupStateReqParams),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(pwdiAppsCpuWakeupStateParams->bIsAppsAwake) )))
@@ -12907,60 +13125,60 @@
                "Unable to get send buffer in Apps CPU Wakeup State req %x %x %x",
                  pEventData, pwdiAppsCpuWakeupStateParams, wdiConfigureAppsCpuWakeupStateCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   halCfgAppsCpuWakeupStateReqParams.isAppsCpuAwake = 
+   halCfgAppsCpuWakeupStateReqParams.isAppsCpuAwake =
                            pwdiAppsCpuWakeupStateParams->bIsAppsAwake;
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &halCfgAppsCpuWakeupStateReqParams, 
-                   sizeof(halCfgAppsCpuWakeupStateReqParams)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &halCfgAppsCpuWakeupStateReqParams,
+                   sizeof(halCfgAppsCpuWakeupStateReqParams));
 
    pWDICtx->wdiReqStatusCB     = pwdiAppsCpuWakeupStateParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiAppsCpuWakeupStateParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiAppsCpuWakeupStateParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiConfigureAppsCpuWakeupStateCb, pEventData->pUserData, 
-                        WDI_CONFIGURE_APPS_CPU_WAKEUP_STATE_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiConfigureAppsCpuWakeupStateCb, pEventData->pUserData,
+                        WDI_CONFIGURE_APPS_CPU_WAKEUP_STATE_RESP);
 }/*WDI_ProcessConfigureAppsCpuWakeupStateReq*/
 
 #ifdef WLAN_FEATURE_VOWIFI_11R
 /**
  @brief Process Aggregated Add TSpec Request function (called when Main FSM
         allows it)
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessAggrAddTSpecReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_AggrAddTSReqParamsType*  pwdiAggrAddTSParams;
   WDI_AggrAddTsRspCb           wdiAggrAddTSRspCb;
-  wpt_uint8                ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*      pBSSSes             = NULL;
-  wpt_uint8*               pSendBuffer         = NULL; 
+  wpt_uint8*               pSendBuffer         = NULL;
   wpt_uint16               usDataOffset        = 0;
   wpt_uint16               usSendSize          = 0;
-  WDI_Status               wdiStatus           = WDI_STATUS_SUCCESS; 
+  WDI_Status               wdiStatus           = WDI_STATUS_SUCCESS;
   wpt_macAddr              macBSSID;
   tAggrAddTsReq            halAggrAddTsReq;
   int i;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
       ( NULL == pEventData->pCBfnc ))
@@ -12968,60 +13186,62 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
   wpalMemoryFill( &halAggrAddTsReq, sizeof(tAggrAddTsReq), 0 );
   pwdiAggrAddTSParams = (WDI_AggrAddTSReqParamsType*)pEventData->pEventData;
   wdiAggrAddTSRspCb   = (WDI_AggrAddTsRspCb)pEventData->pCBfnc;
   /*-------------------------------------------------------------------------
     Check to see if we are in the middle of an association, if so queue, if
-    not it means it is free to process request 
+    not it means it is free to process request
   -------------------------------------------------------------------------*/
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
     Find the BSS for which the request is made and identify WDI session
   ------------------------------------------------------------------------*/
-  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx, 
-                                        pwdiAggrAddTSParams->wdiAggrTsInfo.ucSTAIdx, 
+  if ( WDI_STATUS_SUCCESS != WDI_STATableGetStaBSSIDAddr(pWDICtx,
+                                        pwdiAggrAddTSParams->wdiAggrTsInfo.ucSTAIdx,
                                         &macBSSID))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
              "This station does not exist in the WDI Station Table %d");
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes); 
-  if ( NULL == pBSSSes ) 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, macBSSID, &pBSSSes);
+  if ( NULL == pBSSSes )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR, 
+        "%s: Association sequence for this BSS does not yet exist. macBSSID " MAC_ADDRESS_STR, 
+        __func__, MAC_ADDR_ARRAY(macBSSID));
 
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
- 
+
   /*------------------------------------------------------------------------
     Check if this BSS is being currently processed or queued,
-    if queued - queue the new request as well 
+    if queued - queue the new request as well
   ------------------------------------------------------------------------*/
   if ( eWLAN_PAL_TRUE == pBSSSes->bAssocReqQueued )
   {
-    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS exists but currently queued");
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+              "%s: Association sequence for this BSS exists but currently queued. macBSSID " MAC_ADDRESS_STR,
+              __func__, MAC_ADDR_ARRAY(macBSSID));
 
-    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData); 
+    wdiStatus = WDI_QueueAssocRequest( pWDICtx, pBSSSes, pEventData);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return wdiStatus; 
+    return wdiStatus;
   }
 
   wpalMutexRelease(&pWDICtx->wptMutex);
   /*-----------------------------------------------------------------------
     Get message buffer
-    ! TO DO : proper conversion into the HAL Message Request Format 
+    ! TO DO : proper conversion into the HAL Message Request Format
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_AGGR_ADD_TS_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_AGGR_ADD_TS_REQ,
                         sizeof(tAggrAddTsParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
       ( usSendSize < (usDataOffset + sizeof(tAggrAddTsParams) )))
@@ -13030,95 +13250,95 @@
               "Unable to get send buffer in set bss key req %x %x %x",
                 pEventData, pwdiAggrAddTSParams, wdiAggrAddTSRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  halAggrAddTsReq.aggrAddTsParam.staIdx = 
+  halAggrAddTsReq.aggrAddTsParam.staIdx =
      pwdiAggrAddTSParams->wdiAggrTsInfo.ucSTAIdx;
-  halAggrAddTsReq.aggrAddTsParam.tspecIdx = 
+  halAggrAddTsReq.aggrAddTsParam.tspecIdx =
      pwdiAggrAddTSParams->wdiAggrTsInfo.ucTspecIdx;
 
   for( i = 0; i < WLAN_HAL_MAX_AC; i++ )
   {
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].type = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].type =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].ucType;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].length = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].length =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].ucLength;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.ackPolicy = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.ackPolicy =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.
         ackPolicy;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.accessPolicy = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.accessPolicy =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.
         accessPolicy;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.userPrio = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.userPrio =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.
         userPrio;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.psb = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.psb =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.
         psb;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.aggregation = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.aggregation =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.
         aggregation;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.direction = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.direction =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.
         direction;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.tsid = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.tsid =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.
         trafficType;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.tsid = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.traffic.tsid =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.
         trafficType;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.schedule.rsvd = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.schedule.rsvd =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiSchedule.rsvd;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.schedule.schedule = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].tsinfo.schedule.schedule =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiSchedule.schedule;
-        
-                  
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].nomMsduSz = 
+
+
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].nomMsduSz =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].usNomMsduSz;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].maxMsduSz = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].maxMsduSz =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].usMaxMsduSz;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].minSvcInterval = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].minSvcInterval =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].uMinSvcInterval;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].maxSvcInterval = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].maxSvcInterval =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].uMaxSvcInterval;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].inactInterval = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].inactInterval =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].uInactInterval;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].suspendInterval = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].suspendInterval =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].uSuspendInterval;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].svcStartTime = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].svcStartTime =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].uSvcStartTime;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].minDataRate = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].minDataRate =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].uMinDataRate;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].meanDataRate = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].meanDataRate =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].uMeanDataRate;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].peakDataRate = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].peakDataRate =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].uPeakDataRate;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].maxBurstSz = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].maxBurstSz =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].uMaxBurstSz;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].delayBound = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].delayBound =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].uDelayBound;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].minPhyRate = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].minPhyRate =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].uMinPhyRate;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].surplusBw = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].surplusBw =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].usSurplusBw;
-     halAggrAddTsReq.aggrAddTsParam.tspec[i].mediumTime = 
+     halAggrAddTsReq.aggrAddTsParam.tspec[i].mediumTime =
         pwdiAggrAddTSParams->wdiAggrTsInfo.wdiTspecIE[i].usMediumTime;
   }
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halAggrAddTsReq, 
-                  sizeof(halAggrAddTsReq)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halAggrAddTsReq,
+                  sizeof(halAggrAddTsReq));
 
   pWDICtx->wdiReqStatusCB     = pwdiAggrAddTSParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiAggrAddTSParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiAggrAddTSParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Add TS Request to HAL 
+    Send Add TS Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                        wdiAggrAddTSRspCb, pEventData->pUserData,
-                       WDI_AGGR_ADD_TS_RESP); 
+                       WDI_AGGR_ADD_TS_RESP);
 }/*WDI_ProcessAggrAddTSpecReq*/
 #endif /* WLAN_FEATURE_VOWIFI_11R */
 
@@ -13145,7 +13365,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
      -------------------------------------------------------------------------*/
    if ( NULL == pEventData )
    {
@@ -13195,29 +13415,29 @@
    wpalMutexRelease(&pWDICtx->wptMutex);
 
    /*Make sure the expected state is properly defaulted to Init*/
-   pWDICtx->ucExpectedStateTransition = WDI_INIT_ST; 
+   pWDICtx->ucExpectedStateTransition = WDI_INIT_ST;
 
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessShutdownReq*/
 
 /*========================================================================
-          Main DAL Control Path Response Processing API 
+          Main DAL Control Path Response Processing API
 ========================================================================*/
 
 /**
  @brief Process Start Response 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 
-  
+
+ @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_ProcessStartRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -13232,9 +13452,9 @@
 #endif
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
-  wdiStartRspCb = (WDI_StartRspCb)pWDICtx->pfncRspCB; 
+  wdiStartRspCb = (WDI_StartRspCb)pWDICtx->pfncRspCB;
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData) ||
@@ -13243,7 +13463,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
@@ -13256,12 +13476,12 @@
                  "Invalid response length in Start Resp Expect %x Rcvd %x",
                  sizeof(tHalMacStartRspParams), pEventData->uEventDataSize);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
     Unpack HAL Response Message - the header was already extracted by the
-    main Response Handling procedure 
+    main Response Handling procedure
   -------------------------------------------------------------------------*/
   startRspParams = (tHalMacStartRspParams *) pEventData->pEventData;
 
@@ -13294,7 +13514,7 @@
 
     /*Cache the start response for further use*/
     wpalMemoryCopy( &pWDICtx->wdiCachedStartRspParams ,
-                  &wdiRspParams, 
+                  &wdiRspParams,
                   sizeof(pWDICtx->wdiCachedStartRspParams));
 
   }
@@ -13313,14 +13533,14 @@
 
      /*Notify UMAC*/
     wdiStartRspCb( &wdiRspParams, pWDICtx->pRspCBUserData);
-    
+
     WDI_DetectedDeviceError(pWDICtx, wdiRspParams.wdiStatus);
 
     /*Although the response is an error - it was processed by our function
     so as far as the caller is concerned this is a succesful reponse processing*/
     return WDI_STATUS_SUCCESS;
   }
-  
+
   wpalMutexRelease(&pWDICtx->wptMutex);
 
   if(eDRIVER_TYPE_MFG == pWDICtx->driverMode)
@@ -13373,23 +13593,23 @@
   /*Notify UMAC*/
   wdiStartRspCb( &wdiRspParams, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessStartRsp*/
 
 
 /**
  @brief Process Stop Response 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 
-  
+
+ @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_ProcessStopRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -13397,12 +13617,12 @@
   WDI_Status          wdiStatus;
   WDI_StopRspCb       wdiStopRspCb = NULL;
 
-  tHalMacStopRspMsg   halMacStopRspMsg; 
+  tHalMacStopRspMsg   halMacStopRspMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
-  wdiStopRspCb = (WDI_StopRspCb)pWDICtx->pfncRspCB; 
+  wdiStopRspCb = (WDI_StopRspCb)pWDICtx->pfncRspCB;
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData) ||
@@ -13411,7 +13631,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
@@ -13423,23 +13643,23 @@
               "Invalid response length in Stop Resp %x %x",
                 pEventData->uEventDataSize);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
     Unpack HAL Response Message - the header was already extracted by the
-    main Response Handling procedure 
+    main Response Handling procedure
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halMacStopRspMsg.stopRspParams,  
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halMacStopRspMsg.stopRspParams,
+                  pEventData->pEventData,
                   sizeof(halMacStopRspMsg.stopRspParams));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halMacStopRspMsg.stopRspParams.status); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halMacStopRspMsg.stopRspParams.status);
 
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*--------------------------------------------------------------------------
-    Check to see if the stop went OK 
+    Check to see if the stop went OK
   --------------------------------------------------------------------------*/
   if ( WDI_STATUS_SUCCESS != wdiStatus  )
   {
@@ -13448,12 +13668,12 @@
                WDI_getHALStatusMsgString(halMacStopRspMsg.stopRspParams.status),
                halMacStopRspMsg.stopRspParams.status);
 
-    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE); 
-    
+    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE);
+
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
-  
+
   pWDICtx->ucExpectedStateTransition = WDI_STOPPED_ST;
 
   /*Transition now as WDI may get preempted imediately after it sends
@@ -13467,22 +13687,22 @@
   /*Notify UMAC*/
   wdiStopRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessStopRsp*/
 
 /**
  @brief Process Close 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 
-  
+
+ @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_ProcessCloseRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -13490,38 +13710,38 @@
   /*There is no close response comming from HAL - function just kept for
   simmetry */
   WDI_ASSERT(0);
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessCloseRsp*/
 
 
 /*============================================================================
-                      SCAN RESPONSE PROCESSING API 
+                      SCAN RESPONSE PROCESSING API
 ============================================================================*/
 
 /**
  @brief Process Init Scan 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 
-  
+
+ @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_ProcessInitScanRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_Status            wdiStatus;
   WDI_InitScanRspCb     wdiInitScanRspCb;
-  tHalInitScanRspMsg    halInitScanRspMsg; 
+  tHalInitScanRspMsg    halInitScanRspMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -13529,7 +13749,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiInitScanRspCb = (WDI_InitScanRspCb)pWDICtx->pfncRspCB;
@@ -13538,18 +13758,18 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
                  "%s: call back function is NULL", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
     Unpack HAL Response Message - the header was already extracted by the
-    main Response Handling procedure 
+    main Response Handling procedure
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halInitScanRspMsg.initScanRspParams, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halInitScanRspMsg.initScanRspParams,
+                  pEventData->pEventData,
                   sizeof(halInitScanRspMsg.initScanRspParams));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halInitScanRspMsg.initScanRspParams.status); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halInitScanRspMsg.initScanRspParams.status);
 
   if ( pWDICtx->bInBmps )
   {
@@ -13560,35 +13780,35 @@
   /*Notify UMAC*/
   wdiInitScanRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessInitScanRsp*/
 
 
 /**
  @brief Process Start Scan 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 
-  
+
+ @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_ProcessStartScanRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_StartScanRspParamsType   wdiStartScanParams;
   WDI_StartScanRspCb           wdiStartScanRspCb;
-  
-  tHalStartScanRspMsg          halStartScanRspMsg; 
+
+  tHalStartScanRspMsg          halStartScanRspMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -13596,7 +13816,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiStartScanRspCb = (WDI_StartScanRspCb)pWDICtx->pfncRspCB;
@@ -13605,25 +13825,25 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
                  "%s: call back function is NULL", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halStartScanRspMsg.startScanRspParams, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halStartScanRspMsg.startScanRspParams,
+                  pEventData->pEventData,
                   sizeof(halStartScanRspMsg.startScanRspParams));
 
   wdiStartScanParams.wdiStatus   =   WDI_HAL_2_WDI_STATUS(
                              halStartScanRspMsg.startScanRspParams.status);
 #ifdef WLAN_FEATURE_VOWIFI
-  wdiStartScanParams.ucTxMgmtPower = 
+  wdiStartScanParams.ucTxMgmtPower =
                              halStartScanRspMsg.startScanRspParams.txMgmtPower;
-  wpalMemoryCopy( wdiStartScanParams.aStartTSF, 
+  wpalMemoryCopy( wdiStartScanParams.aStartTSF,
                   halStartScanRspMsg.startScanRspParams.startTSF,
                   2);
-#endif 
+#endif
 
   if ( eHAL_STATUS_SUCCESS != halStartScanRspMsg.startScanRspParams.status )
   {
@@ -13637,24 +13857,24 @@
   /*Notify UMAC*/
   wdiStartScanRspCb( &wdiStartScanParams, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 
 }/*WDI_ProcessStartScanRsp*/
 
 
 /**
- @brief Process End Scan Response function (called when a 
+ @brief Process End Scan Response 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 
-  
+
+ @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_ProcessEndScanRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -13665,7 +13885,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -13673,7 +13893,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiEndScanRspCb = (WDI_EndScanRspCb)pWDICtx->pfncRspCB;
@@ -13681,11 +13901,11 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halEndScanRspMsg.endScanRspParams, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halEndScanRspMsg.endScanRspParams,
+                  pEventData->pEventData,
                   sizeof(halEndScanRspMsg.endScanRspParams));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halEndScanRspMsg.endScanRspParams.status); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halEndScanRspMsg.endScanRspParams.status);
 
   if ( eHAL_STATUS_SUCCESS != halEndScanRspMsg.endScanRspParams.status )
   {
@@ -13699,35 +13919,35 @@
   /*Notify UMAC*/
   wdiEndScanRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessEndScanRsp*/
 
 
 /**
- @brief Process Finish Scan Response function (called when a 
+ @brief Process Finish Scan Response 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 
-  
+
+ @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_ProcessFinishScanRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
-)  
+)
 {
   WDI_Status            wdiStatus;
   WDI_FinishScanRspCb   wdiFinishScanRspCb;
-  
-  tHalFinishScanRspMsg  halFinishScanRspMsg; 
+
+  tHalFinishScanRspMsg  halFinishScanRspMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -13735,7 +13955,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiFinishScanRspCb = (WDI_FinishScanRspCb)pWDICtx->pfncRspCB;
@@ -13743,14 +13963,14 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( (void *)&halFinishScanRspMsg.finishScanRspParams.status, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( (void *)&halFinishScanRspMsg.finishScanRspParams.status,
+                  pEventData->pEventData,
                   sizeof(halFinishScanRspMsg.finishScanRspParams.status));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halFinishScanRspMsg.finishScanRspParams.status); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halFinishScanRspMsg.finishScanRspParams.status);
 
   WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
-              "Finish scan response reported status: %d", 
+              "Finish scan response reported status: %d",
               halFinishScanRspMsg.finishScanRspParams.status);
 
   if (( eHAL_STATUS_SUCCESS != halFinishScanRspMsg.finishScanRspParams.status )&&
@@ -13766,22 +13986,22 @@
   /*Notify UMAC*/
   wdiFinishScanRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessFinishScanRsp*/
 
 /**
  @brief Process Join Response 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 
-  
+
+ @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_ProcessJoinRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -13789,12 +14009,12 @@
   WDI_Status                    wdiStatus;
   WDI_JoinRspCb                 wdiJoinRspCb;
   WDI_BSSSessionType*           pBSSSes             = NULL;
-  
-  tHalJoinRspMsg                halJoinRspMsg; 
+
+  tHalJoinRspMsg                halJoinRspMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) ||
       ( NULL == pWDICtx->pfncRspCB ) ||
@@ -13804,7 +14024,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiJoinRspCb = (WDI_JoinRspCb)pWDICtx->pfncRspCB;
@@ -13812,34 +14032,35 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halJoinRspMsg.joinRspParams, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halJoinRspMsg.joinRspParams,
+                  pEventData->pEventData,
                   sizeof(halJoinRspMsg.joinRspParams));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halJoinRspMsg.joinRspParams.status); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halJoinRspMsg.joinRspParams.status);
 
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*-----------------------------------------------------------------------
     Join response can only be received for an existing assoc that
-    is current and in progress 
+    is current and in progress
     -----------------------------------------------------------------------*/
-  if (( !WDI_VALID_SESSION_IDX(pWDICtx->ucCurrentBSSSesIdx )) || 
+  if (( !WDI_VALID_SESSION_IDX(pWDICtx->ucCurrentBSSSesIdx )) ||
       ( eWLAN_PAL_FALSE == pWDICtx->bAssociationInProgress ))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Association sequence for this BSS does not yet exist or "
-              "association no longer in progress - mysterious HAL response");
+              "%s: Association sequence for this BSS does not yet exist (bssIdx %d) or "
+              "association no longer in progress %d - mysterious HAL response",
+              __func__, pWDICtx->ucCurrentBSSSesIdx, pWDICtx->bAssociationInProgress);
 
-    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE); 
+    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE);
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   pBSSSes = &pWDICtx->aBSSSessions[pWDICtx->ucCurrentBSSSesIdx];
 
   /*-----------------------------------------------------------------------
-    Join Response is only allowed in init state 
+    Join Response is only allowed in init state
   -----------------------------------------------------------------------*/
   if ( WDI_ASSOC_JOINING_ST != pBSSSes->wdiAssocState)
   {
@@ -13847,15 +14068,15 @@
               "Join only allowed in Joining state - failure state is %d "
               "strange HAL response", pBSSSes->wdiAssocState);
 
-    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE); 
-    
+    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE);
+
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
 
   /*-----------------------------------------------------------------------
-    If assoc has failed the current session will be deleted 
+    If assoc has failed the current session will be deleted
   -----------------------------------------------------------------------*/
   if ( WDI_STATUS_SUCCESS != wdiStatus )
   {
@@ -13867,13 +14088,13 @@
 
     /*Association no longer in progress - prepare pending assoc for processing*/
     WDI_DequeueAssocRequest(pWDICtx);
-  
+
   }
   else
   {
     /*Transition to state Joining - this may be redundant as we are supposed
       to be in this state already - but just to be safe*/
-    pBSSSes->wdiAssocState = WDI_ASSOC_JOINING_ST; 
+    pBSSSes->wdiAssocState = WDI_ASSOC_JOINING_ST;
   }
 
   wpalMutexRelease(&pWDICtx->wptMutex);
@@ -13881,40 +14102,40 @@
   /*Notify UMAC*/
   wdiJoinRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessJoinRsp*/
 
 
 /**
- @brief Process Config BSS Response function (called when a 
+ @brief Process Config BSS Response 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 
-  
+
+ @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_ProcessConfigBSSRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_ConfigBSSRspParamsType    wdiConfigBSSParams;
   WDI_ConfigBSSRspCb            wdiConfigBSSRspCb;
-  wpt_uint8                     ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                     ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*           pBSSSes             = NULL;
 
-  tConfigBssRspMsg              halConfigBssRspMsg; 
+  tConfigBssRspMsg              halConfigBssRspMsg;
   WDI_AddStaParams              wdiBcastAddSTAParam = {0};
   WDI_AddStaParams              wdiAddSTAParam = {0};
-  
+
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -13922,141 +14143,141 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiConfigBSSRspCb = (WDI_ConfigBSSRspCb)pWDICtx->pfncRspCB;
 
   /*-------------------------------------------------------------------------
-    Extract response and send it to UMAC 
+    Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halConfigBssRspMsg.configBssRspParams, 
-                   pEventData->pEventData, 
+  wpalMemoryCopy( &halConfigBssRspMsg.configBssRspParams,
+                   pEventData->pEventData,
                    sizeof(halConfigBssRspMsg.configBssRspParams));
 
   wdiConfigBSSParams.wdiStatus = WDI_HAL_2_WDI_STATUS(
                             halConfigBssRspMsg.configBssRspParams.status);
   if(WDI_STATUS_SUCCESS == wdiConfigBSSParams.wdiStatus)
   {
-    wpalMemoryCopy( wdiConfigBSSParams.macBSSID, 
+    wpalMemoryCopy( wdiConfigBSSParams.macBSSID,
                     pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.macBSSID,
                     WDI_MAC_ADDR_LEN);
-  
+
     wdiConfigBSSParams.ucBSSIdx = halConfigBssRspMsg.configBssRspParams.bssIdx;
-  
-    wdiConfigBSSParams.ucBcastSig = 
+
+    wdiConfigBSSParams.ucBcastSig =
        halConfigBssRspMsg.configBssRspParams.bcastDpuSignature;
-  
-    wdiConfigBSSParams.ucUcastSig = 
+
+    wdiConfigBSSParams.ucUcastSig =
        halConfigBssRspMsg.configBssRspParams.ucastDpuSignature;
-  
+
     wdiConfigBSSParams.ucSTAIdx = halConfigBssRspMsg.configBssRspParams.bssStaIdx;
-  
+
   #ifdef WLAN_FEATURE_VOWIFI
-    wdiConfigBSSParams.ucTxMgmtPower = 
+    wdiConfigBSSParams.ucTxMgmtPower =
                                halConfigBssRspMsg.configBssRspParams.txMgmtPower;
   #endif
      wpalMemoryCopy( wdiConfigBSSParams.macSTA,
                      halConfigBssRspMsg.configBssRspParams.staMac,
                      WDI_MAC_ADDR_LEN );
-  
+
     wpalMutexAcquire(&pWDICtx->wptMutex);
     /*------------------------------------------------------------------------
-      Find the BSS for which the request is made 
+      Find the BSS for which the request is made
     ------------------------------------------------------------------------*/
-    ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
-                                               wdiConfigBSSParams.macBSSID, 
-                                              &pBSSSes); 
-  
+    ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx,
+                                               wdiConfigBSSParams.macBSSID,
+                                              &pBSSSes);
+
     /*-----------------------------------------------------------------------
       Config BSS response can only be received for an existing assoc that
-      is current and in progress 
+      is current and in progress
       -----------------------------------------------------------------------*/
     if ( NULL == pBSSSes )
     {
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
                 "Association sequence for this BSS does not yet exist "
                 "- mysterious HAL response");
-  
-      WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE); 
-      
+
+      WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE);
+
       wpalMutexRelease(&pWDICtx->wptMutex);
-      return WDI_STATUS_E_NOT_ALLOWED; 
+      return WDI_STATUS_E_NOT_ALLOWED;
     }
-  
+
     /*Save data for this BSS*/
     pBSSSes->wdiBssType = pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.wdiBSSType;
     pBSSSes->ucBSSIdx = halConfigBssRspMsg.configBssRspParams.bssIdx;
-    pBSSSes->bcastDpuIndex     = 
+    pBSSSes->bcastDpuIndex     =
       halConfigBssRspMsg.configBssRspParams.bcastDpuDescIndx;
-    pBSSSes->bcastDpuSignature = 
+    pBSSSes->bcastDpuSignature =
       halConfigBssRspMsg.configBssRspParams.bcastDpuSignature;
-    pBSSSes->bcastMgmtDpuIndex = 
+    pBSSSes->bcastMgmtDpuIndex =
       halConfigBssRspMsg.configBssRspParams.mgmtDpuDescIndx;
-    pBSSSes->bcastMgmtDpuSignature = 
+    pBSSSes->bcastMgmtDpuSignature =
       halConfigBssRspMsg.configBssRspParams.mgmtDpuSignature;
-    pBSSSes->ucRmfEnabled      = 
+    pBSSSes->ucRmfEnabled      =
       pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.ucRMFEnabled;
     pBSSSes->bcastStaIdx =
        halConfigBssRspMsg.configBssRspParams.bssBcastStaIdx;
-  
+
     /* !TO DO: Shuould we be updating the RMF Capability of self STA here? */
-  
+
     /*-------------------------------------------------------------------------
         Add Peer STA
       -------------------------------------------------------------------------*/
-    wdiAddSTAParam.ucSTAIdx = halConfigBssRspMsg.configBssRspParams.bssStaIdx; 
+    wdiAddSTAParam.ucSTAIdx = halConfigBssRspMsg.configBssRspParams.bssStaIdx;
     wdiAddSTAParam.dpuIndex = halConfigBssRspMsg.configBssRspParams.dpuDescIndx;
     wdiAddSTAParam.dpuSig   = halConfigBssRspMsg.configBssRspParams.ucastDpuSignature;
-     
+
      /*This info can be retrieved from the cached initial request*/
-    wdiAddSTAParam.ucWmmEnabled = 
+    wdiAddSTAParam.ucWmmEnabled =
         pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.wdiSTAContext.ucWMMEnabled;
-    wdiAddSTAParam.ucHTCapable  = 
-        pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.wdiSTAContext.ucHTCapable; 
-    wdiAddSTAParam.ucStaType    = 
-        pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.wdiSTAContext.wdiSTAType;  
-  
+    wdiAddSTAParam.ucHTCapable  =
+        pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.wdiSTAContext.ucHTCapable;
+    wdiAddSTAParam.ucStaType    =
+        pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.wdiSTAContext.wdiSTAType;
+
      /* MAC Address of STA */
-    wpalMemoryCopy(wdiAddSTAParam.staMacAddr, 
-                   halConfigBssRspMsg.configBssRspParams.staMac, 
+    wpalMemoryCopy(wdiAddSTAParam.staMacAddr,
+                   halConfigBssRspMsg.configBssRspParams.staMac,
                    WDI_MAC_ADDR_LEN);
-  
-    wpalMemoryCopy(wdiAddSTAParam.macBSSID, 
-                   pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.wdiSTAContext.macBSSID , 
-                   WDI_MAC_ADDR_LEN); 
-     
+
+    wpalMemoryCopy(wdiAddSTAParam.macBSSID,
+                   pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.wdiSTAContext.macBSSID ,
+                   WDI_MAC_ADDR_LEN);
+
     /*Add BSS specific parameters*/
-    wdiAddSTAParam.bcastMgmtDpuIndex     = 
+    wdiAddSTAParam.bcastMgmtDpuIndex     =
         halConfigBssRspMsg.configBssRspParams.mgmtDpuDescIndx;
-    wdiAddSTAParam.bcastMgmtDpuSignature = 
+    wdiAddSTAParam.bcastMgmtDpuSignature =
         halConfigBssRspMsg.configBssRspParams.mgmtDpuSignature;
-    wdiAddSTAParam.bcastDpuIndex         = 
+    wdiAddSTAParam.bcastDpuIndex         =
         halConfigBssRspMsg.configBssRspParams.bcastDpuDescIndx;
-    wdiAddSTAParam.bcastDpuSignature     = 
+    wdiAddSTAParam.bcastDpuSignature     =
         halConfigBssRspMsg.configBssRspParams.bcastDpuSignature;
-    wdiAddSTAParam.ucRmfEnabled          =  
+    wdiAddSTAParam.ucRmfEnabled          =
         pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.ucRMFEnabled;
-    wdiAddSTAParam.ucBSSIdx = 
+    wdiAddSTAParam.ucBSSIdx =
        halConfigBssRspMsg.configBssRspParams.bssIdx;
-  
+
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
                 "Add STA to the table index: %d", wdiAddSTAParam.ucSTAIdx );
-  
+
     WDI_STATableAddSta(pWDICtx,&wdiAddSTAParam);
     /*-------------------------------------------------------------------------
         Add Broadcast STA only in AP mode
       -------------------------------------------------------------------------*/
-    if( pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.ucOperMode == 
+    if( pWDICtx->wdiCachedConfigBssReq.wdiReqInfo.ucOperMode ==
         WDI_BSS_OPERATIONAL_MODE_AP )
     {
        WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
                   "Add BCAST STA to table for index: %d",
                   halConfigBssRspMsg.configBssRspParams.bssBcastStaIdx );
-  
-       wpalMemoryCopy( &wdiBcastAddSTAParam, &wdiAddSTAParam, 
+
+       wpalMemoryCopy( &wdiBcastAddSTAParam, &wdiAddSTAParam,
                        sizeof(WDI_AddStaParams) );
-  
+
        WDI_AddBcastSTAtoSTATable( pWDICtx, &wdiBcastAddSTAParam,
                                   halConfigBssRspMsg.configBssRspParams.bssBcastStaIdx );
     }
@@ -14067,10 +14288,10 @@
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
                   "Config BSS RSP failed with status : %s(%d)",
                   WDI_getHALStatusMsgString(
-                  halConfigBssRspMsg.configBssRspParams.status), 
+                  halConfigBssRspMsg.configBssRspParams.status),
                   halConfigBssRspMsg.configBssRspParams.status);
 
-    
+
     /*Association was failed by HAL - remove session*/
     WDI_DeleteSession(pWDICtx, pBSSSes);
 
@@ -14085,37 +14306,37 @@
   /*Notify UMAC*/
   wdiConfigBSSRspCb( &wdiConfigBSSParams, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessConfigBSSRsp*/
 
 
 /**
  @brief Process Del BSS Response 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 
-  
+
+ @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_ProcessDelBSSRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_DelBSSRspParamsType       wdiDelBSSParams;
   WDI_DelBSSRspCb               wdiDelBSSRspCb;
-  wpt_uint8                     ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                     ucCurrentBSSSesIdx  = 0;
   WDI_BSSSessionType*           pBSSSes             = NULL;
 
-  tDeleteBssRspMsg              halDelBssRspMsg; 
+  tDeleteBssRspMsg              halDelBssRspMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14123,34 +14344,34 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiDelBSSRspCb = (WDI_DelBSSRspCb)pWDICtx->pfncRspCB;
 
   /*-------------------------------------------------------------------------
-    Extract response and send it to UMAC 
+    Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halDelBssRspMsg.deleteBssRspParams, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halDelBssRspMsg.deleteBssRspParams,
+                  pEventData->pEventData,
                   sizeof(halDelBssRspMsg.deleteBssRspParams));
 
 
   wdiDelBSSParams.wdiStatus   =   WDI_HAL_2_WDI_STATUS(
-                                 halDelBssRspMsg.deleteBssRspParams.status); 
+                                 halDelBssRspMsg.deleteBssRspParams.status);
 
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSessionByBSSIdx( pWDICtx, 
-                             halDelBssRspMsg.deleteBssRspParams.bssIdx, 
-                             &pBSSSes); 
+  ucCurrentBSSSesIdx = WDI_FindAssocSessionByBSSIdx( pWDICtx,
+                             halDelBssRspMsg.deleteBssRspParams.bssIdx,
+                             &pBSSSes);
 
   /*-----------------------------------------------------------------------
     Del BSS response can only be received for an existing assoc that
-    is current and in progress 
+    is current and in progress
     -----------------------------------------------------------------------*/
   if ( NULL == pBSSSes )
   {
@@ -14158,23 +14379,24 @@
               "Association sequence for this BSS does not yet exist or "
               "association no longer in progress - mysterious HAL response");
 
-    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE); 
-    
+    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE);
+
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*Extract BSSID for the response to UMAC*/
-  wpalMemoryCopy(wdiDelBSSParams.macBSSID, 
+  wpalMemoryCopy(wdiDelBSSParams.macBSSID,
                  pBSSSes->macBSSID, WDI_MAC_ADDR_LEN);
 
   wdiDelBSSParams.ucBssIdx = halDelBssRspMsg.deleteBssRspParams.bssIdx;
 
   /*-----------------------------------------------------------------------
-    The current session will be deleted 
+    The current session will be deleted
   -----------------------------------------------------------------------*/
   WDI_DeleteSession(pWDICtx, pBSSSes);
 
+
   /* Delete the BCAST STA entry from the STA table if SAP/GO session is deleted */
   if(WDI_INFRA_AP_MODE == pBSSSes->wdiBssType)
   {
@@ -14183,41 +14405,41 @@
   
    /* Delete the STA's in this BSS */
   WDI_STATableBSSDelSta(pWDICtx, halDelBssRspMsg.deleteBssRspParams.bssIdx);
-  
+
   wpalMutexRelease(&pWDICtx->wptMutex);
 
   /*Notify UMAC*/
   wdiDelBSSRspCb( &wdiDelBSSParams, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessDelBSSRsp*/
 
 /**
  @brief Process Post Assoc 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 
-  
+
+ @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_ProcessPostAssocRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_PostAssocRspParamsType    wdiPostAssocParams;
   WDI_PostAssocRspCb            wdiPostAssocRspCb;
-  wpt_uint8                     ucCurrentBSSSesIdx     = 0; 
+  wpt_uint8                     ucCurrentBSSSesIdx     = 0;
   WDI_BSSSessionType*           pBSSSes                = NULL;
-  tPostAssocRspMsg              halPostAssocRspMsg; 
+  tPostAssocRspMsg              halPostAssocRspMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14225,7 +14447,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiPostAssocRspCb = (WDI_PostAssocRspCb)pWDICtx->pfncRspCB;
@@ -14233,81 +14455,81 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halPostAssocRspMsg.postAssocRspParams, 
-                   pEventData->pEventData, 
+  wpalMemoryCopy( &halPostAssocRspMsg.postAssocRspParams,
+                   pEventData->pEventData,
                    sizeof(halPostAssocRspMsg.postAssocRspParams));
 
   /*Extract the Post Assoc STA Params */
 
-  wdiPostAssocParams.staParams.ucSTAIdx   = 
+  wdiPostAssocParams.staParams.ucSTAIdx   =
     halPostAssocRspMsg.postAssocRspParams.configStaRspParams.staIdx;
-  wdiPostAssocParams.staParams.ucUcastSig = 
+  wdiPostAssocParams.staParams.ucUcastSig =
     halPostAssocRspMsg.postAssocRspParams.configStaRspParams.ucUcastSig;
-  wdiPostAssocParams.staParams.ucBcastSig = 
+  wdiPostAssocParams.staParams.ucBcastSig =
     halPostAssocRspMsg.postAssocRspParams.configStaRspParams.ucBcastSig;
 
- wdiPostAssocParams.wdiStatus = 
-    WDI_HAL_2_WDI_STATUS(halPostAssocRspMsg.postAssocRspParams.configStaRspParams.status); 
+ wdiPostAssocParams.wdiStatus =
+    WDI_HAL_2_WDI_STATUS(halPostAssocRspMsg.postAssocRspParams.configStaRspParams.status);
 
  /*Copy the MAC addresses from the cached storage in the WDI CB as they are not
    included in the response */
-  wpalMemoryCopy( wdiPostAssocParams.staParams.macSTA, 
-                  pWDICtx->wdiCachedPostAssocReq.wdiSTAParams.macSTA, 
+  wpalMemoryCopy( wdiPostAssocParams.staParams.macSTA,
+                  pWDICtx->wdiCachedPostAssocReq.wdiSTAParams.macSTA,
                   WDI_MAC_ADDR_LEN);
 
   /* Extract Post Assoc BSS Params */
 
-  wpalMemoryCopy( wdiPostAssocParams.bssParams.macBSSID, 
-                  pWDICtx->wdiCachedPostAssocReq.wdiBSSParams.macBSSID, 
-                  WDI_MAC_ADDR_LEN); 
+  wpalMemoryCopy( wdiPostAssocParams.bssParams.macBSSID,
+                  pWDICtx->wdiCachedPostAssocReq.wdiBSSParams.macBSSID,
+                  WDI_MAC_ADDR_LEN);
 
   /*Copy the MAC addresses from the cached storage in the WDI CB as they are not
    included in the response */
-  wpalMemoryCopy( wdiPostAssocParams.bssParams.macSTA, 
+  wpalMemoryCopy( wdiPostAssocParams.bssParams.macSTA,
                   pWDICtx->wdiCachedPostAssocReq.wdiBSSParams.wdiSTAContext
                   .macSTA, WDI_MAC_ADDR_LEN);
 
-  wdiPostAssocParams.bssParams.ucBcastSig = 
+  wdiPostAssocParams.bssParams.ucBcastSig =
      halPostAssocRspMsg.postAssocRspParams.configStaRspParams.ucBcastSig;
 
-  wdiPostAssocParams.bssParams.ucUcastSig = 
+  wdiPostAssocParams.bssParams.ucUcastSig =
      halPostAssocRspMsg.postAssocRspParams.configStaRspParams.ucUcastSig;
 
   wdiPostAssocParams.bssParams.ucBSSIdx =
      halPostAssocRspMsg.postAssocRspParams.configBssRspParams.bssIdx;
 
-  wdiPostAssocParams.bssParams.ucSTAIdx = 
+  wdiPostAssocParams.bssParams.ucSTAIdx =
      halPostAssocRspMsg.postAssocRspParams.configBssRspParams.bssStaIdx;
 
   wpalMutexAcquire(&pWDICtx->wptMutex);
 
   /*------------------------------------------------------------------------
-    Find the BSS for which the request is made 
+    Find the BSS for which the request is made
   ------------------------------------------------------------------------*/
-  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
+  ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx,
                                              wdiPostAssocParams.bssParams.
-                                             macBSSID, &pBSSSes); 
+                                             macBSSID, &pBSSSes);
 
   /*-----------------------------------------------------------------------
     Post assoc response can only be received for an existing assoc that
-    is current and in progress 
+    is current and in progress
     -----------------------------------------------------------------------*/
   if (( NULL == pBSSSes ) ||
-      ( ucCurrentBSSSesIdx != pWDICtx->ucCurrentBSSSesIdx ) || 
+      ( ucCurrentBSSSesIdx != pWDICtx->ucCurrentBSSSesIdx ) ||
       ( eWLAN_PAL_FALSE == pWDICtx->bAssociationInProgress ))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
               "Association sequence for this BSS does not yet exist or "
               "association no longer in progress - mysterious HAL response");
 
-    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE); 
-    
+    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE);
+
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*-----------------------------------------------------------------------
-    Post Assoc Request is only allowed in Joining state 
+    Post Assoc Request is only allowed in Joining state
   -----------------------------------------------------------------------*/
   if ( WDI_ASSOC_JOINING_ST != pBSSSes->wdiAssocState)
   {
@@ -14315,14 +14537,14 @@
               "Post Assoc not allowed before JOIN - failing request "
               "strange HAL response");
 
-    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE); 
-    
+    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE);
+
     wpalMutexRelease(&pWDICtx->wptMutex);
-    return WDI_STATUS_E_NOT_ALLOWED; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
   /*-----------------------------------------------------------------------
-    If assoc has failed the current session will be deleted 
+    If assoc has failed the current session will be deleted
   -----------------------------------------------------------------------*/
   if ( WDI_STATUS_SUCCESS != wdiPostAssocParams.wdiStatus )
   {
@@ -14332,19 +14554,19 @@
   else
   {
     /*Transition to state POST Assoc*/
-    pBSSSes->wdiAssocState = WDI_ASSOC_POST_ST; 
+    pBSSSes->wdiAssocState = WDI_ASSOC_POST_ST;
 
     /*Save DPU Info*/
-    pBSSSes->bcastMgmtDpuIndex     = 
+    pBSSSes->bcastMgmtDpuIndex     =
       halPostAssocRspMsg.postAssocRspParams.configBssRspParams.mgmtDpuDescIndx;
-    pBSSSes->bcastMgmtDpuSignature = 
+    pBSSSes->bcastMgmtDpuSignature =
       halPostAssocRspMsg.postAssocRspParams.configBssRspParams.mgmtDpuSignature;
-    pBSSSes->bcastDpuIndex         = 
+    pBSSSes->bcastDpuIndex         =
       halPostAssocRspMsg.postAssocRspParams.configBssRspParams.bcastDpuDescIndx;
-    pBSSSes->bcastDpuSignature     = 
+    pBSSSes->bcastDpuSignature     =
       halPostAssocRspMsg.postAssocRspParams.configBssRspParams.bcastDpuSignature;
 
-    pBSSSes->ucBSSIdx              = 
+    pBSSSes->ucBSSIdx              =
       halPostAssocRspMsg.postAssocRspParams.configBssRspParams.bssIdx;
   }
 
@@ -14359,22 +14581,22 @@
   /*Notify UMAC*/
   wdiPostAssocRspCb( &wdiPostAssocParams, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessPostAssocRsp*/
 
 /**
- @brief Process Del STA Rsp function (called when a response is 
+ @brief Process Del STA 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 
-  
+
+ @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_ProcessDelSTARsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -14382,11 +14604,11 @@
   WDI_DelSTARspParamsType   wdiDelSTARsp;
   WDI_DelSTARspCb           wdiDelSTARspCb;
   wpt_uint8                 staType;
-  tDeleteStaRspMsg          halDelStaRspMsg; 
+  tDeleteStaRspMsg          halDelStaRspMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14394,7 +14616,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiDelSTARspCb = (WDI_DelSTARspCb)pWDICtx->pfncRspCB;
@@ -14403,12 +14625,12 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   wpalMemoryCopy( &halDelStaRspMsg.delStaRspParams,
-                  pEventData->pEventData, 
+                  pEventData->pEventData,
                   sizeof(halDelStaRspMsg.delStaRspParams));
 
   wdiDelSTARsp.ucSTAIdx    = halDelStaRspMsg.delStaRspParams.staId;
-  wdiDelSTARsp.wdiStatus   =   
-    WDI_HAL_2_WDI_STATUS(halDelStaRspMsg.delStaRspParams.status); 
+  wdiDelSTARsp.wdiStatus   =
+    WDI_HAL_2_WDI_STATUS(halDelStaRspMsg.delStaRspParams.status);
 
   WDI_STATableGetStaType(pWDICtx, wdiDelSTARsp.ucSTAIdx, &staType);
 
@@ -14443,27 +14665,27 @@
   /*Notify UMAC*/
   wdiDelSTARspCb( &wdiDelSTARsp, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessDelSTARsp*/
 
 
 /*==========================================================================
-                   Security Response Processing Functions 
+                   Security Response Processing Functions
 ==========================================================================*/
 
 /**
  @brief Process Set BSS Key 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 
-  
+
+ @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_ProcessSetBssKeyRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -14474,7 +14696,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14482,7 +14704,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiSetBSSKeyRspCb = (WDI_SetBSSKeyRspCb)pWDICtx->pfncRspCB;
@@ -14491,7 +14713,7 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   if ( eHAL_STATUS_SUCCESS != halStatus )
   {
@@ -14505,22 +14727,22 @@
   /*Notify UMAC*/
   wdiSetBSSKeyRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetBssKeyRsp*/
 
 /**
  @brief Process Remove BSS Key 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 
-  
+
+ @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_ProcessRemoveBssKeyRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -14531,7 +14753,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14539,7 +14761,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiRemoveBSSKeyRspCb = (WDI_RemoveBSSKeyRspCb)pWDICtx->pfncRspCB;
@@ -14548,7 +14770,7 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   if ( eHAL_STATUS_SUCCESS != halStatus )
   {
@@ -14562,23 +14784,23 @@
   /*Notify UMAC*/
   wdiRemoveBSSKeyRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetBssKeyRsp*/
 
 
 /**
  @brief Process Set STA Key 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 
-  
+
+ @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_ProcessSetStaKeyRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -14589,7 +14811,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14597,7 +14819,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiSetSTAKeyRspCb = (WDI_SetSTAKeyRspCb)pWDICtx->pfncRspCB;
@@ -14606,7 +14828,7 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   if ( eHAL_STATUS_SUCCESS != halStatus )
   {
@@ -14620,22 +14842,22 @@
   /*Notify UMAC*/
   wdiSetSTAKeyRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetSTAKeyRsp*/
 
 /**
- @brief Process Remove STA Key Rsp function (called when a 
+ @brief Process Remove STA Key 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 
-  
+
+ @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_ProcessRemoveStaKeyRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -14646,7 +14868,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14654,7 +14876,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiRemoveSTAKeyRspCb = (WDI_RemoveSTAKeyRspCb)pWDICtx->pfncRspCB;
@@ -14663,7 +14885,7 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   if ( eHAL_STATUS_SUCCESS != halStatus )
   {
@@ -14677,22 +14899,22 @@
   /*Notify UMAC*/
   wdiRemoveSTAKeyRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessRemoveStaKeyRsp*/
 
 /**
- @brief Process Set STA Bcast Key Rsp function (called when a 
+ @brief Process Set STA Bcast Key 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 
-  
+
+ @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_ProcessSetStaBcastKeyRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -14703,7 +14925,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14711,7 +14933,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiSetSTABcastKeyRspCb = (WDI_SetSTAKeyRspCb)pWDICtx->pfncRspCB;
@@ -14719,11 +14941,11 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halStatus, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halStatus,
+                  pEventData->pEventData,
                   sizeof(halStatus));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   if ( eHAL_STATUS_SUCCESS != halStatus )
   {
@@ -14737,22 +14959,22 @@
   /*Notify UMAC*/
   wdiSetSTABcastKeyRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetSTABcastKeyRsp*/
 
 /**
  @brief Process Remove STA Bcast Key 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 
-  
+
+ @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_ProcessRemoveStaBcastKeyRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -14763,7 +14985,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14771,7 +14993,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiRemoveSTABcastKeyRspCb = (WDI_RemoveSTAKeyRspCb)pWDICtx->pfncRspCB;
@@ -14779,11 +15001,11 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halStatus, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halStatus,
+                  pEventData->pEventData,
                   sizeof(halStatus));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   if ( eHAL_STATUS_SUCCESS != halStatus )
   {
@@ -14797,27 +15019,27 @@
   /*Notify UMAC*/
   wdiRemoveSTABcastKeyRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessRemoveStaBcastKeyRsp*/
 
 
 /*==========================================================================
-                   QoS and BA Response Processing Functions 
+                   QoS and BA Response Processing Functions
 ==========================================================================*/
 
 /**
  @brief Process Add TSpec 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 
-  
+
+ @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_ProcessAddTSpecRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -14828,7 +15050,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14836,7 +15058,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiAddTsRspCb = (WDI_AddTsRspCb)pWDICtx->pfncRspCB;
@@ -14845,28 +15067,28 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiAddTsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessAddTSpecRsp*/
 
 
 /**
  @brief Process Del TSpec 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 
-  
+
+ @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_ProcessDelTSpecRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -14877,7 +15099,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14885,7 +15107,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiDelTsRspCb = (WDI_DelTsRspCb)pWDICtx->pfncRspCB;
@@ -14894,27 +15116,27 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiDelTsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessDelTSpecRsp*/
 
 /**
- @brief Process Update EDCA Parameters Rsp function (called when a  
+ @brief Process Update EDCA Parameters 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 
-  
+
+ @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_ProcessUpdateEDCAParamsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -14925,7 +15147,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14933,7 +15155,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiUpdateEDCAParamsRspCb = (WDI_UpdateEDCAParamsRspCb)pWDICtx->pfncRspCB;
@@ -14942,28 +15164,28 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiUpdateEDCAParamsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessUpdateEDCAParamsRsp*/
 
 
 /**
  @brief Process Add BA 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 
-  
+
+ @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_ProcessAddBASessionRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -14973,11 +15195,11 @@
   tAddBASessionRspParams        halBASessionRsp;
   WDI_AddBASessionRspParamsType wdiBASessionRsp;
 
-  
+
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -14985,7 +15207,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiAddBASessionRspCb = (WDI_AddBASessionRspCb)pWDICtx->pfncRspCB;
@@ -14993,8 +15215,8 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halBASessionRsp, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halBASessionRsp,
+                  pEventData->pEventData,
                   sizeof(halBASessionRsp));
 
   wdiBASessionRsp.wdiStatus = WDI_HAL_2_WDI_STATUS(halBASessionRsp.status);
@@ -15013,23 +15235,23 @@
   /*Notify UMAC*/
   wdiAddBASessionRspCb( &wdiBASessionRsp, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessAddSessionBARsp*/
 
 
 /**
  @brief Process Del BA 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 
-  
+
+ @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_ProcessDelBARsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15040,7 +15262,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -15048,7 +15270,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiDelBARspCb = (WDI_DelBARspCb)pWDICtx->pfncRspCB;
@@ -15057,7 +15279,7 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   if ( eHAL_STATUS_SUCCESS == halStatus )
   {
@@ -15067,7 +15289,7 @@
   /*Notify UMAC*/
   wdiDelBARspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessDelBARsp*/
 
 #ifdef FEATURE_WLAN_CCX
@@ -15141,16 +15363,16 @@
 /**
  @brief Process Flush AC 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 
-  
+
+ @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_ProcessFlushAcRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15161,7 +15383,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -15169,7 +15391,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiFlushAcRspCb = (WDI_FlushAcRspCb)pWDICtx->pfncRspCB;
@@ -15177,31 +15399,31 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halStatus, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halStatus,
+                  pEventData->pEventData,
                   sizeof(halStatus));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiFlushAcRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessFlushAcRsp*/
 
 /**
- @brief Process BT AMP event Rsp function (called when a 
+ @brief Process BT AMP event 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 
-  
+
+ @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_ProcessBtAmpEventRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15212,7 +15434,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData))
@@ -15220,7 +15442,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiBtAmpEventRspCb = (WDI_BtAmpEventRspCb)pWDICtx->pfncRspCB;
@@ -15228,32 +15450,32 @@
    /*-------------------------------------------------------------------------
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
-   wpalMemoryCopy( &halStatus, 
-                   pEventData->pEventData, 
+   wpalMemoryCopy( &halStatus,
+                   pEventData->pEventData,
                    sizeof(halStatus));
 
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiBtAmpEventRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessBtAmpEventRsp*/
 
 
 /**
- @brief Process ADD STA SELF Rsp function (called 
+ @brief Process ADD STA SELF 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 
-  
+
+ @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_ProcessAddSTASelfRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15265,7 +15487,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -15273,28 +15495,28 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  wdiAddSTASelfReqParamsRspCb = 
+  wdiAddSTASelfReqParamsRspCb =
                          (WDI_AddSTASelfParamsRspCb)pWDICtx->pfncRspCB;
 
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halAddStaSelfRsp.addStaSelfRspParams, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halAddStaSelfRsp.addStaSelfRspParams,
+                  pEventData->pEventData,
                   sizeof(halAddStaSelfRsp.addStaSelfRspParams));
 
 
-  wdiAddSTASelfParams.wdiStatus   =   
-    WDI_HAL_2_WDI_STATUS(halAddStaSelfRsp.addStaSelfRspParams.status); 
+  wdiAddSTASelfParams.wdiStatus   =
+    WDI_HAL_2_WDI_STATUS(halAddStaSelfRsp.addStaSelfRspParams.status);
 
-  wdiAddSTASelfParams.ucSTASelfIdx   = 
+  wdiAddSTASelfParams.ucSTASelfIdx   =
     halAddStaSelfRsp.addStaSelfRspParams.selfStaIdx;
-  wdiAddSTASelfParams.dpuIdx = 
+  wdiAddSTASelfParams.dpuIdx =
     halAddStaSelfRsp.addStaSelfRspParams.dpuIdx;
-  wdiAddSTASelfParams.dpuSignature = 
+  wdiAddSTASelfParams.dpuSignature =
     halAddStaSelfRsp.addStaSelfRspParams.dpuSignature;
 
   wpalMemoryCopy(wdiAddSTASelfParams.macSelfSta,
@@ -15313,7 +15535,7 @@
   //all DPU indices are the same for self STA
 
   /*DPU Information*/
-  wdiAddSTAParam.dpuIndex              = wdiAddSTASelfParams.dpuIdx; 
+  wdiAddSTAParam.dpuIndex              = wdiAddSTASelfParams.dpuIdx;
   wdiAddSTAParam.dpuSig                = wdiAddSTASelfParams.dpuSignature;
   wdiAddSTAParam.bcastDpuSignature     = wdiAddSTASelfParams.dpuSignature;
   wdiAddSTAParam.bcastMgmtDpuSignature = wdiAddSTASelfParams.dpuSignature;
@@ -15326,7 +15548,7 @@
   wdiAddSTAParam.ucStaType = WDI_STA_ENTRY_SELF; /* 0 - self */
   wdiAddSTAParam.ucSTAIdx = wdiAddSTASelfParams.ucSTASelfIdx;
 
-  if(halAddStaSelfRsp.addStaSelfRspParams.status 
+  if(halAddStaSelfRsp.addStaSelfRspParams.status
      != eHAL_STATUS_ADD_STA_SELF_IGNORED_REF_COUNT_NOT_ZERO)
   {
      (void)WDI_STATableAddSta(pWDICtx,&wdiAddSTAParam);
@@ -15336,24 +15558,24 @@
   /*Notify UMAC*/
   wdiAddSTASelfReqParamsRspCb( &wdiAddSTASelfParams, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessAddSTASelfRsp*/
 
 
 
 /**
- @brief WDI_ProcessDelSTASelfRsp function (called when a 
+ @brief WDI_ProcessDelSTASelfRsp 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 
-  
+
+ @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_ProcessDelSTASelfRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15366,7 +15588,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
     -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -15374,7 +15596,7 @@
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
     WDI_ASSERT(0);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   wdiDelStaSelfRspCb = (WDI_DelSTASelfRspCb)pWDICtx->pfncRspCB;
@@ -15383,19 +15605,19 @@
     Extract response and send it to UMAC
     -------------------------------------------------------------------------*/
 
-  wpalMemoryCopy( &delStaSelfRspParams, 
+  wpalMemoryCopy( &delStaSelfRspParams,
                         (wpt_uint8*)pEventData->pEventData,
                               sizeof(tDelStaSelfRspParams));
 
-  wdiDelStaSelfRspParams.wdiStatus   =   
-    WDI_HAL_2_WDI_STATUS(delStaSelfRspParams.status); 
+  wdiDelStaSelfRspParams.wdiStatus   =
+    WDI_HAL_2_WDI_STATUS(delStaSelfRspParams.status);
 
-  /* delStaSelfRspParams.status is not 
+  /* delStaSelfRspParams.status is not
    eHAL_STATUS_DEL_STA_SELF_IGNORED_REF_COUNT_NOT_ZERO*/
   if( eHAL_STATUS_SUCCESS == delStaSelfRspParams.status )
   {
     WDI_Status wdiStatus;
-    wdiStatus = WDI_STATableFindStaidByAddr(pWDICtx, 
+    wdiStatus = WDI_STATableFindStaidByAddr(pWDICtx,
                                delStaSelfRspParams.selfMacAddr,
                                &ucStaIdx);
     if(WDI_STATUS_E_FAILURE == wdiStatus)
@@ -15403,7 +15625,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
                  "%s: Unable to extract the STA Idx ", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
     }
     WDI_STATableDelSta(pWDICtx, ucStaIdx);
   }
@@ -15414,25 +15636,95 @@
   return WDI_STATUS_SUCCESS;
 }
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
+/**
+ @brief Start Oem Data 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
+*/
+#define OFFSET_OF(structType,fldName)   (&((structType*)0)->fldName)
+
+WDI_Status
+WDI_ProcessStartOemDataRsp
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+)
+{
+  WDI_oemDataRspCb           wdiOemDataRspCb;
+  WDI_oemDataRspParamsType*  wdiOemDataRspParams;
+  tStartOemDataRspParams*    halStartOemDataRspParams;
+
+  /*-------------------------------------------------------------------------
+    Sanity check
+  -------------------------------------------------------------------------*/
+  if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
+      ( NULL == pEventData->pEventData))
+  {
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+                 "%s: Invalid parameters", __FUNCTION__);
+     WDI_ASSERT(0);
+     return WDI_STATUS_E_FAILURE;
+  }
+
+  wdiOemDataRspCb = (WDI_oemDataRspCb)pWDICtx->pfncRspCB;
+
+   /*-------------------------------------------------------------------------
+     Extract response and send it to UMAC
+   -------------------------------------------------------------------------*/
+  halStartOemDataRspParams = (tStartOemDataRspParams *)pEventData->pEventData;
+
+
+  //It is the responsibility of the application code to check for failure
+  //conditions!
+
+  //Allocate memory for WDI OEM DATA RSP structure
+  wdiOemDataRspParams = wpalMemoryAllocate(sizeof(WDI_oemDataRspParamsType)) ;
+
+  if(NULL == wdiOemDataRspParams)
+  {
+    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
+            "Failed to allocate memory in OEM DATA Response %x %x %x ",
+                pWDICtx, pEventData, pEventData->pEventData);
+    WDI_ASSERT(0);
+    return WDI_STATUS_E_FAILURE;
+  }
+
+  /* Populate WDI structure members */
+  wpalMemoryCopy(wdiOemDataRspParams->oemDataRsp, halStartOemDataRspParams->oemDataRsp, OEM_DATA_RSP_SIZE);
+
+  /*Notify UMAC*/
+  wdiOemDataRspCb(wdiOemDataRspParams, pWDICtx->pRspCBUserData);
+
+  //Free memory allocated for WDI OEM_DATA MEAS RSP structure
+  wpalMemoryFree(wdiOemDataRspParams);
+
+  return WDI_STATUS_SUCCESS;
+}/*WDI_PrcoessStartOemDataRsp*/
+#endif
 
 /*===========================================================================
-           Miscellaneous Control Response Processing API 
+           Miscellaneous Control Response Processing API
 ===========================================================================*/
 
 /**
  @brief Process Channel Switch 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 
-  
+
+ @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_ProcessChannelSwitchRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15443,7 +15735,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -15451,7 +15743,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiChSwitchRspCb = (WDI_SwitchChRspCb)pWDICtx->pfncRspCB;
@@ -15459,38 +15751,38 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halSwitchChannelRsp, 
+  wpalMemoryCopy( &halSwitchChannelRsp,
                   (wpt_uint8*)pEventData->pEventData,
                   sizeof(halSwitchChannelRsp));
 
-  wdiSwitchChRsp.wdiStatus   =  
-               WDI_HAL_2_WDI_STATUS(halSwitchChannelRsp.status); 
+  wdiSwitchChRsp.wdiStatus   =
+               WDI_HAL_2_WDI_STATUS(halSwitchChannelRsp.status);
   wdiSwitchChRsp.ucChannel = halSwitchChannelRsp.channelNumber;
 
 #ifdef WLAN_FEATURE_VOWIFI
-  wdiSwitchChRsp.ucTxMgmtPower =  halSwitchChannelRsp.txMgmtPower; 
+  wdiSwitchChRsp.ucTxMgmtPower =  halSwitchChannelRsp.txMgmtPower;
 #endif
 
   /*Notify UMAC*/
   wdiChSwitchRspCb( &wdiSwitchChRsp, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessChannelSwitchRsp*/
 
 
 /**
  @brief Process Config STA 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 
-  
+
+ @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_ProcessConfigStaRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15500,13 +15792,13 @@
   WDI_AddStaParams              wdiAddSTAParam;
 
   WDI_BSSSessionType*           pBSSSes             = NULL;
-  wpt_uint8                     ucCurrentBSSSesIdx  = 0; 
+  wpt_uint8                     ucCurrentBSSSesIdx  = 0;
 
-  tConfigStaRspMsg              halConfigStaRsp; 
+  tConfigStaRspMsg              halConfigStaRsp;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -15514,7 +15806,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiConfigSTARspCb = (WDI_ConfigSTARspCb)pWDICtx->pfncRspCB;
@@ -15522,8 +15814,8 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halConfigStaRsp.configStaRspParams, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halConfigStaRsp.configStaRspParams,
+                  pEventData->pEventData,
                   sizeof(halConfigStaRsp.configStaRspParams));
 
 
@@ -15536,11 +15828,11 @@
    /* MAC Address of STA - take from cache as it does not come back in the
    response*/
    wpalMemoryCopy( wdiCfgSTAParams.macSTA,
-          pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.macSTA, 
+          pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.macSTA,
           WDI_MAC_ADDR_LEN);
-  
-  wdiCfgSTAParams.wdiStatus   =   
-    WDI_HAL_2_WDI_STATUS(halConfigStaRsp.configStaRspParams.status); 
+
+  wdiCfgSTAParams.wdiStatus   =
+    WDI_HAL_2_WDI_STATUS(halConfigStaRsp.configStaRspParams.status);
 
   wdiCfgSTAParams.ucDpuIndex = halConfigStaRsp.configStaRspParams.dpuIndex;
   wdiCfgSTAParams.ucBcastDpuIndex = halConfigStaRsp.configStaRspParams.bcastDpuIndex;
@@ -15551,71 +15843,71 @@
     if ( WDI_ADD_STA == pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.wdiAction )
     {
       /* ADD STA to table */
-      wdiAddSTAParam.ucSTAIdx = halConfigStaRsp.configStaRspParams.staIdx; 
+      wdiAddSTAParam.ucSTAIdx = halConfigStaRsp.configStaRspParams.staIdx;
       wdiAddSTAParam.dpuSig   = halConfigStaRsp.configStaRspParams.ucUcastSig;
       wdiAddSTAParam.dpuIndex = halConfigStaRsp.configStaRspParams.dpuIndex;
-       
+
       /*This info can be retrieved from the cached initial request*/
-      wdiAddSTAParam.ucWmmEnabled = 
+      wdiAddSTAParam.ucWmmEnabled =
         pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.ucWMMEnabled;
-      wdiAddSTAParam.ucHTCapable  = 
-        pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.ucHTCapable; 
-      wdiAddSTAParam.ucStaType    = 
-        pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.wdiSTAType;  
-   
+      wdiAddSTAParam.ucHTCapable  =
+        pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.ucHTCapable;
+      wdiAddSTAParam.ucStaType    =
+        pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.wdiSTAType;
+
       /* MAC Address of STA */
-      wpalMemoryCopy(wdiAddSTAParam.staMacAddr, 
-                     pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.macSTA, 
+      wpalMemoryCopy(wdiAddSTAParam.staMacAddr,
+                     pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.macSTA,
                      WDI_MAC_ADDR_LEN);
-  
-      wpalMemoryCopy(wdiAddSTAParam.macBSSID, 
-                     pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.macBSSID , 
-                     WDI_MAC_ADDR_LEN); 
-  
-      ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
-                    pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.macBSSID, 
-                    &pBSSSes);  
+
+      wpalMemoryCopy(wdiAddSTAParam.macBSSID,
+                     pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.macBSSID ,
+                     WDI_MAC_ADDR_LEN);
+
+      ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx,
+                    pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.macBSSID,
+                    &pBSSSes);
 
       if ( NULL == pBSSSes )
       {
         WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
                   "Association for this BSSID is not in place");
-    
+
         WDI_ASSERT(0);
-        return WDI_STATUS_E_NOT_ALLOWED; 
+        return WDI_STATUS_E_NOT_ALLOWED;
       }
 
       /*Add BSS specific parameters*/
-      wdiAddSTAParam.bcastMgmtDpuIndex = 
+      wdiAddSTAParam.bcastMgmtDpuIndex =
          halConfigStaRsp.configStaRspParams.bcastMgmtDpuIdx;
-      wdiAddSTAParam.bcastMgmtDpuSignature = 
+      wdiAddSTAParam.bcastMgmtDpuSignature =
          halConfigStaRsp.configStaRspParams.ucMgmtSig;
-      wdiAddSTAParam.bcastDpuIndex  = 
+      wdiAddSTAParam.bcastDpuIndex  =
          halConfigStaRsp.configStaRspParams.bcastDpuIndex;
-      wdiAddSTAParam.bcastDpuSignature = 
+      wdiAddSTAParam.bcastDpuSignature =
          halConfigStaRsp.configStaRspParams.ucBcastSig;
       wdiAddSTAParam.ucRmfEnabled          = pBSSSes->ucRmfEnabled;
       wdiAddSTAParam.ucBSSIdx              = ucCurrentBSSSesIdx;
-      
+
       WDI_STATableAddSta(pWDICtx,&wdiAddSTAParam);
     }
     if( WDI_UPDATE_STA == pWDICtx->wdiCachedConfigStaReq.wdiReqInfo.wdiAction )
     {
        WDI_StaStruct* pSTATable = (WDI_StaStruct*) pWDICtx->staTable;
 
-       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].bcastDpuIndex = 
+       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].bcastDpuIndex =
           halConfigStaRsp.configStaRspParams.bcastDpuIndex;
-       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].bcastDpuSignature = 
+       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].bcastDpuSignature =
           halConfigStaRsp.configStaRspParams.ucBcastSig;
-       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].bcastMgmtDpuIndex = 
+       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].bcastMgmtDpuIndex =
           halConfigStaRsp.configStaRspParams.bcastMgmtDpuIdx;
-       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].bcastMgmtDpuSignature = 
+       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].bcastMgmtDpuSignature =
           halConfigStaRsp.configStaRspParams.ucMgmtSig;
-       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].bssIdx = 
+       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].bssIdx =
           halConfigStaRsp.configStaRspParams.bssIdx;
-       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].dpuIndex = 
+       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].dpuIndex =
           halConfigStaRsp.configStaRspParams.dpuIndex;
-       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].dpuSig = 
+       pSTATable[halConfigStaRsp.configStaRspParams.staIdx].dpuSig =
           halConfigStaRsp.configStaRspParams.ucUcastSig;
     }
   }
@@ -15623,23 +15915,23 @@
   /*Notify UMAC*/
   wdiConfigSTARspCb( &wdiCfgSTAParams, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessConfigStaRsp*/
 
 
 /**
- @brief Process Set Link State Rsp function (called when a 
+ @brief Process Set Link State 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 
-  
+
+ @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_ProcessSetLinkStateRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15649,11 +15941,11 @@
   WDI_SetLinkStateRspCb   wdiSetLinkStateRspCb;
 
   WDI_BSSSessionType*     pBSSSes              = NULL;
-  wpt_uint8               ucCurrentBSSSesIdx   = 0; 
+  wpt_uint8               ucCurrentBSSSesIdx   = 0;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -15661,7 +15953,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiSetLinkStateRspCb = (WDI_SetLinkStateRspCb)pWDICtx->pfncRspCB;
@@ -15671,19 +15963,19 @@
   /*If the link is being transitioned to idle - the BSS is to be deleted
   - this type of ending a session is possible when UMAC has failed an
   - association session during Join*/
-  if ( WDI_LINK_IDLE_STATE == 
+  if ( WDI_LINK_IDLE_STATE ==
        pWDICtx->wdiCacheSetLinkStReq.wdiLinkInfo.wdiLinkState )
   {
     /*------------------------------------------------------------------------
-      Find the BSS for which the request is made 
+      Find the BSS for which the request is made
     ------------------------------------------------------------------------*/
-    ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
-                        pWDICtx->wdiCacheSetLinkStReq.wdiLinkInfo.macBSSID, 
-                        &pBSSSes); 
-  
+    ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx,
+                        pWDICtx->wdiCacheSetLinkStReq.wdiLinkInfo.macBSSID,
+                        &pBSSSes);
+
     /*-----------------------------------------------------------------------
       Del BSS response can only be received for an existing assoc that
-      is current and in progress 
+      is current and in progress
       -----------------------------------------------------------------------*/
     if ( NULL == pBSSSes )
     {
@@ -15699,7 +15991,7 @@
          ( WDI_BTAMP_AP_MODE != pBSSSes->wdiBssType ))
       {
          /*-----------------------------------------------------------------------
-           The current session will be deleted 
+           The current session will be deleted
          -----------------------------------------------------------------------*/
          WDI_DeleteSession(pWDICtx, pBSSSes);
 
@@ -15708,7 +16000,7 @@
            flag as this has ended
          -----------------------------------------------------------------------*/
          if ( ucCurrentBSSSesIdx == pWDICtx->ucCurrentBSSSesIdx )
-         {  
+         {
            /*Association no longer in progress  */
            pWDICtx->bAssociationInProgress = eWLAN_PAL_FALSE;
            /*Association no longer in progress - prepare pending assoc for processing*/
@@ -15719,7 +16011,7 @@
   }
   /* If the link state has been set to POST ASSOC, reset the "association in
      progress" flag */
-  if ( WDI_LINK_POSTASSOC_STATE == 
+  if ( WDI_LINK_POSTASSOC_STATE ==
        pWDICtx->wdiCacheSetLinkStReq.wdiLinkInfo.wdiLinkState )
   {
      pWDICtx->bAssociationInProgress = eWLAN_PAL_FALSE;
@@ -15731,31 +16023,31 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halStatus, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halStatus,
+                  pEventData->pEventData,
                   sizeof(halStatus));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiSetLinkStateRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetLinkStateRsp*/
 
 /**
- @brief Process Get Stats Rsp function (called when a response is   
+ @brief Process Get Stats 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 
-  
+
+ @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_ProcessGetStatsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15763,11 +16055,11 @@
   WDI_GetStatsRspParamsType   *wdiGetStatsRsp;
   WDI_GetStatsRspCb           wdiGetStatsRspCb;
   tHalStatsRspParams*         pHalStatsRspParams;
-  
+
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -15775,7 +16067,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
@@ -15794,7 +16086,7 @@
                 "Failed to allocate memory in Get Stats Response %x %x %x ",
                  pWDICtx, pEventData, pEventData->pEventData);
     WDI_ASSERT(0);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   wdiGetStatsRspCb = (WDI_GetStatsRspCb)pWDICtx->pfncRspCB;
@@ -15816,23 +16108,23 @@
 
   wpalMemoryFree(wdiGetStatsRsp);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessGetStatsRsp*/
 
 
 /**
- @brief Process Update Cfg Rsp function (called when a response is  
+ @brief Process Update Cfg 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 
-  
+
+ @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_ProcessUpdateCfgRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15843,7 +16135,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -15851,7 +16143,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiUpdateCfgRspCb = (WDI_UpdateCfgRspCb)pWDICtx->pfncRspCB;
@@ -15860,12 +16152,12 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiUpdateCfgRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessUpdateCfgRsp*/
 
 
@@ -15873,16 +16165,16 @@
 /**
  @brief Process Add BA 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 
-  
+
+ @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_ProcessAddBARsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15895,7 +16187,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -15903,7 +16195,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiAddBARspCb = (WDI_AddBARspCb)pWDICtx->pfncRspCB;
@@ -15911,8 +16203,8 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halAddBARsp, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halAddBARsp,
+                  pEventData->pEventData,
                   sizeof(halAddBARsp));
 
   wdiAddBARsp.wdiStatus = WDI_HAL_2_WDI_STATUS(halAddBARsp.status);
@@ -15925,22 +16217,22 @@
   /*Notify UMAC*/
   wdiAddBARspCb( &wdiAddBARsp, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessAddSessionBARsp*/
 
 /**
  @brief Process Add BA 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 
-  
+
+ @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_ProcessTriggerBARsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -15953,11 +16245,11 @@
   WDI_TriggerBARspCandidateType* wdiTriggerBARspCandidate;
   wpt_uint16                     index;
   wpt_uint16                     TidIndex;
-  
+
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -15965,7 +16257,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiTriggerBARspCb = (WDI_TriggerBARspCb)pWDICtx->pfncRspCB;
@@ -15975,8 +16267,8 @@
   -------------------------------------------------------------------------*/
   halTriggerBARsp = (tTriggerBARspParams *)pEventData->pEventData;
 
-  wdiTriggerBARsp = wpalMemoryAllocate(sizeof(WDI_TriggerBARspParamsType) + 
-                      halTriggerBARsp->baCandidateCnt * 
+  wdiTriggerBARsp = wpalMemoryAllocate(sizeof(WDI_TriggerBARspParamsType) +
+                      halTriggerBARsp->baCandidateCnt *
                       sizeof(WDI_TriggerBARspCandidateType));
   if(NULL == wdiTriggerBARsp)
   {
@@ -15985,7 +16277,7 @@
                  pWDICtx, pEventData, pEventData->pEventData);
     wpalMemoryFree(halTriggerBARsp);
     WDI_ASSERT(0);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   wdiTriggerBARsp->wdiStatus = WDI_HAL_2_WDI_STATUS(halTriggerBARsp->status);
@@ -15993,7 +16285,7 @@
   if ( WDI_STATUS_SUCCESS == wdiTriggerBARsp->wdiStatus)
   {
     wdiTriggerBARsp->usBaCandidateCnt = halTriggerBARsp->baCandidateCnt;
-    wpalMemoryCopy(wdiTriggerBARsp->macBSSID, 
+    wpalMemoryCopy(wdiTriggerBARsp->macBSSID,
                                  halTriggerBARsp->bssId , WDI_MAC_ADDR_LEN);
 
     wdiTriggerBARspCandidate = (WDI_TriggerBARspCandidateType*)(wdiTriggerBARsp + 1);
@@ -16001,13 +16293,13 @@
 
     for(index = 0; index < wdiTriggerBARsp->usBaCandidateCnt; index++)
     {
-      wpalMemoryCopy(wdiTriggerBARspCandidate->macSTA, 
+      wpalMemoryCopy(wdiTriggerBARspCandidate->macSTA,
                                   halBaCandidate->staAddr, WDI_MAC_ADDR_LEN);
       for(TidIndex = 0; TidIndex < STA_MAX_TC; TidIndex++)
       {
-        wdiTriggerBARspCandidate->wdiBAInfo[TidIndex].fBaEnable = 
+        wdiTriggerBARspCandidate->wdiBAInfo[TidIndex].fBaEnable =
                             halBaCandidate->baInfo[TidIndex].fBaEnable;
-        wdiTriggerBARspCandidate->wdiBAInfo[TidIndex].startingSeqNum = 
+        wdiTriggerBARspCandidate->wdiBAInfo[TidIndex].startingSeqNum =
                             halBaCandidate->baInfo[TidIndex].startingSeqNum;
       }
       wdiTriggerBARspCandidate++;
@@ -16019,22 +16311,22 @@
   wdiTriggerBARspCb( wdiTriggerBARsp, pWDICtx->pRspCBUserData);
 
   wpalMemoryFree(wdiTriggerBARsp);
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessAddSessionBARsp*/
 
 /**
  @brief Process Update Beacon Params 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 
-  
+
+ @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_ProcessUpdateBeaconParamsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16045,7 +16337,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16053,7 +16345,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiUpdateBeaconParamsRspCb = (WDI_UpdateBeaconParamsRspCb)pWDICtx->pfncRspCB;
@@ -16061,31 +16353,31 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halStatus, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halStatus,
+                  pEventData->pEventData,
                   sizeof(halStatus));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiUpdateBeaconParamsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessUpdateBeaconParamsRsp*/
 
 /**
  @brief Process Send Beacon template 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 
-  
+
+ @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_ProcessSendBeaconParamsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16096,7 +16388,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16104,7 +16396,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiSendBeaconParamsRspCb = (WDI_SendBeaconParamsRspCb)pWDICtx->pfncRspCB;
@@ -16112,32 +16404,32 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halStatus, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halStatus,
+                  pEventData->pEventData,
                   sizeof(halStatus));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiSendBeaconParamsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSendBeaconParamsRsp*/
 
-  
+
 /**
- @brief Process Update Probe Resp Template Rsp function (called 
+ @brief Process Update Probe Resp Template 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 
-  
+
+ @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_ProcessUpdateProbeRspTemplateRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16148,7 +16440,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16156,7 +16448,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiUpdProbeRspTemplRspCb = (WDI_UpdateProbeRspTemplateRspCb)pWDICtx->pfncRspCB;
@@ -16164,44 +16456,44 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halStatus, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halStatus,
+                  pEventData->pEventData,
                   sizeof(halStatus));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiUpdProbeRspTemplRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessUpdateProbeRspTemplateRsp*/
 
   /**
  @brief Process Set Max Tx Power 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 
-  
+
+ @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_ProcessSetMaxTxPowerRsp
-( 
+(
   WDI_ControlBlockType*          pWDICtx,
   WDI_EventInfoType*             pEventData
 )
 {
   tSetMaxTxPwrRspMsg             halTxpowerrsp;
-  
+
   WDI_SetMaxTxPowerRspMsg        wdiSetMaxTxPowerRspMsg;
-  
+
   WDA_SetMaxTxPowerRspCb         wdiReqStatusCb;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16209,7 +16501,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiReqStatusCb = (WDA_SetMaxTxPowerRspCb)pWDICtx->pfncRspCB;
@@ -16217,42 +16509,42 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halTxpowerrsp.setMaxTxPwrRspParams, 
-                           pEventData->pEventData, 
-                           sizeof(halTxpowerrsp.setMaxTxPwrRspParams)); 
+  wpalMemoryCopy( &halTxpowerrsp.setMaxTxPwrRspParams,
+                           pEventData->pEventData,
+                           sizeof(halTxpowerrsp.setMaxTxPwrRspParams));
 
   if ( eHAL_STATUS_SUCCESS != halTxpowerrsp.setMaxTxPwrRspParams.status )
   {
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_ERROR,
               "Error status returned in Set Max Tx Power Response ");
-     WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE); 
-     return WDI_STATUS_E_FAILURE; 
+     WDI_DetectedDeviceError( pWDICtx, WDI_ERR_BASIC_OP_FAILURE);
+     return WDI_STATUS_E_FAILURE;
   }
 
-  wdiSetMaxTxPowerRspMsg.wdiStatus = 
+  wdiSetMaxTxPowerRspMsg.wdiStatus =
          WDI_HAL_2_WDI_STATUS(halTxpowerrsp.setMaxTxPwrRspParams.status);
-  wdiSetMaxTxPowerRspMsg.ucPower  = halTxpowerrsp.setMaxTxPwrRspParams.power; 
+  wdiSetMaxTxPowerRspMsg.ucPower  = halTxpowerrsp.setMaxTxPwrRspParams.power;
 
   /*Notify UMAC*/
   wdiReqStatusCb( &wdiSetMaxTxPowerRspMsg, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }
 
 #ifdef WLAN_FEATURE_P2P
 /**
- @brief Process P2P Group Owner Notice Of Absense Rsp function (called 
+ @brief Process P2P Group Owner Notice Of Absense 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 
-  
+
+ @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_ProcessP2PGONOARsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16263,7 +16555,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16271,7 +16563,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiP2PGONOAReqParamsRspCb = (WDI_SetP2PGONOAReqParamsRspCb)pWDICtx->pfncRspCB;
@@ -16279,31 +16571,31 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halStatus, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halStatus,
+                  pEventData->pEventData,
                   sizeof(halStatus));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiP2PGONOAReqParamsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessP2PGONOARsp*/
 #endif
 /**
- @brief Process Enter IMPS Rsp function (called when a response 
+ @brief Process Enter IMPS 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 
-  
+
+ @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_ProcessEnterImpsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16314,7 +16606,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16322,7 +16614,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiEnterImpsRspCb = (WDI_EnterImpsRspCb)pWDICtx->pfncRspCB;
@@ -16332,27 +16624,27 @@
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiEnterImpsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessEnterImpsRsp*/
 
 /**
- @brief Process Exit IMPS Rsp function (called when a response 
+ @brief Process Exit IMPS 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 
-  
+
+ @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_ProcessExitImpsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16363,7 +16655,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16371,7 +16663,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiExitImpsRspCb = (WDI_ExitImpsRspCb)pWDICtx->pfncRspCB;
@@ -16380,7 +16672,7 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   // notify DTS that we are entering Full power
   WDTS_SetPowerState(pWDICtx, WDTS_POWER_STATE_FULL, NULL);
@@ -16388,22 +16680,22 @@
   /*Notify UMAC*/
   wdiExitImpsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessExitImpsRsp*/
 
 /**
- @brief Process Enter BMPS Rsp function (called when a response 
+ @brief Process Enter BMPS 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 
-  
+
+ @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_ProcessEnterBmpsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16414,7 +16706,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16422,7 +16714,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiEnterBmpsRspCb = (WDI_EnterBmpsRspCb)pWDICtx->pfncRspCB;
@@ -16431,27 +16723,27 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiEnterBmpsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessEnterBmpsRsp*/
 
 /**
- @brief Process Exit BMPS Rsp function (called when a response 
+ @brief Process Exit BMPS 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 
-  
+
+ @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_ProcessExitBmpsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16462,7 +16754,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16470,7 +16762,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiExitBmpsRspCb = (WDI_ExitBmpsRspCb)pWDICtx->pfncRspCB;
@@ -16479,7 +16771,7 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   // notify DTS that we are entering Full power
   WDTS_SetPowerState(pWDICtx, WDTS_POWER_STATE_FULL, NULL);
@@ -16489,22 +16781,22 @@
   /*Notify UMAC*/
   wdiExitBmpsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessExitBmpsRsp*/
 
 /**
  @brief Process Enter UAPSD 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 
-  
+
+ @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_ProcessEnterUapsdRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16515,7 +16807,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16523,7 +16815,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiEnterUapsdRspCb = (WDI_EnterUapsdRspCb)pWDICtx->pfncRspCB;
@@ -16532,7 +16824,7 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   if(WDI_STATUS_SUCCESS == wdiStatus)
   {
@@ -16551,22 +16843,22 @@
   /*Notify UMAC*/
   wdiEnterUapsdRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessEnterUapsdRsp*/
 
 /**
- @brief Process Exit UAPSD Rsp function (called when a response 
+ @brief Process Exit UAPSD 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 
-  
+
+ @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_ProcessExitUapsdRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16577,7 +16869,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16585,7 +16877,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiExitUapsdRspCb = (WDI_ExitUapsdRspCb)pWDICtx->pfncRspCB;
@@ -16594,7 +16886,7 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    // Restore back the DPU routing flag in the TxBD, for DPU to push the TxBDs to BTQM
    // directly instead of the FW WQ.
@@ -16608,22 +16900,22 @@
   /*Notify UMAC*/
   wdiExitUapsdRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessExitUapsdRsp*/
 
 /**
- @brief Process set UAPSD params Rsp function (called when a 
+ @brief Process set UAPSD params 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 
-  
+
+ @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_ProcessSetUapsdAcParamsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16634,7 +16926,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16642,7 +16934,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiSetUapsdAcParamsCb = (WDI_SetUapsdAcParamsCb)pWDICtx->pfncRspCB;
@@ -16651,27 +16943,27 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiSetUapsdAcParamsCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetUapsdAcParamsRsp*/
 
 /**
- @brief Process update UAPSD params Rsp function (called when a 
+ @brief Process update UAPSD params 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 
-  
+
+ @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_ProcessUpdateUapsdParamsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16682,7 +16974,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16690,7 +16982,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiUpdateUapsdParamsCb = (WDI_UpdateUapsdParamsCb)pWDICtx->pfncRspCB;
@@ -16699,27 +16991,27 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiUpdateUapsdParamsCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessUpdateUapsdParamsRsp*/
 
 /**
  @brief Process Configure RXP filter 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 
-  
+
+ @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_ProcessConfigureRxpFilterRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16730,7 +17022,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -16738,7 +17030,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiConfigureRxpFilterCb = (WDI_ConfigureRxpFilterCb)pWDICtx->pfncRspCB;
@@ -16747,27 +17039,27 @@
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   wdiConfigureRxpFilterCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessConfigureRxpFilterRsp*/
 
 /**
  @brief Process Set beacon filter 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 
-  
+
+ @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_ProcessSetBeaconFilterRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16778,7 +17070,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData))
@@ -16786,7 +17078,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiBeaconFilterCb = (WDI_SetBeaconFilterCb)pWDICtx->pfncRspCB;
@@ -16795,27 +17087,27 @@
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiBeaconFilterCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetBeaconFilterRsp*/
 
 /**
  @brief Process remove beacon filter 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 
-  
+
+ @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_ProcessRemBeaconFilterRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16826,7 +17118,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData))
@@ -16834,7 +17126,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiBeaconFilterCb = (WDI_RemBeaconFilterCb)pWDICtx->pfncRspCB;
@@ -16843,27 +17135,27 @@
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiBeaconFilterCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessRemBeaconFilterRsp*/
 
 /**
  @brief Process set RSSI thresholds 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 
-  
+
+ @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_ProcessSetRSSIThresoldsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16874,7 +17166,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData))
@@ -16882,7 +17174,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiRSSIThresholdsCb = (WDI_SetRSSIThresholdsCb)pWDICtx->pfncRspCB;
@@ -16891,27 +17183,27 @@
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiRSSIThresholdsCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetRSSIThresoldsRsp*/
 
 /**
  @brief Process host offload 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 
-  
+
+ @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_ProcessHostOffloadRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16922,7 +17214,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData))
@@ -16930,7 +17222,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiHostOffloadCb = (WDI_HostOffloadCb)pWDICtx->pfncRspCB;
@@ -16939,27 +17231,27 @@
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiHostOffloadCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessHostOffloadRsp*/
 
 /**
  @brief Process keep alive 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 
-  
+
+ @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_ProcessKeepAliveRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -16973,7 +17265,7 @@
 
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData))
@@ -16981,36 +17273,36 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wdiKeepAliveCb = (WDI_KeepAliveCb)pWDICtx->pfncRspCB; 
-   
+   wdiKeepAliveCb = (WDI_KeepAliveCb)pWDICtx->pfncRspCB;
+
    /*-------------------------------------------------------------------------
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiKeepAliveCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessKeepAliveRsp*/
 
 /**
  @brief Process wowl add ptrn 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 
-  
+
+ @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_ProcessWowlAddBcPtrnRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17021,7 +17313,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData))
@@ -17029,7 +17321,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiWowlAddBcPtrnCb = (WDI_WowlAddBcPtrnCb)pWDICtx->pfncRspCB;
@@ -17038,27 +17330,27 @@
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiWowlAddBcPtrnCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessWowlAddBcPtrnRsp*/
 
 /**
- @brief Process wowl delete ptrn Rsp function (called when a 
+ @brief Process wowl delete ptrn 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 
-  
+
+ @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_ProcessWowlDelBcPtrnRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17069,7 +17361,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData))
@@ -17077,7 +17369,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiWowlDelBcPtrnCb = (WDI_WowlDelBcPtrnCb)pWDICtx->pfncRspCB;
@@ -17086,27 +17378,27 @@
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiWowlDelBcPtrnCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessWowlDelBcPtrnRsp*/
 
 /**
- @brief Process wowl enter Rsp function (called when a response 
+ @brief Process wowl enter 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 
-  
+
+ @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_ProcessWowlEnterRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17117,7 +17409,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData))
@@ -17125,7 +17417,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiWowlEnterCb = (WDI_WowlEnterReqCb)pWDICtx->pfncRspCB;
@@ -17134,27 +17426,27 @@
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiWowlEnterCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessWowlEnterRsp*/
 
 /**
- @brief Process wowl exit Rsp function (called when a response 
+ @brief Process wowl exit 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 
-  
+
+ @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_ProcessWowlExitRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17165,7 +17457,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData))
@@ -17173,7 +17465,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiWowlExitCb = (WDI_WowlExitReqCb)pWDICtx->pfncRspCB;
@@ -17182,28 +17474,28 @@
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiWowlExitCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessWowlExitRsp*/
 
 /**
- @brief Process Configure Apps CPU wakeup State Rsp function 
+ @brief Process Configure Apps CPU wakeup State 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 
-  
+
+ @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_ProcessConfigureAppsCpuWakeupStateRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17214,7 +17506,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData))
@@ -17222,7 +17514,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiConfigureAppsCpuWakeupStateCb = (WDI_ConfigureAppsCpuWakeupStateCb)pWDICtx->pfncRspCB;
@@ -17231,28 +17523,28 @@
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiConfigureAppsCpuWakeupStateCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessConfigureAppsCpuWakeupStateRsp*/
 
 
 /**
  @brief Process Nv download(called when a response
         is being received over the bus from HAL,will check if the responce is )
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessNvDownloadRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17263,7 +17555,7 @@
   WDI_NvDownloadRspInfoType wdiNvDownloadRsp;
 
   /*-------------------------------------------------------------------------
-   Sanity check 
+   Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
     ( NULL == pEventData->pEventData))
@@ -17271,24 +17563,24 @@
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
     WDI_ASSERT(0);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halNvDownloadRsp, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halNvDownloadRsp,
+                  pEventData->pEventData,
                   sizeof(halNvDownloadRsp));
 
   wdiNvDownloadRsp.wdiStatus = WDI_HAL_2_WDI_STATUS(halNvDownloadRsp.status);
 
   if((wdiNvDownloadRsp.wdiStatus == WDI_STATUS_SUCCESS) &&
-    (pWDICtx->wdiNvBlobInfo.usCurrentFragment != 
-         pWDICtx->wdiNvBlobInfo.usTotalFragment )) 
+    (pWDICtx->wdiNvBlobInfo.usCurrentFragment !=
+         pWDICtx->wdiNvBlobInfo.usTotalFragment ))
   {
     WDI_NvDownloadReq(&pWDICtx->wdiCachedNvDownloadReq,
-       (WDI_NvDownloadRspCb)pWDICtx->pfncRspCB, pWDICtx->pRspCBUserData); 
+       (WDI_NvDownloadRspCb)pWDICtx->pfncRspCB, pWDICtx->pRspCBUserData);
   }
   else
   {
@@ -17301,22 +17593,22 @@
     wdiNvDownloadRspCb( &wdiNvDownloadRsp, pWDICtx->pRspCBUserData);
   }
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }
 #ifdef WLAN_FEATURE_VOWIFI_11R
 /**
  @brief Process Add TSpec 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 
-  
+
+ @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_ProcessAggrAddTSpecRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17327,7 +17619,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -17335,7 +17627,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   wdiAggrAddTsRspCb = (WDI_AddTsRspCb)pWDICtx->pfncRspCB;
@@ -17343,33 +17635,33 @@
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &aggrAddTsRsp, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &aggrAddTsRsp,
+                  pEventData->pEventData,
                   sizeof(aggrAddTsRsp));
 
   /* What is the difference between status0 and status1? */
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(aggrAddTsRsp.status0); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(aggrAddTsRsp.status0);
 
   /*Notify UMAC*/
   wdiAggrAddTsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessAddTSpecRsp*/
 #endif /* WLAN_FEATURE_VOWIFI_11R */
 
 /**
- @brief WDI_ProcessHostResumeRsp function (called when a 
+ @brief WDI_ProcessHostResumeRsp 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 
-  
+
+ @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_ProcessHostResumeRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17380,7 +17672,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
     -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -17388,7 +17680,7 @@
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
     WDI_ASSERT(0);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   wdiHostResumeRspCb = (WDI_HostResumeEventRspCb)pWDICtx->pfncRspCB;
@@ -17397,12 +17689,12 @@
     Extract response and send it to UMAC
     -------------------------------------------------------------------------*/
 
-  wpalMemoryCopy( &hostResumeRspMsg, 
+  wpalMemoryCopy( &hostResumeRspMsg,
       (wpt_uint8*)pEventData->pEventData,
       sizeof(hostResumeRspMsg));
 
-  wdiResumeRspParams.wdiStatus   =   
-    WDI_HAL_2_WDI_STATUS(hostResumeRspMsg.status); 
+  wdiResumeRspParams.wdiStatus   =
+    WDI_HAL_2_WDI_STATUS(hostResumeRspMsg.status);
 
   /*Notify UMAC*/
   wdiHostResumeRspCb(&wdiResumeRspParams, (void*) pWDICtx->pRspCBUserData);
@@ -17411,18 +17703,18 @@
 }
 
 /**
- @brief Process Set Tx PER Rsp function (called when a response 
+ @brief Process Set Tx PER 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 
-  
+
+ @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_ProcessSetTxPerTrackingRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17433,7 +17725,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -17441,40 +17733,40 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
-  
-  pwdiSetTxPerTrackingRspCb = (WDI_SetTxPerTrackingRspCb)pWDICtx->pfncRspCB; 
+
+  pwdiSetTxPerTrackingRspCb = (WDI_SetTxPerTrackingRspCb)pWDICtx->pfncRspCB;
 
   /*-------------------------------------------------------------------------
     Extract response and send it to UMAC
   -------------------------------------------------------------------------*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Notify UMAC*/
   pwdiSetTxPerTrackingRspCb( wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetTxPerTrackingRsp*/
 
 /*==========================================================================
                         Indications from HAL
  ==========================================================================*/
 /**
- @brief Process Low RSSI Indication function (called when an 
+ @brief Process Low RSSI 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 
-  
+
+ @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_ProcessLowRSSIInd
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17484,7 +17776,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -17492,14 +17784,14 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
     Extract indication and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( (void *)&halRSSINotificationIndMsg.rssiNotificationParams, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( (void *)&halRSSINotificationIndMsg.rssiNotificationParams,
+                  pEventData->pEventData,
                   sizeof(tHalRSSINotification));
 
   /*Fill in the indication parameters*/
@@ -17519,25 +17811,25 @@
 
   /*Notify UMAC*/
   pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
-  
-  return WDI_STATUS_SUCCESS; 
+
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessLowRSSIInd*/
 
 
 /**
- @brief Process Missed Beacon Indication function (called when 
+ @brief Process Missed Beacon 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 
-  
+
+ @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_ProcessMissedBeaconInd
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17548,7 +17840,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -17556,7 +17848,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
@@ -17564,32 +17856,32 @@
   -------------------------------------------------------------------------*/
   /*! TO DO: Parameters need to be unpacked according to HAL struct*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Fill in the indication parameters*/
-  wdiInd.wdiIndicationType = WDI_MISSED_BEACON_IND; 
-  
+  wdiInd.wdiIndicationType = WDI_MISSED_BEACON_IND;
+
   /*Notify UMAC*/
   pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
-  
-  return WDI_STATUS_SUCCESS; 
+
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessMissedBeaconInd*/
 
 
 /**
- @brief Process Unk Addr Frame Indication function (called when 
+ @brief Process Unk Addr Frame 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 
-  
+
+ @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_ProcessUnkAddrFrameInd
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17600,7 +17892,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -17608,7 +17900,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
@@ -17616,34 +17908,34 @@
   -------------------------------------------------------------------------*/
   /*! TO DO: Parameters need to be unpacked according to HAL struct*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   /*Fill in the indication parameters*/
-  wdiInd.wdiIndicationType = WDI_UNKNOWN_ADDR2_FRAME_RX_IND; 
+  wdiInd.wdiIndicationType = WDI_UNKNOWN_ADDR2_FRAME_RX_IND;
   /* ! TO DO - fill in from HAL struct:
     wdiInd.wdiIndicationData.wdiUnkAddr2FrmInfo*/
 
   /*Notify UMAC*/
   pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
-  
-  return WDI_STATUS_SUCCESS; 
+
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessUnkAddrFrameInd*/
 
 
 /**
- @brief Process MIC Failure Indication function (called when an 
+ @brief Process MIC Failure 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 
-  
+
+ @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_ProcessMicFailureInd
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17654,7 +17946,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -17662,16 +17954,16 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
-  
+
   pHalMicFailureInd = (tpSirMicFailureInd)pEventData->pEventData;
   /*-------------------------------------------------------------------------
     Extract indication and send it to UMAC
   -------------------------------------------------------------------------*/
 
   /*Fill in the indication parameters*/
-  wdiInd.wdiIndicationType = WDI_MIC_FAILURE_IND; 
+  wdiInd.wdiIndicationType = WDI_MIC_FAILURE_IND;
   wpalMemoryCopy(wdiInd.wdiIndicationData.wdiMICFailureInfo.bssId,
                  pHalMicFailureInd->bssId, WDI_MAC_ADDR_LEN);
   wpalMemoryCopy(wdiInd.wdiIndicationData.wdiMICFailureInfo.macSrcAddr,
@@ -17680,11 +17972,11 @@
                  pHalMicFailureInd->info.taMacAddr, WDI_MAC_ADDR_LEN);
   wpalMemoryCopy(wdiInd.wdiIndicationData.wdiMICFailureInfo.macDstAddr,
                  pHalMicFailureInd->info.dstMacAddr, WDI_MAC_ADDR_LEN);
-  wdiInd.wdiIndicationData.wdiMICFailureInfo.ucMulticast = 
+  wdiInd.wdiIndicationData.wdiMICFailureInfo.ucMulticast =
                  pHalMicFailureInd->info.multicast;
-  wdiInd.wdiIndicationData.wdiMICFailureInfo.ucIV1 = 
+  wdiInd.wdiIndicationData.wdiMICFailureInfo.ucIV1 =
                  pHalMicFailureInd->info.IV1;
-  wdiInd.wdiIndicationData.wdiMICFailureInfo.keyId= 
+  wdiInd.wdiIndicationData.wdiMICFailureInfo.keyId=
                  pHalMicFailureInd->info.keyId;
   wpalMemoryCopy(wdiInd.wdiIndicationData.wdiMICFailureInfo.TSC,
                  pHalMicFailureInd->info.TSC,WDI_CIPHER_SEQ_CTR_SIZE);
@@ -17692,25 +17984,25 @@
                  pHalMicFailureInd->info.rxMacAddr, WDI_MAC_ADDR_LEN);
   /*Notify UMAC*/
   pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
-  
-  return WDI_STATUS_SUCCESS; 
+
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessMicFailureInd*/
 
 
 /**
- @brief Process Fatal Failure Indication function (called when 
+ @brief Process Fatal Failure 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 
-  
+
+ @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_ProcessFatalErrorInd
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17721,7 +18013,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -17729,7 +18021,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
@@ -17738,35 +18030,35 @@
 
   /*! TO DO: Parameters need to be unpacked according to HAL struct*/
   halStatus = *((eHalStatus*)pEventData->pEventData);
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
   WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_ERROR,
               "Fatal failure received from device %d ", halStatus );
-  
+
   /*Fill in the indication parameters*/
-  wdiInd.wdiIndicationType             = WDI_FATAL_ERROR_IND; 
-  wdiInd.wdiIndicationData.usErrorCode = WDI_ERR_DEV_INTERNAL_FAILURE; 
+  wdiInd.wdiIndicationType             = WDI_FATAL_ERROR_IND;
+  wdiInd.wdiIndicationData.usErrorCode = WDI_ERR_DEV_INTERNAL_FAILURE;
 
   /*Notify UMAC*/
   pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
-  
-  return WDI_STATUS_SUCCESS; 
+
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessFatalErrorInd*/
 
 /**
- @brief Process Delete STA Indication function (called when 
+ @brief Process Delete STA 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 
-  
+
+ @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_ProcessDelSTAInd
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17776,7 +18068,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -17784,7 +18076,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
@@ -17792,45 +18084,45 @@
   -------------------------------------------------------------------------*/
 
   /* Parameters need to be unpacked according to HAL struct*/
-  wpalMemoryCopy( &halDelSTACtx, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halDelSTACtx,
+                  pEventData->pEventData,
                   sizeof(halDelSTACtx));
 
   /*Fill in the indication parameters*/
-  wdiInd.wdiIndicationType             = WDI_DEL_STA_IND; 
+  wdiInd.wdiIndicationType             = WDI_DEL_STA_IND;
 
   wpalMemoryCopy(wdiInd.wdiIndicationData.wdiDeleteSTAIndType.macADDR2,
                  halDelSTACtx.addr2, WDI_MAC_ADDR_LEN);
   wpalMemoryCopy(wdiInd.wdiIndicationData.wdiDeleteSTAIndType.macBSSID,
                  halDelSTACtx.bssId, WDI_MAC_ADDR_LEN);
 
-  wdiInd.wdiIndicationData.wdiDeleteSTAIndType.usAssocId = 
+  wdiInd.wdiIndicationData.wdiDeleteSTAIndType.usAssocId =
     halDelSTACtx.assocId;
-  wdiInd.wdiIndicationData.wdiDeleteSTAIndType.ucSTAIdx  = 
+  wdiInd.wdiIndicationData.wdiDeleteSTAIndType.ucSTAIdx  =
     halDelSTACtx.staId;
-  wdiInd.wdiIndicationData.wdiDeleteSTAIndType.wptReasonCode = 
-    halDelSTACtx.reasonCode; 
+  wdiInd.wdiIndicationData.wdiDeleteSTAIndType.wptReasonCode =
+    halDelSTACtx.reasonCode;
 
   /*Notify UMAC*/
   pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
-  
-  return WDI_STATUS_SUCCESS; 
+
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessDelSTAInd*/
 
 /**
 *@brief Process Coex 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 
-  
+
+ @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_ProcessCoexInd
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17841,7 +18133,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData ))
@@ -17849,53 +18141,53 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT( 0 );
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
     Extract indication and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halCoexIndMsg.coexIndParams, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halCoexIndMsg.coexIndParams,
+                  pEventData->pEventData,
                   sizeof(halCoexIndMsg.coexIndParams) );
 
   /*Fill in the indication parameters*/
-  wdiInd.wdiIndicationType = WDI_COEX_IND; 
-  wdiInd.wdiIndicationData.wdiCoexInfo.coexIndType = halCoexIndMsg.coexIndParams.coexIndType; 
+  wdiInd.wdiIndicationType = WDI_COEX_IND;
+  wdiInd.wdiIndicationData.wdiCoexInfo.coexIndType = halCoexIndMsg.coexIndParams.coexIndType;
   for (index = 0; index < WDI_COEX_IND_DATA_SIZE; index++)
   {
-    wdiInd.wdiIndicationData.wdiCoexInfo.coexIndData[index] = halCoexIndMsg.coexIndParams.coexIndData[index]; 
+    wdiInd.wdiIndicationData.wdiCoexInfo.coexIndData[index] = halCoexIndMsg.coexIndParams.coexIndData[index];
   }
 
   // DEBUG
   WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_INFO,
               "[COEX WDI] Coex Ind Type (%x) data (%x %x %x %x)",
-              wdiInd.wdiIndicationData.wdiCoexInfo.coexIndType, 
-              wdiInd.wdiIndicationData.wdiCoexInfo.coexIndData[0], 
-              wdiInd.wdiIndicationData.wdiCoexInfo.coexIndData[1], 
-              wdiInd.wdiIndicationData.wdiCoexInfo.coexIndData[2], 
-              wdiInd.wdiIndicationData.wdiCoexInfo.coexIndData[3] ); 
+              wdiInd.wdiIndicationData.wdiCoexInfo.coexIndType,
+              wdiInd.wdiIndicationData.wdiCoexInfo.coexIndData[0],
+              wdiInd.wdiIndicationData.wdiCoexInfo.coexIndData[1],
+              wdiInd.wdiIndicationData.wdiCoexInfo.coexIndData[2],
+              wdiInd.wdiIndicationData.wdiCoexInfo.coexIndData[3] );
 
   /*Notify UMAC*/
   pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
-  
-  return WDI_STATUS_SUCCESS; 
+
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessCoexInd*/
 
 /**
 *@brief Process Tx Complete 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 
-  
+
+ @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_ProcessTxCompleteInd
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -17919,19 +18211,19 @@
   /*-------------------------------------------------------------------------
     Extract indication and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( &halTxComplIndMsg.txComplParams, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( &halTxComplIndMsg.txComplParams,
+                  pEventData->pEventData,
                   sizeof(halTxComplIndMsg.txComplParams) );
 
   /*Fill in the indication parameters*/
-  wdiInd.wdiIndicationType = WDI_TX_COMPLETE_IND; 
-  wdiInd.wdiIndicationData.tx_complete_status 
-                               = halTxComplIndMsg.txComplParams.status; 
+  wdiInd.wdiIndicationType = WDI_TX_COMPLETE_IND;
+  wdiInd.wdiIndicationData.tx_complete_status
+                               = halTxComplIndMsg.txComplParams.status;
 
   /*Notify UMAC*/
   pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
-  
-  return WDI_STATUS_SUCCESS; 
+
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessTxCompleteInd*/
 
 #ifdef WLAN_FEATURE_P2P
@@ -17978,17 +18270,17 @@
 
   /*Fill in the indication parameters*/
   wdiInd.wdiIndicationType = WDI_P2P_NOA_ATTR_IND;
-  
+
   wdiInd.wdiIndicationData.wdiP2pNoaAttrInfo.status
                           = halNoaAttrIndMsg.noaAttrIndParams.status;
-  
+
   wdiInd.wdiIndicationData.wdiP2pNoaAttrInfo.ucIndex
                           = halNoaAttrIndMsg.noaAttrIndParams.index;
   wdiInd.wdiIndicationData.wdiP2pNoaAttrInfo.ucOppPsFlag
                           = halNoaAttrIndMsg.noaAttrIndParams.oppPsFlag;
   wdiInd.wdiIndicationData.wdiP2pNoaAttrInfo.usCtWin
                           = halNoaAttrIndMsg.noaAttrIndParams.ctWin;
-  
+
   wdiInd.wdiIndicationData.wdiP2pNoaAttrInfo.usNoa1IntervalCnt
                           = halNoaAttrIndMsg.noaAttrIndParams.uNoa1IntervalCnt;
   wdiInd.wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Duration
@@ -17997,7 +18289,7 @@
                              = halNoaAttrIndMsg.noaAttrIndParams.uNoa1Interval;
   wdiInd.wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1StartTime
                           = halNoaAttrIndMsg.noaAttrIndParams.uNoa1StartTime;
-  
+
   wdiInd.wdiIndicationData.wdiP2pNoaAttrInfo.usNoa2IntervalCnt
                           = halNoaAttrIndMsg.noaAttrIndParams.uNoa2IntervalCnt;
   wdiInd.wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Duration
@@ -18015,52 +18307,52 @@
 #endif
 
 /**
- @brief Process Tx PER Hit Indication function (called when 
+ @brief Process Tx PER Hit 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 
-  
+
+ @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_ProcessTxPerHitInd
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
   WDI_LowLevelIndType  wdiInd;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-  
+
   /*-------------------------------------------------------------------------
     Extract indication and send it to UMAC
   -------------------------------------------------------------------------*/
   /*Fill in the indication parameters*/
-  wdiInd.wdiIndicationType = WDI_TX_PER_HIT_IND; 
-  
+  wdiInd.wdiIndicationType = WDI_TX_PER_HIT_IND;
+
   /*Notify UMAC*/
   pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessTxPerHitInd*/
 
 #ifdef ANI_MANF_DIAG
 /**
  @brief WDI_ProcessFTMCommandReq
         Process FTM Command, simply route to HAL
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessFTMCommandReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -18070,7 +18362,7 @@
   wpt_uint16              dataOffset;
   wpt_uint16              bufferSize;
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -18079,7 +18371,7 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   ftmCommandReq = (WDI_FTMCommandReqType *)pEventData->pEventData;
@@ -18108,16 +18400,16 @@
 /**
  @brief WDI_ProcessFTMCommandRsp
         Process FTM Command Response from HAL, simply route to HDD FTM
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessFTMCommandRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -18127,7 +18419,7 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -18135,36 +18427,36 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   ftmCMDRspCb = (WDI_FTMCommandRspCb)pWDICtx->pfncRspCB;
 
   ftmCMDRspData = (tProcessPttRspParams *)pEventData->pEventData;
 
-  wpalMemoryCopy((void *)pWDICtx->ucFTMCommandRspBuffer, 
-                 (void *)&ftmCMDRspData->pttMsgBuffer, 
+  wpalMemoryCopy((void *)pWDICtx->ucFTMCommandRspBuffer,
+                 (void *)&ftmCMDRspData->pttMsgBuffer,
                  ftmCMDRspData->pttMsgBuffer.msgBodyLength);
 
   /*Notify UMAC*/
   ftmCMDRspCb((void *)pWDICtx->ucFTMCommandRspBuffer, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }
 #endif /* ANI_MANF_DIAG */
 /**
  @brief WDI_ProcessHalDumpCmdReq
         Process hal dump Command, simply route to HAL
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessHALDumpCmdReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -18174,10 +18466,10 @@
   wpt_uint16               usDataOffset        = 0;
   wpt_uint16               usSendSize          = 0;
   tHalDumpCmdReqMsg        halDumpCmdReqMsg;
-  wpt_uint8*               pSendBuffer         = NULL; 
+  wpt_uint8*               pSendBuffer         = NULL;
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData) ||
@@ -18186,68 +18478,68 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   pwdiHALDumpCmdParams = (WDI_HALDumpCmdReqParamsType*)pEventData->pEventData;
   wdiHALDumpCmdRspCb   = (WDI_HALDumpCmdRspCb)pEventData->pCBfnc;
 
   /* Copying the HAL DUMP Command Information HAL Structure*/
-  halDumpCmdReqMsg.dumpCmdReqParams.argument1 = 
+  halDumpCmdReqMsg.dumpCmdReqParams.argument1 =
                 pwdiHALDumpCmdParams->wdiHALDumpCmdInfoType.command;
-  halDumpCmdReqMsg.dumpCmdReqParams.argument2 = 
+  halDumpCmdReqMsg.dumpCmdReqParams.argument2 =
                 pwdiHALDumpCmdParams->wdiHALDumpCmdInfoType.argument1;
-  halDumpCmdReqMsg.dumpCmdReqParams.argument3 = 
+  halDumpCmdReqMsg.dumpCmdReqParams.argument3 =
                 pwdiHALDumpCmdParams->wdiHALDumpCmdInfoType.argument2;
-  halDumpCmdReqMsg.dumpCmdReqParams.argument4 = 
+  halDumpCmdReqMsg.dumpCmdReqParams.argument4 =
                 pwdiHALDumpCmdParams->wdiHALDumpCmdInfoType.argument3;
-  halDumpCmdReqMsg.dumpCmdReqParams.argument5 = 
+  halDumpCmdReqMsg.dumpCmdReqParams.argument5 =
                 pwdiHALDumpCmdParams->wdiHALDumpCmdInfoType.argument4;
-  
+
   /*-----------------------------------------------------------------------
     Get message buffer
   -----------------------------------------------------------------------*/
-  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_HAL_DUMP_CMD_REQ, 
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_HAL_DUMP_CMD_REQ,
                         sizeof(halDumpCmdReqMsg.dumpCmdReqParams),
                         &pSendBuffer, &usDataOffset, &usSendSize))||
-      ( usSendSize < 
+      ( usSendSize <
             (usDataOffset + sizeof(halDumpCmdReqMsg.dumpCmdReqParams) )))
   {
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
               "Unable to get send buffer in HAL Dump Command req %x %x %x",
                 pEventData, pwdiHALDumpCmdParams, wdiHALDumpCmdRspCb);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                  &halDumpCmdReqMsg.dumpCmdReqParams, 
-                  sizeof(halDumpCmdReqMsg.dumpCmdReqParams)); 
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halDumpCmdReqMsg.dumpCmdReqParams,
+                  sizeof(halDumpCmdReqMsg.dumpCmdReqParams));
 
   pWDICtx->wdiReqStatusCB     = pwdiHALDumpCmdParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiHALDumpCmdParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiHALDumpCmdParams->pUserData;
 
   /*-------------------------------------------------------------------------
-    Send Start Request to HAL 
+    Send Start Request to HAL
   -------------------------------------------------------------------------*/
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiHALDumpCmdRspCb, pEventData->pUserData, 
-                        WDI_HAL_DUMP_CMD_RESP); 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiHALDumpCmdRspCb, pEventData->pUserData,
+                        WDI_HAL_DUMP_CMD_RESP);
 }
 
 /**
  @brief WDI_ProcessHalDumpCmdRsp
-        Process hal Dump Command Response from HAL, simply route to HDD 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+        Process hal Dump Command Response from HAL, simply route to HDD
+
+ @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_ProcessHALDumpCmdRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -18257,7 +18549,7 @@
   WDI_HALDumpCmdRspParamsType wdiHALDumpCmdRsp;
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData))
@@ -18265,19 +18557,19 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT(0);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
-  wdiHALDumpCmdRspCb = (WDI_HALDumpCmdRspCb)pWDICtx->pfncRspCB; 
+  wdiHALDumpCmdRspCb = (WDI_HALDumpCmdRspCb)pWDICtx->pfncRspCB;
 
   /*Initialize the WDI Response structure */
   wdiHALDumpCmdRsp.usBufferLen = 0;
   wdiHALDumpCmdRsp.pBuffer = NULL;
 
   halDumpCmdRspParams = (tHalDumpCmdRspParams *)pEventData->pEventData;
-  
-  wdiHALDumpCmdRsp.wdiStatus   = 
-              WDI_HAL_2_WDI_STATUS(halDumpCmdRspParams->status); 
+
+  wdiHALDumpCmdRsp.wdiStatus   =
+              WDI_HAL_2_WDI_STATUS(halDumpCmdRspParams->status);
 
   if (( wdiHALDumpCmdRsp.wdiStatus  ==  WDI_STATUS_SUCCESS) &&
       (halDumpCmdRspParams->rspLength != 0))
@@ -18285,11 +18577,11 @@
       /* Copy the response data */
       wdiHALDumpCmdRsp.usBufferLen = halDumpCmdRspParams->rspLength;
       wdiHALDumpCmdRsp.pBuffer = wpalMemoryAllocate(halDumpCmdRspParams->rspLength);
-      wpalMemoryCopy( &halDumpCmdRspParams->rspBuffer, 
-                  wdiHALDumpCmdRsp.pBuffer, 
+      wpalMemoryCopy( &halDumpCmdRspParams->rspBuffer,
+                  wdiHALDumpCmdRsp.pBuffer,
                   sizeof(wdiHALDumpCmdRsp.usBufferLen));
   }
-  
+
   /*Notify UMAC*/
   wdiHALDumpCmdRspCb(&wdiHALDumpCmdRsp, pWDICtx->pRspCBUserData);
 
@@ -18303,34 +18595,34 @@
 
 /*==========================================================================
                      CONTRL TRANSPORT INTERACTION
- 
+
     Callback function registered with the control transport - for receiving
-    notifications and packets 
+    notifications and packets
 ==========================================================================*/
 /**
- @brief    This callback is invoked by the control transport 
+ @brief    This callback is invoked by the control transport
    when it wishes to send up a notification like the ones
    mentioned above.
- 
+
  @param
-    
-    wctsHandle:       handle to the control transport service 
+
+    wctsHandle:       handle to the control transport service
     wctsEvent:        the event being notified
-    wctsNotifyCBData: the callback data of the user 
-    
+    wctsNotifyCBData: the callback data of the user
+
  @see  WCTS_OpenTransport
-  
- @return None 
+
+ @return None
 */
-void 
+void
 WDI_NotifyMsgCTSCB
 (
-  WCTS_HandleType        wctsHandle, 
+  WCTS_HandleType        wctsHandle,
   WCTS_NotifyEventType   wctsEvent,
   void*                  wctsNotifyCBData
 )
 {
-  WDI_ControlBlockType*  pWDICtx = (WDI_ControlBlockType*)wctsNotifyCBData; 
+  WDI_ControlBlockType*  pWDICtx = (WDI_ControlBlockType*)wctsNotifyCBData;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   if (NULL == pWDICtx )
@@ -18338,7 +18630,7 @@
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
     WDI_ASSERT(0);
-    return; 
+    return;
   }
 
   if (WDI_CONTROL_BLOCK_MAGIC != pWDICtx->magic)
@@ -18346,7 +18638,7 @@
     /* callback presumably occurred after close */
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid control block", __FUNCTION__);
-    return; 
+    return;
   }
 
   if ( WCTS_EVENT_OPEN == wctsEvent )
@@ -18354,22 +18646,22 @@
     /*Flag must be set atomically as it is checked from incoming request
       functions*/
     wpalMutexAcquire(&pWDICtx->wptMutex);
-    pWDICtx->bCTOpened   = eWLAN_PAL_TRUE; 
+    pWDICtx->bCTOpened   = eWLAN_PAL_TRUE;
 
     /*Nothing to do - so try to dequeue any pending request that may have
      occurred while we were trying to establish this*/
     WDI_DequeuePendingReq(pWDICtx);
-    wpalMutexRelease(&pWDICtx->wptMutex);   
+    wpalMutexRelease(&pWDICtx->wptMutex);
   }
-  else if  ( WCTS_EVENT_CLOSE == wctsEvent ) 
+  else if  ( WCTS_EVENT_CLOSE == wctsEvent )
   {
     /*Flag must be set atomically as it is checked from incoming request
       functions*/
     wpalMutexAcquire(&pWDICtx->wptMutex);
-    pWDICtx->bCTOpened   = eWLAN_PAL_FALSE; 
+    pWDICtx->bCTOpened   = eWLAN_PAL_FALSE;
 
     /*No other request will be processed from now on - fail all*/
-    WDI_ClearPendingRequests(pWDICtx); 
+    WDI_ClearPendingRequests(pWDICtx);
     wpalMutexRelease(&pWDICtx->wptMutex);
 
     /*Notify that the Control Channel is closed */
@@ -18380,45 +18672,45 @@
 
 
 /**
- @brief    This callback is invoked by the control transport 
+ @brief    This callback is invoked by the control transport
            when it wishes to send up a packet received over the
            bus.
- 
+
  @param
-    
-    wctsHandle:  handle to the control transport service 
+
+    wctsHandle:  handle to the control transport service
     pMsg:        the packet
     uLen:        the packet length
-    wctsRxMsgCBData: the callback data of the user 
-    
+    wctsRxMsgCBData: the callback data of the user
+
  @see  WCTS_OpenTransport
-  
- @return None 
+
+ @return None
 */
-void 
-WDI_RXMsgCTSCB 
+void
+WDI_RXMsgCTSCB
 (
-  WCTS_HandleType       wctsHandle, 
+  WCTS_HandleType       wctsHandle,
   void*                 pMsg,
   wpt_uint32            uLen,
   void*                 wctsRxMsgCBData
 )
 {
-  tHalMsgHeader          *pHalMsgHeader; 
-  WDI_EventInfoType      wdiEventData; 
+  tHalMsgHeader          *pHalMsgHeader;
+  WDI_EventInfoType      wdiEventData;
   WDI_ControlBlockType*  pWDICtx = (WDI_ControlBlockType*)wctsRxMsgCBData;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
 
   /*------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   ------------------------------------------------------------------------*/
-  if ((NULL == pWDICtx ) || ( NULL == pMsg ) || 
+  if ((NULL == pWDICtx ) || ( NULL == pMsg ) ||
       ( uLen < sizeof(tHalMsgHeader)))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
     WDI_ASSERT(0);
-    return; 
+    return;
   }
 
   if (WDI_CONTROL_BLOCK_MAGIC != pWDICtx->magic)
@@ -18426,10 +18718,10 @@
     /* callback presumably occurred after close */
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid control block", __FUNCTION__);
-    return; 
+    return;
   }
 
-  /*The RX Callback is expected to be serialized in the proper control thread 
+  /*The RX Callback is expected to be serialized in the proper control thread
     context - so no serialization is necessary here
     ! - revisit this assumption */
 
@@ -18439,8 +18731,8 @@
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
               "Invalid packet received from HAL - catastrophic failure");
-    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_INVALID_RSP_FMT); 
-    return; 
+    WDI_DetectedDeviceError( pWDICtx, WDI_ERR_INVALID_RSP_FMT);
+    return;
   }
 
   wdiEventData.wdiResponse = HAL_2_WDI_RSP_TYPE( pHalMsgHeader->msgType );
@@ -18464,7 +18756,7 @@
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
                "Received response %s (%d) when expecting %s (%d) - catastrophic failure",
                WDI_getRespMsgString(wdiEventData.wdiResponse),
-               wdiEventData.wdiResponse, 
+               wdiEventData.wdiResponse,
                WDI_getRespMsgString(pWDICtx->wdiExpectedResponse),
                pWDICtx->wdiExpectedResponse);
     /* WDI_DetectedDeviceError( pWDICtx, WDI_ERR_INVALID_RSP_FMT); */
@@ -18481,13 +18773,13 @@
 
 
 /*========================================================================
-         Internal Helper Routines 
+         Internal Helper Routines
 ========================================================================*/
 
 /**
- @brief WDI_CleanCB - internal helper routine used to clean the 
+ @brief WDI_CleanCB - internal helper routine used to clean the
         WDI Main Control Block
- 
+
  @param pWDICtx - pointer to the control block
 
  @return Result of the function call
@@ -18501,9 +18793,9 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
 
   /*Clean the WDI Control Block*/
-  wpalMemoryZero( pWDICtx, sizeof(*pWDICtx)); 
+  wpalMemoryZero( pWDICtx, sizeof(*pWDICtx));
 
-  pWDICtx->uGlobalState  = WDI_MAX_ST; 
+  pWDICtx->uGlobalState  = WDI_MAX_ST;
   pWDICtx->ucMaxBssids   = WDI_MAX_SUPPORTED_BSS;
   pWDICtx->ucMaxStations = WDI_MAX_SUPPORTED_STAS;
 
@@ -18514,12 +18806,12 @@
 
 
 /**
- @brief Process request helper function 
+ @brief Process request helper function
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
+         pEventData:      pointer to the event information structure
+
  @see
  @return Result of the function call
 */
@@ -18532,12 +18824,12 @@
 {
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
-  /*!! Skip sanity check as this is called from the FSM functionss which 
+  /*!! Skip sanity check as this is called from the FSM functionss which
     already checked these pointers*/
 
   if (( pEventData->wdiRequest < WDI_MAX_UMAC_IND ) &&
       ( NULL != pfnReqProcTbl[pEventData->wdiRequest] ))
-  {  
+  {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
               "Calling request processing function for req %s (%d) %x",
               WDI_getReqMsgString(pEventData->wdiRequest),
@@ -18547,7 +18839,7 @@
   else
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Operation %d is not yet implemented ", 
+              "Operation %d is not yet implemented ",
                pEventData->wdiRequest);
     return WDI_STATUS_E_NOT_IMPLEMENT;
   }
@@ -18555,11 +18847,11 @@
 
 
 /**
- @brief Get message helper function - it allocates memory for a 
+ @brief Get message helper function - it allocates memory for a
         message that is to be sent to HAL accross the bus and
-        prefixes it with a send message header 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
+        prefixes it with a send message header
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
          wdiReqType:      type of the request being sent
          uBufferLen:      message buffer len
          pMsgBuffer:      resulting allocated buffer
@@ -18567,62 +18859,70 @@
          can start copying its message data
          puBufferSize:    the resulting buffer size (offset+buff
          len)
-  
+
  @see
  @return Result of the function call
 */
 WDI_Status
 WDI_GetMessageBuffer
-( 
-  WDI_ControlBlockType*  pWDICtx, 
-  WDI_RequestEnumType    wdiReqType, 
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_RequestEnumType    wdiReqType,
   wpt_uint16             usBufferLen,
-  wpt_uint8**            pMsgBuffer, 
-  wpt_uint16*            pusDataOffset, 
+  wpt_uint8**            pMsgBuffer,
+  wpt_uint16*            pusDataOffset,
   wpt_uint16*            pusBufferSize
 )
 {
   tHalMsgHeader  halMsgHeader;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
-  /*!! No sanity check here as we trust the called - ! check this assumption 
+  /*!! No sanity check here as we trust the called - ! check this assumption
     again*/
 
   /*-------------------------------------------------------------------------
-     Try to allocate message buffer from PAL 
+     Try to allocate message buffer from PAL
   -------------------------------------------------------------------------*/
-  *pusBufferSize = sizeof(halMsgHeader) + usBufferLen; 
+  *pusBufferSize = sizeof(halMsgHeader) + usBufferLen;
   *pMsgBuffer   = (wpt_uint8*)wpalMemoryAllocate(*pusBufferSize);
   if ( NULL ==  *pMsgBuffer )
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
                "Unable to allocate message buffer for req %s (%d)",
                WDI_getReqMsgString(wdiReqType),
-               wdiReqType); 
+               wdiReqType);
      WDI_ASSERT(0);
-     return WDI_STATUS_MEM_FAILURE; 
+     return WDI_STATUS_MEM_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
      Fill in the message header
   -------------------------------------------------------------------------*/
-  halMsgHeader.msgType = WDI_2_HAL_REQ_TYPE(wdiReqType); 
-  halMsgHeader.msgLen  = sizeof(halMsgHeader) + usBufferLen; 
-  *pusDataOffset       = sizeof(halMsgHeader); 
-  wpalMemoryCopy(*pMsgBuffer, &halMsgHeader, sizeof(halMsgHeader)); 
+  halMsgHeader.msgType = WDI_2_HAL_REQ_TYPE(wdiReqType);
+  /* Fill msgVersion */
+#ifdef WLAN_FEATURE_11AC
+  if (WDI_getFwWlanFeatCaps(DOT11AC))
+	  halMsgHeader.msgVersion = WLAN_HAL_MSG_VERSION1; 
+  else
+#endif
+	  halMsgHeader.msgVersion = WLAN_HAL_MSG_VERSION0;
 
-  return WDI_STATUS_SUCCESS; 
+  halMsgHeader.msgLen  = sizeof(halMsgHeader) + usBufferLen;
+  *pusDataOffset       = sizeof(halMsgHeader);
+  wpalMemoryCopy(*pMsgBuffer, &halMsgHeader, sizeof(halMsgHeader));
+
+  return WDI_STATUS_SUCCESS;
 }/*WDI_GetMessageBuffer*/
 
 
 /**
- @brief Send message helper function - sends a message over the 
+ @brief Send message helper function - sends a message over the
         bus using the control tranport and saves some info in
-        the CB 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
+        the CB
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
          pSendBuffer:     buffer to be sent
-  
+
          usSendSize          size of the buffer to be sent
          pRspCb:            response callback - save in the WDI
          CB
@@ -18630,17 +18930,17 @@
          callback
          wdiExpectedResponse: the code of the response that is
          expected to be rx-ed for this request
-  
+
  @see
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SendMsg
-( 
-  WDI_ControlBlockType*  pWDICtx,  
-  wpt_uint8*             pSendBuffer, 
-  wpt_uint32             usSendSize, 
-  void*                  pRspCb, 
+(
+  WDI_ControlBlockType*  pWDICtx,
+  wpt_uint8*             pSendBuffer,
+  wpt_uint32             usSendSize,
+  void*                  pRspCb,
   void*                  pUserData,
   WDI_ResponseEnumType   wdiExpectedResponse
 )
@@ -18649,11 +18949,11 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
 
   /*------------------------------------------------------------------------
-    Save needed info in the CB 
+    Save needed info in the CB
   ------------------------------------------------------------------------*/
   pWDICtx->pRspCBUserData      = pUserData;
-  pWDICtx->pfncRspCB           = pRspCb; 
-  pWDICtx->wdiExpectedResponse = wdiExpectedResponse; 
+  pWDICtx->pfncRspCB           = pRspCb;
+  pWDICtx->wdiExpectedResponse = wdiExpectedResponse;
 
    /*-----------------------------------------------------------------------
      Call the CTS to send this message over - free message afterwards
@@ -18705,22 +19005,22 @@
 
 
 /**
- @brief Send indication helper function - sends a message over 
+ @brief Send indication helper function - sends a message over
         the bus using the control transport and saves some info
         in the CB
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
          pSendBuffer:     buffer to be sent
          usSendSize: size of the buffer to be sent
-  
+
  @see
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SendIndication
-( 
-  WDI_ControlBlockType*  pWDICtx,  
-  wpt_uint8*             pSendBuffer, 
+(
+  WDI_ControlBlockType*  pWDICtx,
+  wpt_uint8*             pSendBuffer,
   wpt_uint32             usSendSize
 )
 {
@@ -18728,10 +19028,10 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
 
    /*-----------------------------------------------------------------------
-     Call the CTS to send this message over 
+     Call the CTS to send this message over
      Note: CTS is reponsible for freeing the message buffer.
    -----------------------------------------------------------------------*/
-   uStatus = WCTS_SendMessage( pWDICtx->wctsHandle, 
+   uStatus = WCTS_SendMessage( pWDICtx->wctsHandle,
                                (void*)pSendBuffer, usSendSize );
 
    /*Inform Upper MAC about the outcome of the request*/
@@ -18741,8 +19041,8 @@
                 "Send indication status : %d", uStatus);
 
       pWDICtx->wdiReqStatusCB( (uStatus != 0 ) ? WDI_STATUS_E_FAILURE:
-                                                 WDI_STATUS_SUCCESS, 
-                               pWDICtx->pReqStatusUserData); 
+                                                 WDI_STATUS_SUCCESS,
+                               pWDICtx->pReqStatusUserData);
    }
 
    /*If sending of the message failed - it is considered catastrophic and
@@ -18750,26 +19050,26 @@
    if ( 0 != uStatus)
    {
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
-                "Failed to send indication over the bus - catastrophic failure"); 
+                "Failed to send indication over the bus - catastrophic failure");
 
       WDI_DetectedDeviceError( pWDICtx, WDI_ERR_TRANSPORT_FAILURE);
       return WDI_STATUS_E_FAILURE;
    }
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_SendIndication*/
 
 
 /**
- @brief WDI_DetectedDeviceError - called internally by DAL when 
-        it has detected a failure in the device 
- 
- @param  pWDICtx:        pointer to the WLAN DAL context 
+ @brief WDI_DetectedDeviceError - called internally by DAL when
+        it has detected a failure in the device
+
+ @param  pWDICtx:        pointer to the WLAN DAL context
          usErrorCode:    error code detected by WDI or received
                          from HAL
-  
+
  @see
- @return None 
+ @return None
 */
 void
 WDI_DetectedDeviceError
@@ -18796,9 +19096,9 @@
   pWDICtx->ucExpectedStateTransition =  WDI_STOPPED_ST;
 
   /*Transition to stopped to fail all incomming requests from this point on*/
-  WDI_STATE_TRANSITION( pWDICtx, WDI_STOPPED_ST); 
+  WDI_STATE_TRANSITION( pWDICtx, WDI_STOPPED_ST);
 
-  WDI_ClearPendingRequests(pWDICtx); 
+  WDI_ClearPendingRequests(pWDICtx);
 
   /*TO DO: -  there should be an attempt to reset the device here*/
 
@@ -18809,26 +19109,26 @@
   ------------------------------------------------------------------------*/
   if (pWDICtx->wdiLowLevelIndCB)
   {
-     wdiInd.wdiIndicationType             = WDI_FATAL_ERROR_IND; 
-     wdiInd.wdiIndicationData.usErrorCode = usErrorCode; 
+     wdiInd.wdiIndicationType             = WDI_FATAL_ERROR_IND;
+     wdiInd.wdiIndicationData.usErrorCode = usErrorCode;
 
      pWDICtx->wdiLowLevelIndCB( &wdiInd,  pWDICtx->pIndUserData);
   }
 }/*WDI_DetectedDeviceError*/
 
 /**
- @brief    This callback is invoked by the wpt when a timer that 
+ @brief    This callback is invoked by the wpt when a timer that
            we started on send message has expire - this should
            never happen - it means device is stuck and cannot
-           reply - trigger catastrophic failure 
- @param 
-    
+           reply - trigger catastrophic failure
+ @param
+
     pUserData: the callback data of the user (ptr to WDI CB)
-    
- @see 
- @return None 
+
+ @see
+ @return None
 */
-void 
+void
 WDI_ResponseTimerCB
 (
   void *pUserData
@@ -18842,7 +19142,7 @@
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
     WDI_ASSERT(0);
-    return; 
+    return;
   }
 
   if ( WDI_MAX_RESP != pWDICtx->wdiExpectedResponse )
@@ -18850,7 +19150,7 @@
 
   WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
             "Timeout occurred while waiting for %s (%d) message from device "
-            " - catastrophic failure", 
+            " - catastrophic failure",
             WDI_getRespMsgString(pWDICtx->wdiExpectedResponse),
             pWDICtx->wdiExpectedResponse);
   /* WDI timeout means Riva is not responding or SMD communication to Riva
@@ -18871,12 +19171,12 @@
 
 
 /**
- @brief Process response helper function 
+ @brief Process response helper function
 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
+         pEventData:      pointer to the event information structure
+
  @see
  @return Result of the function call
 */
@@ -18889,14 +19189,14 @@
 {
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
-  /* Skip sanity check as this is called from the FSM functions which 
+  /* Skip sanity check as this is called from the FSM functions which
     already checked these pointers
     ! - revisit this assumption */
   if (( pEventData->wdiResponse < WDI_MAX_RESP ) &&
       ( NULL != pfnRspProcTbl[pEventData->wdiResponse] ))
-  {  
+  {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
-              "Calling response processing function for resp %s (%d) %x", 
+              "Calling response processing function for resp %s (%d) %x",
               WDI_getRespMsgString(pEventData->wdiResponse),
               pEventData->wdiResponse, pfnRspProcTbl[pEventData->wdiResponse]);
     return pfnRspProcTbl[pEventData->wdiResponse](pWDICtx, pEventData);
@@ -18904,7 +19204,7 @@
   else
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Operation %d is not yet implemented ", 
+              "Operation %d is not yet implemented ",
               pEventData->wdiResponse);
     return WDI_STATUS_E_NOT_IMPLEMENT;
   }
@@ -18912,20 +19212,20 @@
 
 
 /*=========================================================================
-                   QUEUE SUPPORT UTILITY FUNCTIONS 
+                   QUEUE SUPPORT UTILITY FUNCTIONS
 =========================================================================*/
 
 /**
- @brief    Utility function used by the DAL Core to help queue a 
-           request that cannot be processed right away. 
- @param 
-    
+ @brief    Utility function used by the DAL Core to help queue a
+           request that cannot be processed right away.
+ @param
+
     pWDICtx: - pointer to the WDI control block
     pEventData: - pointer to the evnt info that needs to be
-    queued 
-    
- @see 
- @return Result of the operation  
+    queued
+
+ @see
+ @return Result of the operation
 */
 WDI_Status
 WDI_QueuePendingReq
@@ -18934,15 +19234,15 @@
   WDI_EventInfoType*     pEventData
 )
 {
-  wpt_list_node*      pNode; 
+  wpt_list_node*      pNode;
   WDI_EventInfoType*  pEventDataQueue = wpalMemoryAllocate(sizeof(*pEventData));
-  void*               pEventInfo = NULL; 
+  void*               pEventInfo = NULL;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   if ( NULL ==  pEventDataQueue )
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Cannot allocate memory for queueing"); 
+              "Cannot allocate memory for queueing");
     WDI_ASSERT(0);
     return WDI_STATUS_MEM_FAILURE;
   }
@@ -18951,54 +19251,54 @@
   pEventDataQueue->pUserData       = pEventData->pUserData;
   pEventDataQueue->uEventDataSize  = pEventData->uEventDataSize;
   pEventDataQueue->wdiRequest      = pEventData->wdiRequest;
-  pEventDataQueue->wdiResponse     = pEventData->wdiResponse; 
+  pEventDataQueue->wdiResponse     = pEventData->wdiResponse;
 
   if( pEventData->uEventDataSize != 0 && pEventData->pEventData != NULL )
   {
      pEventInfo = wpalMemoryAllocate(pEventData->uEventDataSize);
-   
+
      if ( NULL ==  pEventInfo )
      {
        WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-                 "Cannot allocate memory for queueing event data info"); 
+                 "Cannot allocate memory for queueing event data info");
        WDI_ASSERT(0);
        wpalMemoryFree(pEventDataQueue);
        return WDI_STATUS_MEM_FAILURE;
      }
-   
+
      wpalMemoryCopy(pEventInfo, pEventData->pEventData, pEventData->uEventDataSize);
 
   }
   pEventDataQueue->pEventData = pEventInfo;
 
   /*Send wpt a pointer to the node (this is the 1st element in the event data)*/
-  pNode = (wpt_list_node*)pEventDataQueue; 
+  pNode = (wpt_list_node*)pEventDataQueue;
 
-  wpal_list_insert_back(&(pWDICtx->wptPendingQueue), pNode); 
+  wpal_list_insert_back(&(pWDICtx->wptPendingQueue), pNode);
 
   return WDI_STATUS_SUCCESS;
 }/*WDI_QueuePendingReq*/
 
 /**
- @brief    Callback function for serializing queued message 
+ @brief    Callback function for serializing queued message
            processing in the control context
- @param 
-    
-    pMsg - pointer to the message 
-    
- @see 
- @return Result of the operation  
+ @param
+
+    pMsg - pointer to the message
+
+ @see
+ @return Result of the operation
 */
-void 
+void
 WDI_PALCtrlMsgCB
 (
  wpt_msg *pMsg
 )
 {
   WDI_EventInfoType*     pEventData = NULL;
-  WDI_ControlBlockType*  pWDICtx    = NULL; 
-  WDI_Status             wdiStatus; 
-  WDI_ReqStatusCb        pfnReqStatusCB; 
+  WDI_ControlBlockType*  pWDICtx    = NULL;
+  WDI_Status             wdiStatus;
+  WDI_ReqStatusCb        pfnReqStatusCB;
   void*                  pUserData;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
@@ -19007,9 +19307,9 @@
       ( NULL == (pWDICtx  = (WDI_ControlBlockType*)pMsg->pContext )))
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-              "Invalid message received on serialize ctrl context API"); 
+              "Invalid message received on serialize ctrl context API");
     WDI_ASSERT(0);
-    return; 
+    return;
   }
 
   /*Transition back to the state that we had before serialization
@@ -19017,21 +19317,19 @@
   ! TO DO L: possible race condition here if a request comes in between the
    state transition and the post function*/
 
-  WDI_STATE_TRANSITION( pWDICtx, pMsg->val); 
+  WDI_STATE_TRANSITION( pWDICtx, pMsg->val);
 
   /*-----------------------------------------------------------------------
      Check to see what type of event we are serializing
-     - responses are never expected to come through here 
+     - responses are never expected to come through here
   -----------------------------------------------------------------------*/
   switch ( pEventData->wdiRequest )
   {
 
-  case WDI_STOP_REQ:
-      
+  case WDI_STOP_REQ:      
       wdiStatus = WDI_PostMainEvent(&gWDICb, WDI_STOP_EVENT, pEventData);
       break;
 
-
   case WDI_NV_DOWNLOAD_REQ:
       // When WDI State is WDI_STARTED_ST, send WDI request message with event type WDI_REQUEST_EVENT.
       // In this case, because this request is called from response process, we could call WDI_ProcessRequest() directly.
@@ -19078,20 +19376,20 @@
   {
      wpalMemoryFree(pMsg);
   }
-  
+
 }/*WDI_PALCtrlMsgCB*/
 
 /**
  @brief    Utility function used by the DAL Core to help dequeue
-           and schedule for execution a pending request 
- @param 
-    
+           and schedule for execution a pending request
+ @param
+
     pWDICtx: - pointer to the WDI control block
     pEventData: - pointer to the evnt info that needs to be
-    queued 
-    
- @see 
- @return Result of the operation  
+    queued
+
+ @see
+ @return Result of the operation
 */
 WDI_Status
 WDI_DequeuePendingReq
@@ -19099,23 +19397,23 @@
   WDI_ControlBlockType*  pWDICtx
 )
 {
-  wpt_list_node*      pNode      = NULL; 
+  wpt_list_node*      pNode      = NULL;
   WDI_EventInfoType*  pEventData;
-  wpt_msg*            palMsg; 
+  wpt_msg*            palMsg;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
-  wpal_list_remove_front(&(pWDICtx->wptPendingQueue), &pNode); 
+  wpal_list_remove_front(&(pWDICtx->wptPendingQueue), &pNode);
 
   if ( NULL ==  pNode )
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-              "List is empty - return"); 
+              "List is empty - return");
     return WDI_STATUS_SUCCESS;
   }
 
   /*The node actually points to the 1st element inside the Event Data struct -
     just cast it back to the struct*/
-  pEventData = (WDI_EventInfoType*)pNode; 
+  pEventData = (WDI_EventInfoType*)pNode;
 
   /*Serialize processing in the control thread
      !TO DO: - check to see if these are all the messages params that need
@@ -19125,20 +19423,20 @@
   if ( NULL ==  palMsg )
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-               "WDI_DequeuePendingReq: Cannot allocate memory for palMsg."); 
+               "WDI_DequeuePendingReq: Cannot allocate memory for palMsg.");
     WDI_ASSERT(0);
-    return WDI_STATUS_MEM_FAILURE; 
+    return WDI_STATUS_MEM_FAILURE;
   }
-  palMsg->pContext = pWDICtx; 
+  palMsg->pContext = pWDICtx;
   palMsg->callback = WDI_PALCtrlMsgCB;
   palMsg->ptr      = pEventData;
 
   /*Save the global state as we need it on the other side*/
-  palMsg->val      = pWDICtx->uGlobalState; 
-    
+  palMsg->val      = pWDICtx->uGlobalState;
+
   /*Transition back to BUSY as we need to handle a queued request*/
   WDI_STATE_TRANSITION( pWDICtx, WDI_BUSY_ST);
-  
+
   wpalPostCtrlMsg(pWDICtx->pPALContext, palMsg);
 
   return WDI_STATUS_PENDING;
@@ -19146,17 +19444,17 @@
 
 
 /**
- @brief    Utility function used by the DAL Core to help queue 
+ @brief    Utility function used by the DAL Core to help queue
            an association request that cannot be processed right
-           away.- The assoc requests will be queued by BSSID 
- @param 
-    
+           away.- The assoc requests will be queued by BSSID
+ @param
+
     pWDICtx: - pointer to the WDI control block
     pEventData: pointer to the evnt info that needs to be queued
     macBSSID: bssid
-    
- @see 
- @return Result of the operation  
+
+ @see
+ @return Result of the operation
 */
 WDI_Status
 WDI_QueueNewAssocRequest
@@ -19166,42 +19464,42 @@
   wpt_macAddr            macBSSID
 )
 {
-  wpt_uint8 i; 
-  WDI_BSSSessionType*     pSession = NULL; 
-  wpt_list_node*          pNode; 
+  wpt_uint8 i;
+  WDI_BSSSessionType*     pSession = NULL;
+  wpt_list_node*          pNode;
   WDI_EventInfoType*      pEventDataQueue;
-  void*                   pEventInfo; 
-  WDI_NextSessionIdType*  pSessionIdElement; 
+  void*                   pEventInfo;
+  WDI_NextSessionIdType*  pSessionIdElement;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-  
 
-  /*------------------------------------------------------------------------ 
-      Search for a session that matches the BSSID 
+
+  /*------------------------------------------------------------------------
+      Search for a session that matches the BSSID
     ------------------------------------------------------------------------*/
   for ( i = 0; i < WDI_MAX_BSS_SESSIONS; i++ )
   {
      if ( eWLAN_PAL_FALSE == pWDICtx->aBSSSessions[i].bInUse )
      {
        /*Found an empty session*/
-       pSession = &pWDICtx->aBSSSessions[i]; 
-       break; 
+       pSession = &pWDICtx->aBSSSessions[i];
+       break;
      }
   }
 
   if ( i >=  WDI_MAX_BSS_SESSIONS )
   {
     /*Cannot find any empty sessions*/
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
-  
+
   /*------------------------------------------------------------------------
     Fill in the BSSID for this session and set the usage flag
   ------------------------------------------------------------------------*/
   wpalMemoryCopy(pWDICtx->aBSSSessions[i].macBSSID, macBSSID, WDI_MAC_ADDR_LEN);
-  pWDICtx->aBSSSessions[i].bInUse = eWLAN_PAL_TRUE; 
+  pWDICtx->aBSSSessions[i].bInUse = eWLAN_PAL_TRUE;
 
   /*------------------------------------------------------------------------
-    Allocate memory for this and place it in the queue 
+    Allocate memory for this and place it in the queue
   ------------------------------------------------------------------------*/
   pEventDataQueue = (WDI_EventInfoType*)wpalMemoryAllocate(sizeof(WDI_EventInfoType));
   if ( NULL == pEventDataQueue )
@@ -19237,28 +19535,28 @@
   pEventDataQueue->pUserData       = pEventData->pUserData;
   pEventDataQueue->uEventDataSize  = pEventData->uEventDataSize;
   pEventDataQueue->wdiRequest      = pEventData->wdiRequest;
-  pEventDataQueue->wdiResponse     = pEventData->wdiResponse; 
+  pEventDataQueue->wdiResponse     = pEventData->wdiResponse;
 
   wpalMemoryCopy(pEventInfo, pEventData->pEventData, pEventData->uEventDataSize);
   pEventDataQueue->pEventData = pEventInfo;
 
   /*Send wpt a pointer to the node (this is the 1st element in the event data)*/
-  pNode = (wpt_list_node*)pEventDataQueue; 
+  pNode = (wpt_list_node*)pEventDataQueue;
 
   /*This association is currently being queued*/
-  pSession->bAssocReqQueued = eWLAN_PAL_TRUE; 
+  pSession->bAssocReqQueued = eWLAN_PAL_TRUE;
 
-  wpal_list_insert_back(&(pSession->wptPendingQueue), pNode); 
+  wpal_list_insert_back(&(pSession->wptPendingQueue), pNode);
 
   /*We need to maintain a separate list that keeps track of the order in which
   the new assoc requests are being queued such that we can start processing
   them in the order that they had arrived*/
-  pSessionIdElement->ucIndex = i; 
-  pNode = (wpt_list_node*)pSessionIdElement; 
+  pSessionIdElement->ucIndex = i;
+  pNode = (wpt_list_node*)pSessionIdElement;
 
   WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
        "Queueing up new assoc session : %d ", pSessionIdElement->ucIndex);
-  wpal_list_insert_back(&pWDICtx->wptPendingAssocSessionIdQueue, pNode); 
+  wpal_list_insert_back(&pWDICtx->wptPendingAssocSessionIdQueue, pNode);
 
   /*Return pending as this is what the status of the request is since it has
     been queued*/
@@ -19266,18 +19564,18 @@
 }/*WDI_QueueNewAssocRequest*/
 
 /**
- @brief    Utility function used by the DAL Core to help queue 
+ @brief    Utility function used by the DAL Core to help queue
            an association request that cannot be processed right
-           away.- The assoc requests will be queued by BSSID 
- @param 
-    
+           away.- The assoc requests will be queued by BSSID
+ @param
+
     pWDICtx: - pointer to the WDI control block
     pSession: - session in which to queue
     pEventData: pointer to the event info that needs to be
     queued
-    
- @see 
- @return Result of the operation  
+
+ @see
+ @return Result of the operation
 */
 WDI_Status
 WDI_QueueAssocRequest
@@ -19287,12 +19585,12 @@
   WDI_EventInfoType*     pEventData
 )
 {
-  wpt_list_node*      pNode; 
+  wpt_list_node*      pNode;
   WDI_EventInfoType*  pEventDataQueue;
-  void*               pEventInfo; 
+  void*               pEventInfo;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-  
-  /*------------------------------------------------------------------------ 
+
+  /*------------------------------------------------------------------------
       Sanity check
     ------------------------------------------------------------------------*/
   if (( NULL == pSession ) || ( NULL == pWDICtx ))
@@ -19300,17 +19598,17 @@
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
 
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   /*------------------------------------------------------------------------
-    Allocate memory for this and place it in the queue 
+    Allocate memory for this and place it in the queue
   ------------------------------------------------------------------------*/
   pEventDataQueue = (WDI_EventInfoType*)wpalMemoryAllocate(sizeof(WDI_EventInfoType));
   if ( NULL ==  pEventDataQueue )
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-               "%s: Cannot allocate memory for queueing", __FUNCTION__); 
+               "%s: Cannot allocate memory for queueing", __FUNCTION__);
     WDI_ASSERT(0);
     return WDI_STATUS_MEM_FAILURE;
   }
@@ -19330,18 +19628,18 @@
   pEventDataQueue->pUserData       = pEventData->pUserData;
   pEventDataQueue->uEventDataSize  = pEventData->uEventDataSize;
   pEventDataQueue->wdiRequest      = pEventData->wdiRequest;
-  pEventDataQueue->wdiResponse     = pEventData->wdiResponse; 
+  pEventDataQueue->wdiResponse     = pEventData->wdiResponse;
   pEventDataQueue->pEventData      = pEventInfo;
 
   wpalMemoryCopy(pEventInfo, pEventData->pEventData, pEventData->uEventDataSize);
 
   /*Send wpt a pointer to the node (this is the 1st element in the event data)*/
-  pNode = (wpt_list_node*)pEventDataQueue; 
+  pNode = (wpt_list_node*)pEventDataQueue;
 
   /*This association is currently being queued*/
-  pSession->bAssocReqQueued = eWLAN_PAL_TRUE; 
+  pSession->bAssocReqQueued = eWLAN_PAL_TRUE;
 
-  wpal_list_insert_back(&(pSession->wptPendingQueue), pNode); 
+  wpal_list_insert_back(&(pSession->wptPendingQueue), pNode);
 
   /*The result of this operation is pending because the request has been
     queued and it will be processed at a later moment in time */
@@ -19353,13 +19651,13 @@
            an association request that was pending
            The request will be queued up in front of the main
            pending queue for imediate processing
- @param 
-    
+ @param
+
     pWDICtx: - pointer to the WDI control block
-  
-    
- @see 
- @return Result of the operation  
+
+
+ @see
+ @return Result of the operation
 */
 WDI_Status
 WDI_DequeueAssocRequest
@@ -19367,12 +19665,12 @@
   WDI_ControlBlockType*  pWDICtx
 )
 {
-  wpt_list_node*          pNode = NULL; 
-  WDI_NextSessionIdType*  pSessionIdElement; 
+  wpt_list_node*          pNode = NULL;
+  WDI_NextSessionIdType*  pSessionIdElement;
   WDI_BSSSessionType*     pSession;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-  
-  /*------------------------------------------------------------------------ 
+
+  /*------------------------------------------------------------------------
       Sanity check
     ------------------------------------------------------------------------*/
   if ( NULL == pWDICtx )
@@ -19380,7 +19678,7 @@
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
 
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   /*------------------------------------------------------------------------
@@ -19392,18 +19690,18 @@
     (bc they needed to be processed in order to be placed in this queue)
     => they will be placed at the front of the busy queue
   ------------------------------------------------------------------------*/
-  wpal_list_remove_front(&(pWDICtx->wptPendingAssocSessionIdQueue), &pNode); 
+  wpal_list_remove_front(&(pWDICtx->wptPendingAssocSessionIdQueue), &pNode);
 
   if ( NULL ==  pNode )
   {
     WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
-              "List is empty - return"); 
+              "List is empty - return");
     return WDI_STATUS_SUCCESS;
   }
 
   /*The node actually points to the 1st element inside the Session Id struct -
     just cast it back to the struct*/
-  pSessionIdElement = (WDI_NextSessionIdType*)pNode; 
+  pSessionIdElement = (WDI_NextSessionIdType*)pNode;
 
   WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
        "Dequeueing new assoc session : %d ", pSessionIdElement->ucIndex);
@@ -19411,67 +19709,68 @@
   if ( pSessionIdElement->ucIndex < WDI_MAX_BSS_SESSIONS )
   {
       pSession = &pWDICtx->aBSSSessions[pSessionIdElement->ucIndex];
-      
+
       /*Transfer all the pending requests in this assoc queue to
-      the front of the main waiting queue for subsequent execution*/      
-      wpal_list_remove_back(&(pSession->wptPendingQueue), &pNode); 
+      the front of the main waiting queue for subsequent execution*/
+      wpal_list_remove_back(&(pSession->wptPendingQueue), &pNode);
       while ( NULL !=  pNode )
       {
         /*Place it in front of the main pending list*/
-        wpal_list_insert_front( &(pWDICtx->wptPendingQueue), &pNode); 
-        wpal_list_remove_back(&(pSession->wptPendingQueue), &pNode); 
+        wpal_list_insert_front( &(pWDICtx->wptPendingQueue), &pNode);
+        wpal_list_remove_back(&(pSession->wptPendingQueue), &pNode);
       }
+      pSession->bAssocReqQueued = eWLAN_PAL_FALSE;
   }
   else
   {
      WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
-              "Invalid session id queued up for assoc"); 
+              "Invalid session id queued up for assoc");
      WPAL_ASSERT(0);
      wpalMemoryFree(pSessionIdElement);
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
-  
+
   /*Clean this up as it is no longer needed in order to prevent memory leak*/
   wpalMemoryFree(pSessionIdElement);
   return WDI_STATUS_SUCCESS;
 }/*WDI_DequeueAssocRequest*/
 
 /**
- @brief    Utility function used by the DAL Core to clear any 
+ @brief    Utility function used by the DAL Core to clear any
            pending requests - all req cb will be called with
            failure and the queue will be emptied.
- @param 
-    
+ @param
+
     pWDICtx: - pointer to the WDI control block
-    
- @see 
- @return Result of the operation  
+
+ @see
+ @return Result of the operation
 */
 WDI_Status
 WDI_ClearPendingRequests
-( 
+(
   WDI_ControlBlockType*  pWDICtx
 )
 {
-  wpt_list_node*      pNode = NULL; 
+  wpt_list_node*      pNode = NULL;
   WDI_EventInfoType*  pEventDataQueue = NULL;
-  WDI_ReqStatusCb     pfnReqStatusCB; 
+  WDI_ReqStatusCb     pfnReqStatusCB;
   void*               pUserData;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
-  wpal_list_remove_front(&(pWDICtx->wptPendingQueue), &pNode); 
+  wpal_list_remove_front(&(pWDICtx->wptPendingQueue), &pNode);
 
   /*------------------------------------------------------------------------
     Go through all the requests and fail them - this will only be called
     when device is being stopped or an error was detected - either case the
-    pending requests can no longer be sent down to HAL 
+    pending requests can no longer be sent down to HAL
   ------------------------------------------------------------------------*/
   while( pNode )
   {
       /*The node actually points to the 1st element inside the Event Data struct -
     just cast it back to the struct*/
-    pEventDataQueue = (WDI_EventInfoType*)pNode; 
-  
+    pEventDataQueue = (WDI_EventInfoType*)pNode;
+
     WDI_ExtractRequestCBFromEvent(pEventDataQueue, &pfnReqStatusCB, &pUserData);
     if ( NULL != pfnReqStatusCB )
     {
@@ -19489,26 +19788,26 @@
     {
         break;
     }
-  } 
- 
+  }
+
   return WDI_STATUS_SUCCESS;
 }/*WDI_ClearPendingRequests*/
 
 /**
- @brief Helper routine used to init the BSS Sessions in the WDI control block 
-  
- 
- @param  pWDICtx:       pointer to the WLAN DAL context 
-  
+ @brief Helper routine used to init the BSS Sessions in the WDI control block
+
+
+ @param  pWDICtx:       pointer to the WLAN DAL context
+
  @see
 */
 void
 WDI_ResetAssocSessions
-( 
+(
   WDI_ControlBlockType*   pWDICtx
 )
 {
-  wpt_uint8 i; 
+  wpt_uint8 i;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
 
   /*-------------------------------------------------------------------------
@@ -19516,7 +19815,7 @@
   -------------------------------------------------------------------------*/
   for ( i = 0; i < WDI_MAX_BSS_SESSIONS; i++ )
   {
-    wpalMemoryZero( &pWDICtx->aBSSSessions[i], sizeof(WDI_BSSSessionType) ); 
+    wpalMemoryZero( &pWDICtx->aBSSSessions[i], sizeof(WDI_BSSSessionType) );
     pWDICtx->aBSSSessions[i].wdiAssocState = WDI_ASSOC_INIT_ST;
     pWDICtx->aBSSSessions[i].bcastStaIdx = WDI_STA_INVALID_IDX;
     pWDICtx->aBSSSessions[i].ucBSSIdx = WDI_BSS_INVALID_IDX;
@@ -19524,120 +19823,120 @@
 }/*WDI_ResetAssocSessions*/
 
 /**
- @brief Helper routine used to find a session based on the BSSID 
-  
- 
- @param  pWDICtx:       pointer to the WLAN DAL context 
+ @brief Helper routine used to find a session based on the BSSID
+
+
+ @param  pWDICtx:       pointer to the WLAN DAL context
          macBSSID:      BSSID of the session
-         pSession:      pointer to the session (if found) 
-  
+         pSession:      pointer to the session (if found)
+
  @see
- @return Index of the session in the array 
+ @return Index of the session in the array
 */
 wpt_uint8
 WDI_FindAssocSession
-( 
+(
   WDI_ControlBlockType*   pWDICtx,
   wpt_macAddr             macBSSID,
   WDI_BSSSessionType**    ppSession
 )
 {
-  wpt_uint8 i; 
+  wpt_uint8 i;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if ( NULL == ppSession )
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
-     return WDI_MAX_BSS_SESSIONS; 
+     return WDI_MAX_BSS_SESSIONS;
   }
 
-  *ppSession = NULL; 
+  *ppSession = NULL;
 
-  /*------------------------------------------------------------------------ 
-      Search for a session that matches the BSSID 
+  /*------------------------------------------------------------------------
+      Search for a session that matches the BSSID
     ------------------------------------------------------------------------*/
   for ( i = 0; i < WDI_MAX_BSS_SESSIONS; i++ )
   {
-     if ( eWLAN_PAL_TRUE == 
+     if ( eWLAN_PAL_TRUE ==
           wpalMemoryCompare(pWDICtx->aBSSSessions[i].macBSSID, macBSSID, WDI_MAC_ADDR_LEN) )
      {
        /*Found the session*/
-       *ppSession = &pWDICtx->aBSSSessions[i]; 
+       *ppSession = &pWDICtx->aBSSSessions[i];
        return i;
      }
   }
 
-  return i; 
+  return i;
 }/*WDI_FindAssocSession*/
 
 /**
- @brief Helper routine used to find a session based on the BSSID 
-  
- 
- @param  pWDICtx:   pointer to the WLAN DAL context 
+ @brief Helper routine used to find a session based on the BSSID
+
+
+ @param  pWDICtx:   pointer to the WLAN DAL context
          ucBSSIdx:  BSS Index of the session
          ppSession: out pointer to the session (if found)
-  
+
  @see
- @return Index of the session in the array 
+ @return Index of the session in the array
 */
 wpt_uint8
 WDI_FindAssocSessionByBSSIdx
-( 
+(
   WDI_ControlBlockType*   pWDICtx,
   wpt_uint16              ucBSSIdx,
   WDI_BSSSessionType**    ppSession
 )
 {
-  wpt_uint8 i; 
+  wpt_uint8 i;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if ( NULL == ppSession )
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
-     return WDI_MAX_BSS_SESSIONS; 
+     return WDI_MAX_BSS_SESSIONS;
   }
 
-  *ppSession = NULL; 
+  *ppSession = NULL;
 
-  /*------------------------------------------------------------------------ 
-      Search for a session that matches the BSSID 
+  /*------------------------------------------------------------------------
+      Search for a session that matches the BSSID
     ------------------------------------------------------------------------*/
   for ( i = 0; i < WDI_MAX_BSS_SESSIONS; i++ )
   {
      if ( ucBSSIdx == pWDICtx->aBSSSessions[i].ucBSSIdx )
      {
        /*Found the session*/
-       *ppSession = &pWDICtx->aBSSSessions[i]; 
+       *ppSession = &pWDICtx->aBSSSessions[i];
        return i;
      }
   }
 
-  return i; 
+  return i;
 }/*WDI_FindAssocSessionByBSSIdx*/
 
 /**
- @brief Helper routine used to find a session based on the BSSID 
-  
- 
- @param  pWDICtx:   pointer to the WLAN DAL context 
+ @brief Helper routine used to find a session based on the BSSID
+
+
+ @param  pWDICtx:   pointer to the WLAN DAL context
          ucBSSIdx:  BSS Index of the session
          ppSession: out pointer to the session (if found)
-  
+
  @see
- @return Index of the session in the array 
+ @return Index of the session in the array
 */
 wpt_uint8
 WDI_FindAssocSessionByIdx
-( 
+(
   WDI_ControlBlockType*   pWDICtx,
   wpt_uint16              usIdx,
   WDI_BSSSessionType**    ppSession
@@ -19646,91 +19945,91 @@
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if ( NULL == ppSession || usIdx >= WDI_MAX_BSS_SESSIONS )
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
-     return WDI_MAX_BSS_SESSIONS; 
+     return WDI_MAX_BSS_SESSIONS;
   }
 
   /*Found the session*/
-  *ppSession = &pWDICtx->aBSSSessions[usIdx]; 
+  *ppSession = &pWDICtx->aBSSSessions[usIdx];
 
   return usIdx;
-  
+
 }/*WDI_FindAssocSessionByBSSIdx*/
 
 /**
- @brief Helper routine used to find an empty session in the WDI 
+ @brief Helper routine used to find an empty session in the WDI
         CB
-  
- 
- @param  pWDICtx:       pointer to the WLAN DAL context 
-         pSession:      pointer to the session (if found) 
-  
+
+
+ @param  pWDICtx:       pointer to the WLAN DAL context
+         pSession:      pointer to the session (if found)
+
  @see
- @return Index of the session in the array 
+ @return Index of the session in the array
 */
 wpt_uint8
 WDI_FindEmptySession
-( 
+(
   WDI_ControlBlockType*   pWDICtx,
   WDI_BSSSessionType**    ppSession
 )
 {
-  wpt_uint8 i; 
+  wpt_uint8 i;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
    /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if ( NULL == ppSession )
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
-     return WDI_MAX_BSS_SESSIONS; 
+     return WDI_MAX_BSS_SESSIONS;
   }
 
-  *ppSession = NULL; 
+  *ppSession = NULL;
 
-  /*------------------------------------------------------------------------ 
-      Search for a session that it is not in use 
+  /*------------------------------------------------------------------------
+      Search for a session that it is not in use
     ------------------------------------------------------------------------*/
   for ( i = 0; i < WDI_MAX_BSS_SESSIONS; i++ )
   {
      if ( ! pWDICtx->aBSSSessions[i].bInUse )
      {
        /*Found a session*/
-       *ppSession = &pWDICtx->aBSSSessions[i]; 
+       *ppSession = &pWDICtx->aBSSSessions[i];
        return i;
      }
   }
 
-  return i; 
+  return i;
 }/*WDI_FindEmptySession*/
 
 
 /**
- @brief Helper routine used to get the total count of active 
+ @brief Helper routine used to get the total count of active
         sessions
-  
- 
- @param  pWDICtx:       pointer to the WLAN DAL context 
-  
+
+
+ @param  pWDICtx:       pointer to the WLAN DAL context
+
  @see
  @return Number of sessions in use
 */
 wpt_uint8
 WDI_GetActiveSessionsCount
-( 
+(
   WDI_ControlBlockType*   pWDICtx
 )
 {
-  wpt_uint8 i, ucCount = 0; 
+  wpt_uint8 i, ucCount = 0;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-  
-  /*------------------------------------------------------------------------ 
+
+  /*------------------------------------------------------------------------
       Count all sessions in use
     ------------------------------------------------------------------------*/
   for ( i = 0; i < WDI_MAX_BSS_SESSIONS; i++ )
@@ -19741,59 +20040,59 @@
      }
   }
 
-  return ucCount; 
+  return ucCount;
 }/*WDI_GetActiveSessionsCount*/
 
 /**
- @brief Helper routine used to delete session in the WDI 
+ @brief Helper routine used to delete session in the WDI
         CB
-  
- 
- @param  pWDICtx:       pointer to the WLAN DAL context 
-         pSession:      pointer to the session (if found) 
-  
+
+
+ @param  pWDICtx:       pointer to the WLAN DAL context
+         pSession:      pointer to the session (if found)
+
  @see
- @return Index of the session in the array 
+ @return Index of the session in the array
 */
-void 
+void
 WDI_DeleteSession
-( 
+(
   WDI_ControlBlockType*   pWDICtx,
   WDI_BSSSessionType*     ppSession
 )
 {
    /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if ( NULL == ppSession )
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
-     return ; 
+     return ;
   }
 
-  /*------------------------------------------------------------------------ 
-      Reset the entries int session 
+  /*------------------------------------------------------------------------
+      Reset the entries int session
     ------------------------------------------------------------------------*/
   wpal_list_destroy(&ppSession->wptPendingQueue);
   wpalMemoryZero(ppSession,  sizeof(*ppSession));
-  ppSession->wdiAssocState = WDI_ASSOC_INIT_ST; 
-  ppSession->bInUse        = eWLAN_PAL_FALSE; 
+  ppSession->wdiAssocState = WDI_ASSOC_INIT_ST;
+  ppSession->bInUse        = eWLAN_PAL_FALSE;
   ppSession->wdiBssType    = WDI_INFRASTRUCTURE_MODE;
   wpal_list_init(&ppSession->wptPendingQueue);
 
 }/*WDI_DeleteSession*/
 
 /**
- @brief    Utility function to add the broadcast STA to the the STA table. 
+ @brief    Utility function to add the broadcast STA to the the STA table.
  The bcast STA ID is assigned by HAL and must be valid.
- @param 
-    
+ @param
+
     WDI_AddStaParams: - pointer to the WDI Add STA params
     usBcastStaIdx: - Broadcast STA index passed by HAL
-    
- @see 
- @return void 
+
+ @see
+ @return void
 */
 void
 WDI_AddBcastSTAtoSTATable
@@ -19815,7 +20114,7 @@
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                 "%s: Invalid parameters", __FUNCTION__);
 
-    return; 
+    return;
   }
 
   wdiAddSTAParam.bcastDpuIndex = staParams->bcastDpuIndex;
@@ -19833,23 +20132,23 @@
   wdiAddSTAParam.ucStaType = WDI_STA_ENTRY_BCAST;
   wdiAddSTAParam.ucWmmEnabled = staParams->ucWmmEnabled;
   wdiAddSTAParam.ucSTAIdx = usBcastStaIdx;
-    
+
   (void)WDI_STATableAddSta(pWDICtx,&wdiAddSTAParam);
 }
 
 /**
- @brief NV blob will be divided into fragments of size 4kb and 
- Sent to HAL 
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+ @brief NV blob will be divided into fragments of size 4kb and
+ Sent to 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_SendNvBlobReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -19868,7 +20167,7 @@
   WDI_ASSERT(NULL != wdiNvDownloadRspCb);
   pwdiNvDownloadReqParams = (WDI_NvDownloadReqParamsType*)pEventData->pEventData;
 
-  /* Sanity Check is done by the caller */ 
+  /* Sanity Check is done by the caller */
   pSrcBuffer =(wpt_uint8 *) pwdiNvDownloadReqParams->wdiBlobInfo.pBlobAddress;
 
   /* Update the current  Fragment Number */
@@ -19880,14 +20179,14 @@
                                      pWDICtx->wdiNvBlobInfo.usCurrentFragment-1;
 
   /*    Divide the NV Image to size of 'FRAGMENT_SIZE' fragments and send it to HAL.
-       If the size of the Image is less than 'FRAGMENT_SIZE' then in one iteration total 
+       If the size of the Image is less than 'FRAGMENT_SIZE' then in one iteration total
        image will be sent to HAL*/
 
-  if(pWDICtx->wdiNvBlobInfo.usTotalFragment 
+  if(pWDICtx->wdiNvBlobInfo.usTotalFragment
                          == pWDICtx->wdiNvBlobInfo.usCurrentFragment)
-  { 
+  {
     /*     Taking care of boundry condition */
-    if( !(usCurrentFragmentSize = 
+    if( !(usCurrentFragmentSize =
                  pwdiNvDownloadReqParams->wdiBlobInfo.uBlobSize%FRAGMENT_SIZE ))
       usCurrentFragmentSize = FRAGMENT_SIZE;
 
@@ -19897,7 +20196,7 @@
 
   }
   else
-  { 
+  {
     usCurrentFragmentSize = FRAGMENT_SIZE;
 
     /*Update the HAL REQ structure */
@@ -19911,18 +20210,18 @@
   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,WDI_NV_DOWNLOAD_REQ,
          sizeof(halNvImgDownloadParam.nvImageReqParams)+ usCurrentFragmentSize,
                     &pSendBuffer, &usDataOffset, &usSendSize))||
-      ( usSendSize < 
+      ( usSendSize <
            (usDataOffset + sizeof(halNvImgDownloadParam.nvImageReqParams) + usCurrentFragmentSize )))
   {
     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
          "Unable to get send buffer in NV Download req %x %x ",
          pEventData, pwdiNvDownloadReqParams);
     WDI_ASSERT(0);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   /* Copying the Hal NV download REQ structure */
-  wpalMemoryCopy(pSendBuffer + usDataOffset , 
+  wpalMemoryCopy(pSendBuffer + usDataOffset ,
     &halNvImgDownloadParam.nvImageReqParams ,sizeof(tHalNvImgDownloadReqParams));
 
   /* Appending the NV image fragment */
@@ -19931,25 +20230,25 @@
                   usCurrentFragmentSize);
 
   pWDICtx->wdiReqStatusCB     = pwdiNvDownloadReqParams->wdiReqStatusCB;
-  pWDICtx->pReqStatusUserData = pwdiNvDownloadReqParams->pUserData; 
+  pWDICtx->pReqStatusUserData = pwdiNvDownloadReqParams->pUserData;
 
-  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                           wdiNvDownloadRspCb, pEventData->pUserData, 
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                           wdiNvDownloadRspCb, pEventData->pUserData,
                            WDI_NV_DOWNLOAD_RESP);
 
 }
-/*============================================================================ 
-  Helper inline functions for 
+/*============================================================================
+  Helper inline functions for
  ============================================================================*/
 /**
- @brief Helper routine used to find a session based on the BSSID 
- @param  pContext:   pointer to the WLAN DAL context 
- @param  pDPContext:   pointer to the Datapath context 
-  
+ @brief Helper routine used to find a session based on the BSSID
+ @param  pContext:   pointer to the WLAN DAL context
+ @param  pDPContext:   pointer to the Datapath context
+
  @see
- @return 
+ @return
 */
-WPT_INLINE void 
+WPT_INLINE void
 WDI_DS_AssignDatapathContext (void *pContext, void *pDPContext)
 {
    WDI_ControlBlockType *pCB = (WDI_ControlBlockType *)pContext;
@@ -19959,56 +20258,56 @@
 }
 
 /**
- @brief Helper routine used to find a session based on the BSSID 
-  
- 
- @param  pContext:   pointer to the WLAN DAL context 
-  
+ @brief Helper routine used to find a session based on the BSSID
+
+
+ @param  pContext:   pointer to the WLAN DAL context
+
  @see
  @return pointer to Datapath context
 */
-WPT_INLINE void * 
+WPT_INLINE void *
 WDI_DS_GetDatapathContext (void *pContext)
 {
    WDI_ControlBlockType *pCB = (WDI_ControlBlockType *)pContext;
    return pCB->pDPContext;
 }
 /**
- @brief Helper routine used to find a session based on the BSSID 
-  
- 
- @param  pContext:   pointer to the WLAN DAL context 
- @param  pDTDriverContext:   pointer to the Transport Driver context 
-  
+ @brief Helper routine used to find a session based on the BSSID
+
+
+ @param  pContext:   pointer to the WLAN DAL context
+ @param  pDTDriverContext:   pointer to the Transport Driver context
+
  @see
  @return void
 */
-WPT_INLINE void  
+WPT_INLINE void
 WDT_AssignTransportDriverContext (void *pContext, void *pDTDriverContext)
 {
    WDI_ControlBlockType *pCB = (WDI_ControlBlockType *)pContext;
 
    pCB->pDTDriverContext = pDTDriverContext;
-   return; 
+   return;
 }
 
 /**
- @brief Helper routine used to find a session based on the BSSID 
-  
- 
- @param  pWDICtx:   pointer to the WLAN DAL context 
-  
+ @brief Helper routine used to find a session based on the BSSID
+
+
+ @param  pWDICtx:   pointer to the WLAN DAL context
+
  @see
- @return pointer to datapath context 
+ @return pointer to datapath context
 */
-WPT_INLINE void * 
+WPT_INLINE void *
 WDT_GetTransportDriverContext (void *pContext)
 {
    WDI_ControlBlockType *pCB = (WDI_ControlBlockType *)pContext;
-   return(pCB->pDTDriverContext); 
+   return(pCB->pDTDriverContext);
 }
 
-/*============================================================================ 
+/*============================================================================
   Helper inline converters
  ============================================================================*/
 /*Convert WDI driver type into HAL driver type*/
@@ -20018,7 +20317,7 @@
   eHalStatus halStatus
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch(  halStatus )
   {
@@ -20029,14 +20328,14 @@
   case eHAL_STATUS_FAILURE:
     return WDI_STATUS_E_FAILURE;
   case eHAL_STATUS_FAILED_ALLOC:
-    return WDI_STATUS_MEM_FAILURE;    
-   /*The rest of the HAL error codes must be kept hidden from the UMAC as 
+    return WDI_STATUS_MEM_FAILURE;
+   /*The rest of the HAL error codes must be kept hidden from the UMAC as
      they refer to specific internal modules of our device*/
-  default: 
-    return WDI_STATUS_DEV_INTERNAL_FAILURE; 
-  } 
+  default:
+    return WDI_STATUS_DEV_INTERNAL_FAILURE;
+  }
 
-  return WDI_STATUS_E_FAILURE; 
+  return WDI_STATUS_E_FAILURE;
 }/*WDI_HAL_2_WDI_STATUS*/
 
 /*Convert WDI request type into HAL request type*/
@@ -20046,53 +20345,53 @@
   WDI_RequestEnumType    wdiReqType
 )
 {
-   /*Lightweight function - no sanity checks and no unecessary code to increase 
+   /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch(  wdiReqType )
-  {    
+  {
   case WDI_START_REQ:
-    return WLAN_HAL_START_REQ; 
+    return WLAN_HAL_START_REQ;
   case WDI_STOP_REQ:
-    return WLAN_HAL_STOP_REQ; 
+    return WLAN_HAL_STOP_REQ;
   case WDI_INIT_SCAN_REQ:
-    return WLAN_HAL_INIT_SCAN_REQ; 
+    return WLAN_HAL_INIT_SCAN_REQ;
   case WDI_START_SCAN_REQ:
-    return WLAN_HAL_START_SCAN_REQ; 
+    return WLAN_HAL_START_SCAN_REQ;
   case WDI_END_SCAN_REQ:
-    return WLAN_HAL_END_SCAN_REQ; 
+    return WLAN_HAL_END_SCAN_REQ;
   case WDI_FINISH_SCAN_REQ:
-    return WLAN_HAL_FINISH_SCAN_REQ; 
+    return WLAN_HAL_FINISH_SCAN_REQ;
   case WDI_JOIN_REQ:
-    return WLAN_HAL_JOIN_REQ; 
+    return WLAN_HAL_JOIN_REQ;
   case WDI_CONFIG_BSS_REQ:
-    return WLAN_HAL_CONFIG_BSS_REQ; 
+    return WLAN_HAL_CONFIG_BSS_REQ;
   case WDI_DEL_BSS_REQ:
-    return WLAN_HAL_DELETE_BSS_REQ; 
+    return WLAN_HAL_DELETE_BSS_REQ;
   case WDI_POST_ASSOC_REQ:
-    return WLAN_HAL_POST_ASSOC_REQ; 
+    return WLAN_HAL_POST_ASSOC_REQ;
   case WDI_DEL_STA_REQ:
-    return WLAN_HAL_DELETE_STA_REQ; 
+    return WLAN_HAL_DELETE_STA_REQ;
   case WDI_SET_BSS_KEY_REQ:
-    return WLAN_HAL_SET_BSSKEY_REQ; 
+    return WLAN_HAL_SET_BSSKEY_REQ;
   case WDI_RMV_BSS_KEY_REQ:
-    return WLAN_HAL_RMV_BSSKEY_REQ; 
+    return WLAN_HAL_RMV_BSSKEY_REQ;
   case WDI_SET_STA_KEY_REQ:
-    return WLAN_HAL_SET_STAKEY_REQ; 
+    return WLAN_HAL_SET_STAKEY_REQ;
   case WDI_RMV_STA_KEY_REQ:
-    return WLAN_HAL_RMV_STAKEY_REQ; 
+    return WLAN_HAL_RMV_STAKEY_REQ;
   case WDI_SET_STA_BCAST_KEY_REQ:
-    return WLAN_HAL_SET_BCASTKEY_REQ; 
+    return WLAN_HAL_SET_BCASTKEY_REQ;
   case WDI_RMV_STA_BCAST_KEY_REQ:
-    //Some conflict in the old code - check this: return WLAN_HAL_RMV_BCASTKEY_REQ; 
+    //Some conflict in the old code - check this: return WLAN_HAL_RMV_BCASTKEY_REQ;
     return WLAN_HAL_RMV_STAKEY_REQ;
   case WDI_ADD_TS_REQ:
-    return WLAN_HAL_ADD_TS_REQ; 
+    return WLAN_HAL_ADD_TS_REQ;
   case WDI_DEL_TS_REQ:
-    return WLAN_HAL_DEL_TS_REQ; 
+    return WLAN_HAL_DEL_TS_REQ;
   case WDI_UPD_EDCA_PRMS_REQ:
-    return WLAN_HAL_UPD_EDCA_PARAMS_REQ; 
+    return WLAN_HAL_UPD_EDCA_PARAMS_REQ;
   case WDI_ADD_BA_REQ:
-    return WLAN_HAL_ADD_BA_REQ; 
+    return WLAN_HAL_ADD_BA_REQ;
   case WDI_DEL_BA_REQ:
     return WLAN_HAL_DEL_BA_REQ; 
 #ifdef FEATURE_WLAN_CCX
@@ -20100,23 +20399,23 @@
     return WLAN_HAL_TSM_STATS_REQ; 
 #endif
   case WDI_CH_SWITCH_REQ:
-    return WLAN_HAL_CH_SWITCH_REQ; 
+    return WLAN_HAL_CH_SWITCH_REQ;
   case WDI_CONFIG_STA_REQ:
-    return WLAN_HAL_CONFIG_STA_REQ; 
+    return WLAN_HAL_CONFIG_STA_REQ;
   case WDI_SET_LINK_ST_REQ:
-    return WLAN_HAL_SET_LINK_ST_REQ; 
+    return WLAN_HAL_SET_LINK_ST_REQ;
   case WDI_GET_STATS_REQ:
-    return WLAN_HAL_GET_STATS_REQ; 
+    return WLAN_HAL_GET_STATS_REQ;
   case WDI_UPDATE_CFG_REQ:
-    return WLAN_HAL_UPDATE_CFG_REQ; 
+    return WLAN_HAL_UPDATE_CFG_REQ;
   case WDI_ADD_BA_SESSION_REQ:
     return WLAN_HAL_ADD_BA_SESSION_REQ;
   case WDI_TRIGGER_BA_REQ:
     return WLAN_HAL_TRIGGER_BA_REQ;
   case WDI_UPD_BCON_PRMS_REQ:
-    return WLAN_HAL_UPDATE_BEACON_REQ; 
+    return WLAN_HAL_UPDATE_BEACON_REQ;
   case WDI_SND_BCON_REQ:
-    return WLAN_HAL_SEND_BEACON_REQ; 
+    return WLAN_HAL_SEND_BEACON_REQ;
   case WDI_UPD_PROBE_RSP_TEMPLATE_REQ:
     return WLAN_HAL_UPDATE_PROBE_RSP_TEMPLATE_REQ;
    case WDI_SET_MAX_TX_POWER_REQ:
@@ -20126,25 +20425,25 @@
     return WLAN_HAL_SET_P2P_GONOA_REQ;
 #endif
   case WDI_ENTER_IMPS_REQ:
-    return WLAN_HAL_ENTER_IMPS_REQ; 
+    return WLAN_HAL_ENTER_IMPS_REQ;
   case WDI_EXIT_IMPS_REQ:
-    return WLAN_HAL_EXIT_IMPS_REQ; 
+    return WLAN_HAL_EXIT_IMPS_REQ;
   case WDI_ENTER_BMPS_REQ:
-    return WLAN_HAL_ENTER_BMPS_REQ; 
+    return WLAN_HAL_ENTER_BMPS_REQ;
   case WDI_EXIT_BMPS_REQ:
-    return WLAN_HAL_EXIT_BMPS_REQ; 
+    return WLAN_HAL_EXIT_BMPS_REQ;
   case WDI_ENTER_UAPSD_REQ:
-    return WLAN_HAL_ENTER_UAPSD_REQ; 
+    return WLAN_HAL_ENTER_UAPSD_REQ;
   case WDI_EXIT_UAPSD_REQ:
-    return WLAN_HAL_EXIT_UAPSD_REQ; 
+    return WLAN_HAL_EXIT_UAPSD_REQ;
   case WDI_SET_UAPSD_PARAM_REQ:
-    return WLAN_HAL_SET_UAPSD_AC_PARAMS_REQ; 
+    return WLAN_HAL_SET_UAPSD_AC_PARAMS_REQ;
   case WDI_UPDATE_UAPSD_PARAM_REQ:
-    return WLAN_HAL_UPDATE_UAPSD_PARAM_REQ; 
+    return WLAN_HAL_UPDATE_UAPSD_PARAM_REQ;
   case WDI_CONFIGURE_RXP_FILTER_REQ:
-    return WLAN_HAL_CONFIGURE_RXP_FILTER_REQ; 
+    return WLAN_HAL_CONFIGURE_RXP_FILTER_REQ;
   case WDI_SET_BEACON_FILTER_REQ:
-    return WLAN_HAL_ADD_BCN_FILTER_REQ; 
+    return WLAN_HAL_ADD_BCN_FILTER_REQ;
   case WDI_REM_BEACON_FILTER_REQ:
     return WLAN_HAL_REM_BCN_FILTER_REQ;
   case WDI_SET_RSSI_THRESHOLDS_REQ:
@@ -20179,6 +20478,10 @@
     return WLAN_HAL_ADD_STA_SELF_REQ;
   case WDI_DEL_STA_SELF_REQ:
     return WLAN_HAL_DEL_STA_SELF_REQ;
+#ifdef FEATURE_OEM_DATA_SUPPORT
+  case WDI_START_OEM_DATA_REQ:
+    return WLAN_HAL_START_OEM_DATA_REQ;
+#endif /* FEATURE_OEM_DATA_SUPPORT */
   case WDI_HOST_RESUME_REQ:
     return WLAN_HAL_HOST_RESUME_REQ;
   case WDI_HOST_SUSPEND_IND:
@@ -20200,7 +20503,7 @@
   case WDI_8023_MULTICAST_LIST_REQ:
     return WLAN_HAL_8023_MULTICAST_LIST_REQ;
   case WDI_RECEIVE_FILTER_SET_FILTER_REQ:
-    return WLAN_HAL_SET_PACKET_FILTER_REQ; 
+    return WLAN_HAL_SET_PACKET_FILTER_REQ;
   case WDI_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ:
     return WLAN_HAL_PACKET_FILTER_MATCH_COUNT_REQ;
   case WDI_RECEIVE_FILTER_CLEAR_FILTER_REQ:
@@ -20224,9 +20527,9 @@
   case WDI_FEATURE_CAPS_EXCHANGE_REQ:
     return WLAN_HAL_FEATURE_CAPS_EXCHANGE_REQ;
   default:
-    return WLAN_HAL_MSG_MAX; 
+    return WLAN_HAL_MSG_MAX;
   }
-  
+
 }/*WDI_2_HAL_REQ_TYPE*/
 
 /*Convert WDI response type into HAL response type*/
@@ -20236,7 +20539,7 @@
   tHalHostMsgType halMsg
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch(  halMsg )
   {
@@ -20338,23 +20641,23 @@
     return WDI_P2P_GO_NOTICE_OF_ABSENCE_RESP;
 #endif
   case WLAN_HAL_ENTER_IMPS_RSP:
-    return WDI_ENTER_IMPS_RESP; 
+    return WDI_ENTER_IMPS_RESP;
   case WLAN_HAL_EXIT_IMPS_RSP:
-    return WDI_EXIT_IMPS_RESP; 
+    return WDI_EXIT_IMPS_RESP;
   case WLAN_HAL_ENTER_BMPS_RSP:
-    return WDI_ENTER_BMPS_RESP; 
+    return WDI_ENTER_BMPS_RESP;
   case WLAN_HAL_EXIT_BMPS_RSP:
-    return WDI_EXIT_BMPS_RESP; 
+    return WDI_EXIT_BMPS_RESP;
   case WLAN_HAL_ENTER_UAPSD_RSP:
-    return WDI_ENTER_UAPSD_RESP; 
+    return WDI_ENTER_UAPSD_RESP;
   case WLAN_HAL_EXIT_UAPSD_RSP:
-    return WDI_EXIT_UAPSD_RESP; 
+    return WDI_EXIT_UAPSD_RESP;
   case WLAN_HAL_SET_UAPSD_AC_PARAMS_RSP:
-    return WDI_SET_UAPSD_PARAM_RESP; 
+    return WDI_SET_UAPSD_PARAM_RESP;
   case WLAN_HAL_UPDATE_UAPSD_PARAM_RSP:
-    return WDI_UPDATE_UAPSD_PARAM_RESP; 
+    return WDI_UPDATE_UAPSD_PARAM_RESP;
   case WLAN_HAL_CONFIGURE_RXP_FILTER_RSP:
-    return WDI_CONFIGURE_RXP_FILTER_RESP; 
+    return WDI_CONFIGURE_RXP_FILTER_RESP;
   case WLAN_HAL_ADD_BCN_FILTER_RSP:
     return WDI_SET_BEACON_FILTER_RESP;
   case WLAN_HAL_REM_BCN_FILTER_RSP:
@@ -20387,6 +20690,10 @@
     return WDI_ADD_STA_SELF_RESP;
 case WLAN_HAL_DEL_STA_SELF_RSP:
     return WDI_DEL_STA_SELF_RESP;
+#ifdef FEATURE_OEM_DATA_SUPPORT
+  case WLAN_HAL_START_OEM_DATA_RSP:
+    return WDI_START_OEM_DATA_RESP;
+#endif /* FEATURE_OEM_DATA_SUPPORT */
   case WLAN_HAL_HOST_RESUME_RSP:
     return WDI_HOST_RESUME_RESP;
   case WLAN_HAL_KEEP_ALIVE_RSP:
@@ -20395,7 +20702,7 @@
   case WLAN_HAL_SET_PREF_NETWORK_RSP:
     return WDI_SET_PREF_NETWORK_RESP;
   case WLAN_HAL_SET_RSSI_FILTER_RSP:
-    return WDI_SET_RSSI_FILTER_RESP; 
+    return WDI_SET_RSSI_FILTER_RESP;
   case WLAN_HAL_UPDATE_SCAN_PARAM_RSP:
     return WDI_UPDATE_SCAN_PARAMS_RESP;
   case WLAN_HAL_PREF_NETW_FOUND_IND:
@@ -20439,7 +20746,7 @@
   case WLAN_HAL_FEATURE_CAPS_EXCHANGE_RSP:
       return WDI_FEATURE_CAPS_EXCHANGE_RESP;
   default:
-    return eDRIVER_TYPE_MAX; 
+    return eDRIVER_TYPE_MAX;
   }
 
 }/*HAL_2_WDI_RSP_TYPE*/
@@ -20452,7 +20759,7 @@
   WDI_DriverType wdiDriverType
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch(  wdiDriverType )
   {
@@ -20464,7 +20771,7 @@
     return eDRIVER_TYPE_DVT;
   }
 
-  return eDRIVER_TYPE_MAX; 
+  return eDRIVER_TYPE_MAX;
 }/*WDI_2_HAL_DRV_TYPE*/
 
 
@@ -20475,7 +20782,7 @@
   WDI_StopType wdiDriverType
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch(  wdiDriverType )
   {
@@ -20487,7 +20794,7 @@
     return HAL_STOP_TYPE_RF_KILL;
   }
 
-  return HAL_STOP_TYPE_MAX; 
+  return HAL_STOP_TYPE_MAX;
 }/*WDI_2_HAL_STOP_REASON*/
 
 
@@ -20498,7 +20805,7 @@
   WDI_ScanMode wdiScanMode
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch(  wdiScanMode )
   {
@@ -20514,29 +20821,47 @@
     return eHAL_SYS_MODE_SUSPEND_LINK;
   }
 
-  return eHAL_SYS_MODE_MAX; 
+  return eHAL_SYS_MODE_MAX;
 }/*WDI_2_HAL_SCAN_MODE*/
 
 /*Convert WDI sec ch offset into HAL sec ch offset type*/
-WPT_STATIC WPT_INLINE tSirMacHTSecondaryChannelOffset
+WPT_STATIC WPT_INLINE ePhyChanBondState
 WDI_2_HAL_SEC_CH_OFFSET
 (
   WDI_HTSecondaryChannelOffset wdiSecChOffset
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch(  wdiSecChOffset )
   {
   case WDI_SECONDARY_CHANNEL_OFFSET_NONE:
-    return eHT_SECONDARY_CHANNEL_OFFSET_NONE;
+    return PHY_SINGLE_CHANNEL_CENTERED;
   case WDI_SECONDARY_CHANNEL_OFFSET_UP:
-    return eHT_SECONDARY_CHANNEL_OFFSET_UP;
+    return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
   case WDI_SECONDARY_CHANNEL_OFFSET_DOWN:
-    return eHT_SECONDARY_CHANNEL_OFFSET_DOWN;
+    return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+#ifdef WLAN_FEATURE_11AC
+  case WDI_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
+  case WDI_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
+  case WDI_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
+  case WDI_CHANNEL_20MHZ_LOW_40MHZ_LOW:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
+  case WDI_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
+  case WDI_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
+  case WDI_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
+     return PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
+#endif
+  default:
+      break;
   }
 
-  return eHT_SECONDARY_CHANNEL_OFFSET_MAX; 
+  return PHY_CHANNEL_BONDING_STATE_MAX; 
 }/*WDI_2_HAL_SEC_CH_OFFSET*/
 
 /*Convert WDI BSS type into HAL BSS type*/
@@ -20546,7 +20871,7 @@
   WDI_BssType wdiBSSType
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch(  wdiBSSType )
   {
@@ -20559,12 +20884,12 @@
   case WDI_BTAMP_STA_MODE:
     return eSIR_BTAMP_STA_MODE;
   case WDI_BTAMP_AP_MODE:
-    return eSIR_BTAMP_AP_MODE; 
+    return eSIR_BTAMP_AP_MODE;
   case WDI_BSS_AUTO_MODE:
     return eSIR_AUTO_MODE;
   }
 
-  return eSIR_DONOT_USE_BSS_TYPE; 
+  return eSIR_DONOT_USE_BSS_TYPE;
 }/*WDI_2_HAL_BSS_TYPE*/
 
 /*Convert WDI NW type into HAL NW type*/
@@ -20574,7 +20899,7 @@
   WDI_NwType wdiNWType
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch(  wdiNWType )
   {
@@ -20588,7 +20913,7 @@
     return eSIR_11N_NW_TYPE;
   }
 
-  return eSIR_DONOT_USE_NW_TYPE; 
+  return eSIR_DONOT_USE_NW_TYPE;
 }/*WDI_2_HAL_NW_TYPE*/
 
 /*Convert WDI chanel bonding type into HAL cb type*/
@@ -20598,7 +20923,7 @@
   WDI_PhyChanBondState wdiCbState
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch ( wdiCbState )
   {
@@ -20610,8 +20935,27 @@
     return PHY_DOUBLE_CHANNEL_CENTERED;
   case WDI_PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
     return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+#ifdef WLAN_FEATURE_11AC
+  case WDI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
+  case WDI_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
+  case WDI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
+  case WDI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
+  case WDI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
+  case WDI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
+  case WDI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
+    return PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
+#endif
+  case WDI_MAX_CB_STATE:
+  default:
+    break;
   }
-  
+
   return PHY_CHANNEL_BONDING_STATE_MAX;
 }/*WDI_2_HAL_CB_STATE*/
 
@@ -20622,7 +20966,7 @@
   WDI_HTOperatingMode wdiHTOperMode
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch ( wdiHTOperMode )
   {
@@ -20635,7 +20979,7 @@
   case WDI_HT_OP_MODE_MIXED:
     return eSIR_HT_OP_MODE_MIXED;
   }
-  
+
   return eSIR_HT_OP_MODE_MAX;
 }/*WDI_2_HAL_HT_OPER_MODE*/
 
@@ -20646,7 +20990,7 @@
   WDI_HTMIMOPowerSaveState wdiHTOperMode
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch ( wdiHTOperMode )
   {
@@ -20659,7 +21003,7 @@
   case WDI_HT_MIMO_PS_NO_LIMIT:
     return eSIR_HT_MIMO_PS_NO_LIMIT;
   }
-  
+
   return eSIR_HT_MIMO_PS_MAX;
 }/*WDI_2_HAL_MIMO_PS*/
 
@@ -20670,7 +21014,7 @@
   WDI_EncryptType wdiEncType
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch ( wdiEncType )
   {
@@ -20708,7 +21052,7 @@
   WDI_WepType  wdiWEPType
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch ( wdiWEPType )
   {
@@ -20718,7 +21062,7 @@
   case WDI_WEP_DYNAMIC:
     return eSIR_WEP_DYNAMIC;
   }
-  
+
   return eSIR_WEP_MAX;
 }/*WDI_2_HAL_WEP_TYPE*/
 
@@ -20728,7 +21072,7 @@
   WDI_LinkStateType  wdiLinkState
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
   switch ( wdiLinkState )
   {
@@ -20781,27 +21125,35 @@
 
   default:
     return eSIR_LINK_MAX;
-  }  
+  }
 }
 
-/*Translate a STA Context from WDI into HAL*/ 
-WPT_STATIC WPT_INLINE 
+/*Translate a STA Context from WDI into HAL*/
+WPT_STATIC WPT_INLINE
 void
 WDI_CopyWDIStaCtxToHALStaCtx
-( 
+(
   tConfigStaParams*          phalConfigSta,
   WDI_ConfigStaReqInfoType*  pwdiConfigSta
 )
 {
    wpt_uint8 i;
-   /*Lightweight function - no sanity checks and no unecessary code to increase 
+#ifdef WLAN_FEATURE_11AC
+   /* Get the Version 1 Handler */
+   tConfigStaParams_V1* phalConfigSta_V1 = NULL;
+   if (WDI_getFwWlanFeatCaps(DOT11AC))
+   {
+	   phalConfigSta_V1 = (tConfigStaParams_V1*)phalConfigSta;
+   }
+#endif
+   /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
 
-  wpalMemoryCopy(phalConfigSta->bssId, 
-                  pwdiConfigSta->macBSSID, WDI_MAC_ADDR_LEN); 
-  
-  wpalMemoryCopy(phalConfigSta->staMac, 
-                  pwdiConfigSta->macSTA, WDI_MAC_ADDR_LEN); 
+  wpalMemoryCopy(phalConfigSta->bssId,
+                  pwdiConfigSta->macBSSID, WDI_MAC_ADDR_LEN);
+
+  wpalMemoryCopy(phalConfigSta->staMac,
+                  pwdiConfigSta->macSTA, WDI_MAC_ADDR_LEN);
 
   phalConfigSta->assocId                 = pwdiConfigSta->usAssocId;
   phalConfigSta->staType                 = pwdiConfigSta->wdiSTAType;
@@ -20826,19 +21178,19 @@
   phalConfigSta->us32MaxAmpduDuration    = pwdiConfigSta->us32MaxAmpduDuratio;
   phalConfigSta->fDsssCckMode40Mhz       = pwdiConfigSta->ucDsssCckMode40Mhz;
   phalConfigSta->encryptType             = pwdiConfigSta->ucEncryptType;
-  
+
   phalConfigSta->mimoPS = WDI_2_HAL_MIMO_PS(pwdiConfigSta->wdiMIMOPS);
 
-  phalConfigSta->supportedRates.opRateMode = 
+  phalConfigSta->supportedRates.opRateMode =
                           pwdiConfigSta->wdiSupportedRates.opRateMode;
   for(i = 0; i < SIR_NUM_11B_RATES; i ++)
   {
-     phalConfigSta->supportedRates.llbRates[i] = 
+     phalConfigSta->supportedRates.llbRates[i] =
                           pwdiConfigSta->wdiSupportedRates.llbRates[i];
   }
   for(i = 0; i < SIR_NUM_11A_RATES; i ++)
   {
-     phalConfigSta->supportedRates.llaRates[i] = 
+     phalConfigSta->supportedRates.llaRates[i] =
                           pwdiConfigSta->wdiSupportedRates.llaRates[i];
   }
   for(i = 0; i < SIR_NUM_POLARIS_RATES; i ++)
@@ -20846,31 +21198,48 @@
      phalConfigSta->supportedRates.aniLegacyRates[i] =
                           pwdiConfigSta->wdiSupportedRates.aLegacyRates[i];
   }
-  phalConfigSta->supportedRates.aniEnhancedRateBitmap = 
+  phalConfigSta->supportedRates.aniEnhancedRateBitmap =
                           pwdiConfigSta->wdiSupportedRates.uEnhancedRateBitmap;
   for(i = 0; i < SIR_MAC_MAX_SUPPORTED_MCS_SET; i ++)
   {
-     phalConfigSta->supportedRates.supportedMCSSet[i] = 
+     phalConfigSta->supportedRates.supportedMCSSet[i] =
                           pwdiConfigSta->wdiSupportedRates.aSupportedMCSSet[i];
   }
   phalConfigSta->supportedRates.rxHighestDataRate =
                           pwdiConfigSta->wdiSupportedRates.aRxHighestDataRate;
 
+#ifdef WLAN_FEATURE_11AC
+  if(phalConfigSta_V1 != NULL)
+  {
+	  phalConfigSta_V1->supportedRates.vhtRxMCSMap = pwdiConfigSta->wdiSupportedRates.vhtRxMCSMap;
+	  phalConfigSta_V1->supportedRates.vhtRxHighestDataRate = pwdiConfigSta->wdiSupportedRates.vhtRxHighestDataRate;
+	  phalConfigSta_V1->supportedRates.vhtTxMCSMap = pwdiConfigSta->wdiSupportedRates.vhtTxMCSMap;
+	  phalConfigSta_V1->supportedRates.vhtTxHighestDataRate = pwdiConfigSta->wdiSupportedRates.vhtTxHighestDataRate;
+  }
+#endif
+
 #ifdef WLAN_FEATURE_P2P
   phalConfigSta->p2pCapableSta = pwdiConfigSta->ucP2pCapableSta ;
 #endif
 
+#ifdef WLAN_FEATURE_11AC
+  if(phalConfigSta_V1 != NULL)
+  {
+	  phalConfigSta_V1->vhtCapable = pwdiConfigSta->ucVhtCapableSta;
+	  phalConfigSta_V1->vhtTxChannelWidthSet = pwdiConfigSta->ucVhtTxChannelWidthSet;
+  }
+#endif
 }/*WDI_CopyWDIStaCtxToHALStaCtx*/;
- 
-/*Translate a Rate set info from WDI into HAL*/ 
-WPT_STATIC WPT_INLINE void 
+
+/*Translate a Rate set info from WDI into HAL*/
+WPT_STATIC WPT_INLINE void
 WDI_CopyWDIRateSetToHALRateSet
-( 
+(
   tSirMacRateSet* pHalRateSet,
   WDI_RateSet*    pwdiRateSet
 )
 {
-  wpt_uint8 i; 
+  wpt_uint8 i;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
   pHalRateSet->numRates = ( pwdiRateSet->ucNumRates <= SIR_MAC_RATESET_EID_MAX )?
@@ -20880,19 +21249,19 @@
   {
     pHalRateSet->rate[i] = pwdiRateSet->aRates[i];
   }
-  
+
 }/*WDI_CopyWDIRateSetToHALRateSet*/
 
 
 /*Translate an EDCA Parameter Record from WDI into HAL*/
 WPT_STATIC WPT_INLINE void
 WDI_CopyWDIEDCAParamsToHALEDCAParams
-( 
+(
   tSirMacEdcaParamRecord* phalEdcaParam,
   WDI_EdcaParamRecord*    pWDIEdcaParam
 )
 {
-  /*Lightweight function - no sanity checks and no unecessary code to increase 
+  /*Lightweight function - no sanity checks and no unecessary code to increase
     the chances of getting inlined*/
 
   phalEdcaParam->aci.rsvd   = pWDIEdcaParam->wdiACI.rsvd;
@@ -20929,11 +21298,11 @@
   pmacMgmtHdr->durationLo =  pwdiMacMgmtHdr->durationLo;
   pmacMgmtHdr->durationHi =  pwdiMacMgmtHdr->durationHi;
 
-  wpalMemoryCopy(pmacMgmtHdr->da, 
+  wpalMemoryCopy(pmacMgmtHdr->da,
                  pwdiMacMgmtHdr->da, 6);
-  wpalMemoryCopy(pmacMgmtHdr->sa, 
+  wpalMemoryCopy(pmacMgmtHdr->sa,
                  pwdiMacMgmtHdr->sa, 6);
-  wpalMemoryCopy(pmacMgmtHdr->bssId, 
+  wpalMemoryCopy(pmacMgmtHdr->bssId,
                  pwdiMacMgmtHdr->bssId, 6);
 
   pmacMgmtHdr->seqControl.fragNum  =  pwdiMacMgmtHdr->seqControl.fragNum;
@@ -20953,6 +21322,13 @@
 {
 
   wpt_uint8 keyIndex = 0;
+#ifdef WLAN_FEATURE_11AC
+  /* Get the Version 1 Handler */
+  tConfigBssParams_V1* phalConfigBSS_V1 = NULL;
+  if (WDI_getFwWlanFeatCaps(DOT11AC))
+	  phalConfigBSS_V1 = (tConfigBssParams_V1*)phalConfigBSS;
+#endif
+
   wpalMemoryCopy( phalConfigBSS->bssId,
                   pwdiConfigBSS->macBSSID,
                   WDI_MAC_ADDR_LEN);
@@ -20968,14 +21344,14 @@
   phalConfigBSS->operMode = pwdiConfigBSS->ucOperMode;
   phalConfigBSS->nwType   = WDI_2_HAL_NW_TYPE(pwdiConfigBSS->wdiNWType);
 
-  phalConfigBSS->shortSlotTimeSupported = 
+  phalConfigBSS->shortSlotTimeSupported =
      pwdiConfigBSS->ucShortSlotTimeSupported;
   phalConfigBSS->llaCoexist         = pwdiConfigBSS->ucllaCoexist;
   phalConfigBSS->llbCoexist         = pwdiConfigBSS->ucllbCoexist;
   phalConfigBSS->llgCoexist         = pwdiConfigBSS->ucllgCoexist;
   phalConfigBSS->ht20Coexist        = pwdiConfigBSS->ucHT20Coexist;
   phalConfigBSS->llnNonGFCoexist    = pwdiConfigBSS->ucllnNonGFCoexist;
-  phalConfigBSS->fLsigTXOPProtectionFullSupport = 
+  phalConfigBSS->fLsigTXOPProtectionFullSupport =
     pwdiConfigBSS->ucTXOPProtectionFullSupport;
   phalConfigBSS->fRIFSMode          = pwdiConfigBSS->ucRIFSMode;
   phalConfigBSS->beaconInterval     = pwdiConfigBSS->usBeaconInterval;
@@ -20988,8 +21364,8 @@
   phalConfigBSS->obssProtEnabled    = pwdiConfigBSS->ucObssProtEnabled;
   phalConfigBSS->rmfEnabled         = pwdiConfigBSS->ucRMFEnabled;
 
-  phalConfigBSS->htOperMode = 
-    WDI_2_HAL_HT_OPER_MODE(pwdiConfigBSS->wdiHTOperMod); 
+  phalConfigBSS->htOperMode =
+    WDI_2_HAL_HT_OPER_MODE(pwdiConfigBSS->wdiHTOperMod);
 
   phalConfigBSS->dualCTSProtection        = pwdiConfigBSS->ucDualCTSProtection;
   phalConfigBSS->ucMaxProbeRespRetryLimit = pwdiConfigBSS->ucMaxProbeRespRetryLimit;
@@ -21002,16 +21378,16 @@
 
   /*! Used 32 as magic number because that is how the ssid is declared inside the
    hal header - hal needs a macro for it */
-  phalConfigBSS->ssId.length = 
+  phalConfigBSS->ssId.length =
     (pwdiConfigBSS->wdiSSID.ucLength <= 32)?
     pwdiConfigBSS->wdiSSID.ucLength : 32;
   wpalMemoryCopy(phalConfigBSS->ssId.ssId,
-                 pwdiConfigBSS->wdiSSID.sSSID, 
-                 phalConfigBSS->ssId.length); 
+                 pwdiConfigBSS->wdiSSID.sSSID,
+                 phalConfigBSS->ssId.length);
 
   WDI_CopyWDIStaCtxToHALStaCtx( &phalConfigBSS->staContext,
                                 &pwdiConfigBSS->wdiSTAContext);
-  
+
   WDI_CopyWDIRateSetToHALRateSet( &phalConfigBSS->rateSet,
                                   &pwdiConfigBSS->wdiRateSet);
 
@@ -21029,24 +21405,24 @@
                                            &pwdiConfigBSS->wdiVOEDCAParams);
   }
 
-  phalConfigBSS->halPersona = pwdiConfigBSS->ucPersona; 
+  phalConfigBSS->halPersona = pwdiConfigBSS->ucPersona;
 
   phalConfigBSS->bSpectrumMgtEnable = pwdiConfigBSS->bSpectrumMgtEn;
 
 #ifdef WLAN_FEATURE_VOWIFI_11R
 
-  phalConfigBSS->extSetStaKeyParamValid = 
+  phalConfigBSS->extSetStaKeyParamValid =
      pwdiConfigBSS->bExtSetStaKeyParamValid;
-  
+
   if( phalConfigBSS->extSetStaKeyParamValid )
   {
      /*-----------------------------------------------------------------------
        Copy the STA Key parameters into the HAL message
      -----------------------------------------------------------------------*/
-     phalConfigBSS->extSetStaKeyParam.encType = 
+     phalConfigBSS->extSetStaKeyParam.encType =
         WDI_2_HAL_ENC_TYPE (pwdiConfigBSS->wdiExtSetKeyParam.wdiEncType);
 
-     phalConfigBSS->extSetStaKeyParam.wepType = 
+     phalConfigBSS->extSetStaKeyParam.wepType =
         WDI_2_HAL_WEP_TYPE (pwdiConfigBSS->wdiExtSetKeyParam.wdiWEPType );
 
      phalConfigBSS->extSetStaKeyParam.staIdx = pwdiConfigBSS->wdiExtSetKeyParam.ucSTAIdx;
@@ -21059,60 +21435,68 @@
      for(keyIndex = 0; keyIndex < pwdiConfigBSS->wdiExtSetKeyParam.ucNumKeys ;
           keyIndex++)
      {
-        phalConfigBSS->extSetStaKeyParam.key[keyIndex].keyId = 
+        phalConfigBSS->extSetStaKeyParam.key[keyIndex].keyId =
            pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[keyIndex].keyId;
         phalConfigBSS->extSetStaKeyParam.key[keyIndex].unicast =
            pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[keyIndex].unicast;
         phalConfigBSS->extSetStaKeyParam.key[keyIndex].keyDirection =
            pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[keyIndex].keyDirection;
         wpalMemoryCopy(phalConfigBSS->extSetStaKeyParam.key[keyIndex].keyRsc,
-                       pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[keyIndex].keyRsc, 
+                       pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[keyIndex].keyRsc,
                        WDI_MAX_KEY_RSC_LEN);
-        phalConfigBSS->extSetStaKeyParam.key[keyIndex].paeRole = 
+        phalConfigBSS->extSetStaKeyParam.key[keyIndex].paeRole =
            pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[keyIndex].paeRole;
-        phalConfigBSS->extSetStaKeyParam.key[keyIndex].keyLength = 
+        phalConfigBSS->extSetStaKeyParam.key[keyIndex].keyLength =
            pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[keyIndex].keyLength;
         wpalMemoryCopy(phalConfigBSS->extSetStaKeyParam.key[keyIndex].key,
-                       pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[keyIndex].key, 
+                       pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[keyIndex].key,
                        WDI_MAX_KEY_LENGTH);
      }
 #else
-     phalConfigBSS->extSetStaKeyParam.key.keyId = 
+     phalConfigBSS->extSetStaKeyParam.key.keyId =
         pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[0].keyId;
      phalConfigBSS->extSetStaKeyParam.key.unicast =
         pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[0].unicast;
      phalConfigBSS->extSetStaKeyParam.key.keyDirection =
         pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[0].keyDirection;
      wpalMemoryCopy(phalConfigBSS->extSetStaKeyParam.key.keyRsc,
-                    pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[0].keyRsc, 
+                    pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[0].keyRsc,
                     WDI_MAX_KEY_RSC_LEN);
-     phalConfigBSS->extSetStaKeyParam.key.paeRole = 
+     phalConfigBSS->extSetStaKeyParam.key.paeRole =
         pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[0].paeRole;
-     phalConfigBSS->extSetStaKeyParam.key.keyLength = 
+     phalConfigBSS->extSetStaKeyParam.key.keyLength =
         pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[0].keyLength;
      wpalMemoryCopy(phalConfigBSS->extSetStaKeyParam.key.key,
-                    pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[0].key, 
+                    pwdiConfigBSS->wdiExtSetKeyParam.wdiKey[0].key,
                     WDI_MAX_KEY_LENGTH);
 #endif
   }
   else/* phalConfigBSS->extSetStaKeyParamValid is not set */
   {
-     wpalMemoryZero( &phalConfigBSS->extSetStaKeyParam, 
+     wpalMemoryZero( &phalConfigBSS->extSetStaKeyParam,
                      sizeof(phalConfigBSS->extSetStaKeyParam) );
   }
 
 #endif /*WLAN_FEATURE_VOWIFI_11R*/
 
+#ifdef WLAN_FEATURE_11AC
+  if(phalConfigBSS_V1 != NULL)
+  {
+      phalConfigBSS_V1->vhtCapable = pwdiConfigBSS->ucVhtCapableSta;
+      phalConfigBSS_V1->vhtTxChannelWidthSet = pwdiConfigBSS->ucVhtTxChannelWidthSet;
+  }
+#endif
+
 }/*WDI_CopyWDIConfigBSSToHALConfigBSS*/
 
 
-/*Extract the request CB function and user data from a request structure 
+/*Extract the request CB function and user data from a request structure
   pointed to by user data */
 WPT_STATIC WPT_INLINE void
 WDI_ExtractRequestCBFromEvent
 (
   WDI_EventInfoType* pEvent,
-  WDI_ReqStatusCb*   ppfnReqCB, 
+  WDI_ReqStatusCb*   ppfnReqCB,
   void**             ppUserData
 )
 {
@@ -21273,7 +21657,7 @@
   case  WDI_REM_BEACON_FILTER_REQ:
     *ppfnReqCB   =  ((WDI_RemBeaconFilterReqParamsType*)pEvent->pEventData)->wdiReqStatusCB;
     *ppUserData  =  ((WDI_RemBeaconFilterReqParamsType*)pEvent->pEventData)->pUserData;
-     break; 
+     break;
   case  WDI_SET_RSSI_THRESHOLDS_REQ:
     *ppfnReqCB   =  ((WDI_SetRSSIThresholdsReqParamsType*)pEvent->pEventData)->wdiReqStatusCB;
     *ppUserData  =  ((WDI_SetRSSIThresholdsReqParamsType*)pEvent->pEventData)->pUserData;
@@ -21316,42 +21700,42 @@
   default:
     *ppfnReqCB   =  NULL;
     *ppUserData  =  NULL;
-      break; 
+      break;
   }
 }/*WDI_ExtractRequestCBFromEvent*/
 
 
 /**
- @brief WDI_IsHwFrameTxTranslationCapable checks to see if HW 
+ @brief WDI_IsHwFrameTxTranslationCapable checks to see if HW
         frame xtl is enabled for a particular STA.
 
  WDI_PostAssocReq must have been called.
 
- @param uSTAIdx: STA index 
-  
+ @param uSTAIdx: STA index
+
  @see WDI_PostAssocReq
  @return Result of the function call
 */
-wpt_boolean 
+wpt_boolean
 WDI_IsHwFrameTxTranslationCapable
 (
   wpt_uint8 uSTAIdx
 )
 {
-  /*!! FIX ME - this must eventually be per station - for now just feedback 
+  /*!! FIX ME - this must eventually be per station - for now just feedback
     uma value*/
   /*------------------------------------------------------------------------
-    Sanity Check 
+    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; 
+    return WDI_STATUS_E_NOT_ALLOWED;
   }
 
-  
+
   return gWDICb.bFrameTransEnabled;
 }/*WDI_IsHwFrameTxTranslationCapable*/
 
@@ -21359,19 +21743,19 @@
 /**
  @brief WDI_SetPreferredNetworkList
 
- @param pwdiPNOScanReqParams: the Set PNO as specified 
+ @param pwdiPNOScanReqParams: the Set PNO as specified
                       by the Device Interface
-  
+
         wdiPNOScanCb: callback for passing back the response
         of the Set PNO operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetPreferredNetworkReq
 (
   WDI_PNOScanReqParamsType* pwdiPNOScanReqParams,
@@ -21383,23 +21767,23 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_SET_PREF_NETWORK_REQ;
-   wdiEventData.pEventData      = pwdiPNOScanReqParams; 
+   wdiEventData.pEventData      = pwdiPNOScanReqParams;
    wdiEventData.uEventDataSize  = sizeof(*pwdiPNOScanReqParams);
-   wdiEventData.pCBfnc          = wdiPNOScanCb; 
+   wdiEventData.pCBfnc          = wdiPNOScanCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -21409,19 +21793,19 @@
 /**
  @brief WDI_SetRssiFilterReq
 
- @param pwdiRssiFilterReqParams: the Set RSSI Filter as 
+ @param pwdiRssiFilterReqParams: the Set RSSI Filter as
                       specified by the Device Interface
-  
+
         wdiRssiFilterCb: callback for passing back the response
         of the Set RSSI Filter operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetRssiFilterReq
 (
   WDI_SetRssiFilterReqParamsType* pwdiRssiFilterReqParams,
@@ -21433,23 +21817,23 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_SET_RSSI_FILTER_REQ;
-   wdiEventData.pEventData      = pwdiRssiFilterReqParams; 
+   wdiEventData.pEventData      = pwdiRssiFilterReqParams;
    wdiEventData.uEventDataSize  = sizeof(*pwdiRssiFilterReqParams);
-   wdiEventData.pCBfnc          = wdiRssiFilterCb; 
+   wdiEventData.pCBfnc          = wdiRssiFilterCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -21458,19 +21842,19 @@
 /**
  @brief WDI_UpdateScanParamsReq
 
- @param pwdiUpdateScanParamsInfoType: the Update Scan Params as specified 
+ @param pwdiUpdateScanParamsInfoType: the Update Scan Params as specified
                       by the Device Interface
-  
+
         wdiUpdateScanParamsCb: callback for passing back the response
         of the Set PNO operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_UpdateScanParamsReq
 (
   WDI_UpdateScanParamsInfoType* pwdiUpdateScanParamsInfoType,
@@ -21482,38 +21866,38 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_UPDATE_SCAN_PARAMS_REQ;
-   wdiEventData.pEventData      = pwdiUpdateScanParamsInfoType; 
+   wdiEventData.pEventData      = pwdiUpdateScanParamsInfoType;
    wdiEventData.uEventDataSize  = sizeof(*pwdiUpdateScanParamsInfoType);
-   wdiEventData.pCBfnc          = wdiUpdateScanParamsCb; 
+   wdiEventData.pCBfnc          = wdiUpdateScanParamsCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }
 
 /**
- @brief Helper function to pack Set Preferred Network List 
+ @brief Helper function to pack Set Preferred Network List
         Request parameters
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
          pwdiPNOScanReqParams:      pointer to the info received
          from upper layers
          ppSendBuffer, pSize - out pointers of the packed buffer
-         and its size 
-  
+         and its size
+
  @return Result of the function call
 */
 
@@ -21526,7 +21910,7 @@
   wpt_uint16*                pSize
 )
 {
-   wpt_uint8*                 pSendBuffer           = NULL; 
+   wpt_uint8*                 pSendBuffer           = NULL;
    wpt_uint16                 usDataOffset          = 0;
    wpt_uint16                 usSendSize            = 0;
    tPrefNetwListParams        pPrefNetwListParams = {0};
@@ -21536,7 +21920,7 @@
    /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_PREF_NETWORK_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_PREF_NETWORK_REQ,
                          sizeof(pPrefNetwListParams),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(pPrefNetwListParams) )))
@@ -21545,25 +21929,25 @@
                   "Unable to get send buffer in Set PNO req %x ",
                    pwdiPNOScanReqParams);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-------------------------------------------------------------------------
      Fill prefNetwListParams from pwdiPNOScanReqParams->wdiPNOScanInfo
    -------------------------------------------------------------------------*/
-   pPrefNetwListParams.enable  = 
+   pPrefNetwListParams.enable  =
      pwdiPNOScanReqParams->wdiPNOScanInfo.bEnable;
-   pPrefNetwListParams.modePNO = 
+   pPrefNetwListParams.modePNO =
      pwdiPNOScanReqParams->wdiPNOScanInfo.wdiModePNO;
 
-   pPrefNetwListParams.ucNetworksCount = 
-     (pwdiPNOScanReqParams->wdiPNOScanInfo.ucNetworksCount < 
+   pPrefNetwListParams.ucNetworksCount =
+     (pwdiPNOScanReqParams->wdiPNOScanInfo.ucNetworksCount <
       WLAN_HAL_PNO_MAX_SUPP_NETWORKS)?
-     pwdiPNOScanReqParams->wdiPNOScanInfo.ucNetworksCount : 
+     pwdiPNOScanReqParams->wdiPNOScanInfo.ucNetworksCount :
       WLAN_HAL_PNO_MAX_SUPP_NETWORKS;
 
    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
-               "WDI SET PNO: Enable %d, Mode %d, Netw Count %d", 
+               "WDI SET PNO: Enable %d, Mode %d, Netw Count %d",
                pwdiPNOScanReqParams->wdiPNOScanInfo.bEnable,
                pwdiPNOScanReqParams->wdiPNOScanInfo.wdiModePNO,
                pwdiPNOScanReqParams->wdiPNOScanInfo.ucNetworksCount);
@@ -21579,16 +21963,16 @@
           pPrefNetwListParams.aNetworks[i].ssId.length);
 
      /*Authentication type for the network*/
-     pPrefNetwListParams.aNetworks[i].authentication = 
-       (tAuthType)pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].wdiAuth; 
+     pPrefNetwListParams.aNetworks[i].authentication =
+       (tAuthType)pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].wdiAuth;
 
      /*Encryption type for the network*/
-     pPrefNetwListParams.aNetworks[i].encryption = 
-       (tEdType)pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].wdiEncryption; 
+     pPrefNetwListParams.aNetworks[i].encryption =
+       (tEdType)pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].wdiEncryption;
 
-     /*Indicate the channel on which the Network can be found 
+     /*Indicate the channel on which the Network can be found
        0 - if all channels */
-     pPrefNetwListParams.aNetworks[i].ucChannelCount = 
+     pPrefNetwListParams.aNetworks[i].ucChannelCount =
        pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].ucChannelCount;
 
      wpalMemoryCopy(pPrefNetwListParams.aNetworks[i].aChannels,
@@ -21600,73 +21984,73 @@
        pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].rssiThreshold;
 
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-               "WDI SET PNO: SSID %d %s", 
+               "WDI SET PNO: SSID %d %s",
                pPrefNetwListParams.aNetworks[i].ssId.length,
                pPrefNetwListParams.aNetworks[i].ssId.ssId);
    }
 
-   pPrefNetwListParams.scanTimers.ucScanTimersCount = 
-     (pwdiPNOScanReqParams->wdiPNOScanInfo.scanTimers.ucScanTimersCount < 
+   pPrefNetwListParams.scanTimers.ucScanTimersCount =
+     (pwdiPNOScanReqParams->wdiPNOScanInfo.scanTimers.ucScanTimersCount <
       WLAN_HAL_PNO_MAX_SCAN_TIMERS)?
      pwdiPNOScanReqParams->wdiPNOScanInfo.scanTimers.ucScanTimersCount :
       WLAN_HAL_PNO_MAX_SCAN_TIMERS;
 
    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-               "WDI SET PNO: Scan timers count %d 24G P %d 5G Probe %d", 
+               "WDI SET PNO: Scan timers count %d 24G P %d 5G Probe %d",
                pPrefNetwListParams.scanTimers.ucScanTimersCount,
                pwdiPNOScanReqParams->wdiPNOScanInfo.us24GProbeSize,
                pwdiPNOScanReqParams->wdiPNOScanInfo.us5GProbeSize);
 
    for ( i = 0; i < pPrefNetwListParams.scanTimers.ucScanTimersCount; i++   )
    {
-     pPrefNetwListParams.scanTimers.aTimerValues[i].uTimerValue  = 
+     pPrefNetwListParams.scanTimers.aTimerValues[i].uTimerValue  =
        pwdiPNOScanReqParams->wdiPNOScanInfo.scanTimers.aTimerValues[i].uTimerValue;
-     pPrefNetwListParams.scanTimers.aTimerValues[i].uTimerRepeat = 
+     pPrefNetwListParams.scanTimers.aTimerValues[i].uTimerRepeat =
        pwdiPNOScanReqParams->wdiPNOScanInfo.scanTimers.aTimerValues[i].uTimerRepeat;
    }
 
    /*Copy the probe template*/
-   pPrefNetwListParams.us24GProbeSize = 
+   pPrefNetwListParams.us24GProbeSize =
      (pwdiPNOScanReqParams->wdiPNOScanInfo.us24GProbeSize<
      WLAN_HAL_PNO_MAX_PROBE_SIZE)?
      pwdiPNOScanReqParams->wdiPNOScanInfo.us24GProbeSize:
-     WLAN_HAL_PNO_MAX_PROBE_SIZE; 
+     WLAN_HAL_PNO_MAX_PROBE_SIZE;
 
-   wpalMemoryCopy(pPrefNetwListParams.a24GProbeTemplate, 
-                  pwdiPNOScanReqParams->wdiPNOScanInfo.a24GProbeTemplate, 
-                  pPrefNetwListParams.us24GProbeSize); 
+   wpalMemoryCopy(pPrefNetwListParams.a24GProbeTemplate,
+                  pwdiPNOScanReqParams->wdiPNOScanInfo.a24GProbeTemplate,
+                  pPrefNetwListParams.us24GProbeSize);
 
-   pPrefNetwListParams.us5GProbeSize = 
+   pPrefNetwListParams.us5GProbeSize =
      (pwdiPNOScanReqParams->wdiPNOScanInfo.us5GProbeSize <
      WLAN_HAL_PNO_MAX_PROBE_SIZE)?
      pwdiPNOScanReqParams->wdiPNOScanInfo.us5GProbeSize:
-     WLAN_HAL_PNO_MAX_PROBE_SIZE; 
+     WLAN_HAL_PNO_MAX_PROBE_SIZE;
 
-   wpalMemoryCopy(pPrefNetwListParams.a5GProbeTemplate, 
-                  pwdiPNOScanReqParams->wdiPNOScanInfo.a5GProbeTemplate, 
-                  pPrefNetwListParams.us5GProbeSize); 
+   wpalMemoryCopy(pPrefNetwListParams.a5GProbeTemplate,
+                  pwdiPNOScanReqParams->wdiPNOScanInfo.a5GProbeTemplate,
+                  pPrefNetwListParams.us5GProbeSize);
 
    /*Pack the buffer*/
-   wpalMemoryCopy( pSendBuffer+usDataOffset, &pPrefNetwListParams, 
-                   sizeof(pPrefNetwListParams)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset, &pPrefNetwListParams,
+                   sizeof(pPrefNetwListParams));
 
    /*Set the output values*/
    *ppSendBuffer = pSendBuffer;
-   *pSize        = usSendSize; 
+   *pSize        = usSendSize;
 
    return WDI_STATUS_SUCCESS;
 }/*WDI_PackPreferredNetworkList*/
 
 /**
- @brief Helper function to pack Set Preferred Network List 
+ @brief Helper function to pack Set Preferred Network List
         Request parameters
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
          pwdiPNOScanReqParams:      pointer to the info received
          from upper layers
          ppSendBuffer, pSize - out pointers of the packed buffer
-         and its size 
-  
+         and its size
+
  @return Result of the function call
 */
 
@@ -21679,7 +22063,7 @@
   wpt_uint16*                pSize
 )
 {
-   wpt_uint8*                 pSendBuffer           = NULL; 
+   wpt_uint8*                 pSendBuffer           = NULL;
    wpt_uint16                 usDataOffset          = 0;
    wpt_uint16                 usSendSize            = 0;
    tPrefNetwListParamsNew     pPrefNetwListParams;
@@ -21689,7 +22073,7 @@
    /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_PREF_NETWORK_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_PREF_NETWORK_REQ,
                          sizeof(pPrefNetwListParams),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(pPrefNetwListParams) )))
@@ -21698,25 +22082,25 @@
                   "Unable to get send buffer in Set PNO req %x  ",
                    pwdiPNOScanReqParams);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-------------------------------------------------------------------------
      Fill prefNetwListParams from pwdiPNOScanReqParams->wdiPNOScanInfo
    -------------------------------------------------------------------------*/
-   pPrefNetwListParams.enable  = 
+   pPrefNetwListParams.enable  =
      pwdiPNOScanReqParams->wdiPNOScanInfo.bEnable;
-   pPrefNetwListParams.modePNO = 
+   pPrefNetwListParams.modePNO =
      pwdiPNOScanReqParams->wdiPNOScanInfo.wdiModePNO;
 
-   pPrefNetwListParams.ucNetworksCount = 
-     (pwdiPNOScanReqParams->wdiPNOScanInfo.ucNetworksCount < 
+   pPrefNetwListParams.ucNetworksCount =
+     (pwdiPNOScanReqParams->wdiPNOScanInfo.ucNetworksCount <
       WLAN_HAL_PNO_MAX_SUPP_NETWORKS)?
-     pwdiPNOScanReqParams->wdiPNOScanInfo.ucNetworksCount : 
+     pwdiPNOScanReqParams->wdiPNOScanInfo.ucNetworksCount :
       WLAN_HAL_PNO_MAX_SUPP_NETWORKS;
 
    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
-               "WDI SET PNO: Enable %d, Mode %d, Netw Count %d", 
+               "WDI SET PNO: Enable %d, Mode %d, Netw Count %d",
                pwdiPNOScanReqParams->wdiPNOScanInfo.bEnable,
                pwdiPNOScanReqParams->wdiPNOScanInfo.wdiModePNO,
                pwdiPNOScanReqParams->wdiPNOScanInfo.ucNetworksCount);
@@ -21732,20 +22116,20 @@
           pPrefNetwListParams.aNetworks[i].ssId.length);
 
      /*Authentication type for the network*/
-     pPrefNetwListParams.aNetworks[i].authentication = 
-       (tAuthType)pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].wdiAuth; 
+     pPrefNetwListParams.aNetworks[i].authentication =
+       (tAuthType)pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].wdiAuth;
 
      /*Encryption type for the network*/
-     pPrefNetwListParams.aNetworks[i].encryption = 
-       (tEdType)pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].wdiEncryption; 
+     pPrefNetwListParams.aNetworks[i].encryption =
+       (tEdType)pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].wdiEncryption;
 
      /*SSID bcast type for the network*/
-     pPrefNetwListParams.aNetworks[i].bcastNetworkType = 
-       (tSSIDBcastType)pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].wdiBcastNetworkType; 
+     pPrefNetwListParams.aNetworks[i].bcastNetworkType =
+       (tSSIDBcastType)pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].wdiBcastNetworkType;
 
-     /*Indicate the channel on which the Network can be found 
+     /*Indicate the channel on which the Network can be found
        0 - if all channels */
-     pPrefNetwListParams.aNetworks[i].ucChannelCount = 
+     pPrefNetwListParams.aNetworks[i].ucChannelCount =
        pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].ucChannelCount;
 
      wpalMemoryCopy(pPrefNetwListParams.aNetworks[i].aChannels,
@@ -21757,86 +22141,86 @@
        pwdiPNOScanReqParams->wdiPNOScanInfo.aNetworks[i].rssiThreshold;
 
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
-               "WDI SET PNO: SSID %d %s", 
+               "WDI SET PNO: SSID %d %s",
                pPrefNetwListParams.aNetworks[i].ssId.length,
                pPrefNetwListParams.aNetworks[i].ssId.ssId);
    }
 
-   pPrefNetwListParams.scanTimers.ucScanTimersCount = 
-     (pwdiPNOScanReqParams->wdiPNOScanInfo.scanTimers.ucScanTimersCount < 
+   pPrefNetwListParams.scanTimers.ucScanTimersCount =
+     (pwdiPNOScanReqParams->wdiPNOScanInfo.scanTimers.ucScanTimersCount <
       WLAN_HAL_PNO_MAX_SCAN_TIMERS)?
      pwdiPNOScanReqParams->wdiPNOScanInfo.scanTimers.ucScanTimersCount :
       WLAN_HAL_PNO_MAX_SCAN_TIMERS;
 
    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
-               "WDI SET PNO: Scan timers count %d 24G P %d 5G Probe %d", 
+               "WDI SET PNO: Scan timers count %d 24G P %d 5G Probe %d",
                pPrefNetwListParams.scanTimers.ucScanTimersCount,
                pwdiPNOScanReqParams->wdiPNOScanInfo.us24GProbeSize,
                pwdiPNOScanReqParams->wdiPNOScanInfo.us5GProbeSize);
 
    for ( i = 0; i < pPrefNetwListParams.scanTimers.ucScanTimersCount; i++   )
    {
-     pPrefNetwListParams.scanTimers.aTimerValues[i].uTimerValue  = 
+     pPrefNetwListParams.scanTimers.aTimerValues[i].uTimerValue  =
        pwdiPNOScanReqParams->wdiPNOScanInfo.scanTimers.aTimerValues[i].uTimerValue;
-     pPrefNetwListParams.scanTimers.aTimerValues[i].uTimerRepeat = 
+     pPrefNetwListParams.scanTimers.aTimerValues[i].uTimerRepeat =
        pwdiPNOScanReqParams->wdiPNOScanInfo.scanTimers.aTimerValues[i].uTimerRepeat;
    }
 
    /*Copy the probe template*/
-   pPrefNetwListParams.us24GProbeSize = 
+   pPrefNetwListParams.us24GProbeSize =
      (pwdiPNOScanReqParams->wdiPNOScanInfo.us24GProbeSize<
      WLAN_HAL_PNO_MAX_PROBE_SIZE)?
      pwdiPNOScanReqParams->wdiPNOScanInfo.us24GProbeSize:
-     WLAN_HAL_PNO_MAX_PROBE_SIZE; 
+     WLAN_HAL_PNO_MAX_PROBE_SIZE;
 
-   wpalMemoryCopy(pPrefNetwListParams.a24GProbeTemplate, 
-                  pwdiPNOScanReqParams->wdiPNOScanInfo.a24GProbeTemplate, 
-                  pPrefNetwListParams.us24GProbeSize); 
+   wpalMemoryCopy(pPrefNetwListParams.a24GProbeTemplate,
+                  pwdiPNOScanReqParams->wdiPNOScanInfo.a24GProbeTemplate,
+                  pPrefNetwListParams.us24GProbeSize);
 
-   pPrefNetwListParams.us5GProbeSize = 
+   pPrefNetwListParams.us5GProbeSize =
      (pwdiPNOScanReqParams->wdiPNOScanInfo.us5GProbeSize <
      WLAN_HAL_PNO_MAX_PROBE_SIZE)?
      pwdiPNOScanReqParams->wdiPNOScanInfo.us5GProbeSize:
-     WLAN_HAL_PNO_MAX_PROBE_SIZE; 
+     WLAN_HAL_PNO_MAX_PROBE_SIZE;
 
-   wpalMemoryCopy(pPrefNetwListParams.a5GProbeTemplate, 
-                  pwdiPNOScanReqParams->wdiPNOScanInfo.a5GProbeTemplate, 
-                  pPrefNetwListParams.us5GProbeSize); 
+   wpalMemoryCopy(pPrefNetwListParams.a5GProbeTemplate,
+                  pwdiPNOScanReqParams->wdiPNOScanInfo.a5GProbeTemplate,
+                  pPrefNetwListParams.us5GProbeSize);
 
    /*Pack the buffer*/
-   wpalMemoryCopy( pSendBuffer+usDataOffset, &pPrefNetwListParams, 
-                   sizeof(pPrefNetwListParams)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset, &pPrefNetwListParams,
+                   sizeof(pPrefNetwListParams));
 
    /*Set the output values*/
    *ppSendBuffer = pSendBuffer;
-   *pSize        = usSendSize; 
+   *pSize        = usSendSize;
 
    return WDI_STATUS_SUCCESS;
 }/*WDI_PackPreferredNetworkListNew*/
 
 /**
  @brief Process Set Preferred Network List Request function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
+         pEventData:      pointer to the event information structure
+
  @return Result of the function call
 */
 WDI_Status
 WDI_ProcessSetPreferredNetworkReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_PNOScanReqParamsType*  pwdiPNOScanReqParams  = NULL;
    WDI_PNOScanCb              wdiPNOScanCb          = NULL;
-   wpt_uint8*                 pSendBuffer           = NULL; 
+   wpt_uint8*                 pSendBuffer           = NULL;
    wpt_uint16                 usSendSize            = 0;
-   WDI_Status                 wdiStatus; 
+   WDI_Status                 wdiStatus;
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiPNOScanReqParams = (WDI_PNOScanReqParamsType*)pEventData->pEventData)) ||
@@ -21845,7 +22229,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-------------------------------------------------------------------------
@@ -21854,7 +22238,7 @@
    if ( pWDICtx->wdiPNOVersion > 0 )
    {
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
-                  "%s: PNO new version %d ", __FUNCTION__, 
+                  "%s: PNO new version %d ", __FUNCTION__,
                   pWDICtx->wdiPNOVersion);
 
      wdiStatus = WDI_PackPreferredNetworkListNew( pWDICtx, pwdiPNOScanReqParams,
@@ -21863,7 +22247,7 @@
    else
    {
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
-                  "%s: PNO old version %d ", __FUNCTION__, 
+                  "%s: PNO old version %d ", __FUNCTION__,
                   pWDICtx->wdiPNOVersion);
 
      wdiStatus = WDI_PackPreferredNetworkList( pWDICtx, pwdiPNOScanReqParams,
@@ -21876,44 +22260,44 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: failed to pack request parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return wdiStatus; 
+      return wdiStatus;
    }
 
    pWDICtx->wdiReqStatusCB     = pwdiPNOScanReqParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiPNOScanReqParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiPNOScanReqParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-               wdiPNOScanCb, pEventData->pUserData, WDI_SET_PREF_NETWORK_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+               wdiPNOScanCb, pEventData->pUserData, WDI_SET_PREF_NETWORK_RESP);
 }
 
 /**
  @brief Process Set RSSI Filter Request function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessSetRssiFilterReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_SetRssiFilterReqParamsType* pwdiRssiFilterReqParams = NULL;
    WDI_RssiFilterCb                wdiRssiFilterCb         = NULL;
-   wpt_uint8*                      pSendBuffer             = NULL; 
+   wpt_uint8*                      pSendBuffer             = NULL;
    wpt_uint16                      usDataOffset            = 0;
    wpt_uint16                      usSendSize              = 0;
    wpt_uint8                       ucRssiThreshold;
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiRssiFilterReqParams = (WDI_SetRssiFilterReqParamsType*)pEventData->pEventData)) ||
@@ -21922,13 +22306,13 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_PREF_NETWORK_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_PREF_NETWORK_REQ,
                          sizeof(ucRssiThreshold),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(ucRssiThreshold) )))
@@ -21937,52 +22321,52 @@
                   "Unable to get send buffer in Set PNO req %x %x %x",
                   pEventData, pwdiRssiFilterReqParams, wdiRssiFilterCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    ucRssiThreshold = pwdiRssiFilterReqParams->rssiThreshold;
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &ucRssiThreshold, 
-                   sizeof(ucRssiThreshold)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &ucRssiThreshold,
+                   sizeof(ucRssiThreshold));
 
    pWDICtx->wdiReqStatusCB     = pwdiRssiFilterReqParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiRssiFilterReqParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiRssiFilterReqParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiRssiFilterCb, pEventData->pUserData, WDI_SET_RSSI_FILTER_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiRssiFilterCb, pEventData->pUserData, WDI_SET_RSSI_FILTER_RESP);
 }
 
 
 /**
  @brief Process Update Scan Params function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessUpdateScanParamsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_UpdateScanParamsInfoType* pwdiUpdateScanParams  = NULL;
    WDI_UpdateScanParamsCb        wdiUpdateScanParamsCb = NULL;
-   wpt_uint8*                    pSendBuffer           = NULL; 
+   wpt_uint8*                    pSendBuffer           = NULL;
    wpt_uint16                    usDataOffset          = 0;
    wpt_uint16                    usSendSize            = 0;
    tUpdateScanParams             updateScanParams = {0};
 
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiUpdateScanParams = (WDI_UpdateScanParamsInfoType*)pEventData->pEventData)) ||
@@ -21991,7 +22375,7 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_INFO,
@@ -21999,7 +22383,7 @@
    /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPDATE_SCAN_PARAMS_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_UPDATE_SCAN_PARAMS_REQ,
                          sizeof(updateScanParams),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(updateScanParams) )))
@@ -22008,7 +22392,7 @@
                   "Unable to get send buffer in Update Scan Params req %x %x %x",
                   pEventData, pwdiUpdateScanParams, wdiUpdateScanParamsCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    //
@@ -22017,13 +22401,13 @@
 
    updateScanParams.b11dEnabled    = pwdiUpdateScanParams->wdiUpdateScanParamsInfo.b11dEnabled;
    updateScanParams.b11dResolved   = pwdiUpdateScanParams->wdiUpdateScanParamsInfo.b11dResolved;
-   updateScanParams.ucChannelCount = 
+   updateScanParams.ucChannelCount =
      (pwdiUpdateScanParams->wdiUpdateScanParamsInfo.ucChannelCount <
      WLAN_HAL_PNO_MAX_NETW_CHANNELS)?
      pwdiUpdateScanParams->wdiUpdateScanParamsInfo.ucChannelCount :
      WLAN_HAL_PNO_MAX_NETW_CHANNELS;
 
-   wpalMemoryCopy( updateScanParams.aChannels, 
+   wpalMemoryCopy( updateScanParams.aChannels,
                    pwdiUpdateScanParams->wdiUpdateScanParamsInfo.aChannels,
                    updateScanParams.ucChannelCount);
 
@@ -22033,34 +22417,34 @@
    updateScanParams.usPassiveMaxChTime = pwdiUpdateScanParams->wdiUpdateScanParamsInfo.usPassiveMaxChTime;
    updateScanParams.cbState            = pwdiUpdateScanParams->wdiUpdateScanParamsInfo.cbState;
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &updateScanParams, 
-                   sizeof(updateScanParams)); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &updateScanParams,
+                   sizeof(updateScanParams));
 
    pWDICtx->wdiReqStatusCB     = pwdiUpdateScanParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiUpdateScanParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiUpdateScanParams->pUserData;
 
    WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_INFO,
                "End Update Scan Parameters");
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiUpdateScanParamsCb, pEventData->pUserData, WDI_UPDATE_SCAN_PARAMS_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiUpdateScanParamsCb, pEventData->pUserData, WDI_UPDATE_SCAN_PARAMS_RESP);
 }
 
 /**
  @brief Process Preferred Network Found Indication function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessPrefNetworkFoundInd
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -22070,7 +22454,7 @@
 
 
   /*-------------------------------------------------------------------------
-    Sanity check 
+    Sanity check
   -------------------------------------------------------------------------*/
   if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
       ( NULL == pEventData->pEventData ))
@@ -22078,27 +22462,27 @@
      WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                  "%s: Invalid parameters", __FUNCTION__);
      WDI_ASSERT( 0 );
-     return WDI_STATUS_E_FAILURE; 
+     return WDI_STATUS_E_FAILURE;
   }
 
   /*-------------------------------------------------------------------------
     Extract indication and send it to UMAC
   -------------------------------------------------------------------------*/
-  wpalMemoryCopy( (void *)&prefNetwFoundInd.prefNetwFoundParams, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( (void *)&prefNetwFoundInd.prefNetwFoundParams,
+                  pEventData->pEventData,
                   sizeof(tPrefNetwFoundParams));
 
   /*Fill in the indication parameters*/
-  wdiInd.wdiIndicationType = WDI_PREF_NETWORK_FOUND_IND; 
+  wdiInd.wdiIndicationType = WDI_PREF_NETWORK_FOUND_IND;
 
   wpalMemoryZero(wdiInd.wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID,32);
 
-  wdiInd.wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength = 
+  wdiInd.wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength =
      (prefNetwFoundInd.prefNetwFoundParams.ssId.length < 31 )?
-      prefNetwFoundInd.prefNetwFoundParams.ssId.length : 31; 
+      prefNetwFoundInd.prefNetwFoundParams.ssId.length : 31;
 
-  wpalMemoryCopy( wdiInd.wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID, 
-                  prefNetwFoundInd.prefNetwFoundParams.ssId.ssId, 
+  wpalMemoryCopy( wdiInd.wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID,
+                  prefNetwFoundInd.prefNetwFoundParams.ssId.ssId,
                   wdiInd.wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength);
 
   wdiInd.wdiIndicationData.wdiPrefNetworkFoundInd.rssi =
@@ -22113,23 +22497,23 @@
 
   /*Notify UMAC*/
   pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
-  
-  return WDI_STATUS_SUCCESS; 
+
+  return WDI_STATUS_SUCCESS;
 }
 
 /**
  @brief Process PNO 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 
-  
+
+ @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_ProcessSetPreferredNetworkRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -22140,7 +22524,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData ))
@@ -22148,37 +22532,37 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
 
-   wdiPNOScanCb = (WDI_PNOScanCb)pWDICtx->pfncRspCB; 
+   wdiPNOScanCb = (WDI_PNOScanCb)pWDICtx->pfncRspCB;
 
    /*-------------------------------------------------------------------------
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiPNOScanCb(wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetPreferredNetworkRsp*/
 
 /**
  @brief Process RSSI Filter 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 
-  
+
+ @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_ProcessSetRssiFilterRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -22189,7 +22573,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData ))
@@ -22197,48 +22581,48 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wdiRssiFilterCb = (WDI_RssiFilterCb)pWDICtx->pfncRspCB; 
+   wdiRssiFilterCb = (WDI_RssiFilterCb)pWDICtx->pfncRspCB;
 
    /*-------------------------------------------------------------------------
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiRssiFilterCb(wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetRssiFilterRsp*/
 
 /**
  @brief Process Update Scan Params 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 
-  
+
+ @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_ProcessUpdateScanParamsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_Status             wdiStatus;
-   tUpdateScanParamsResp  halUpdScanParams; 
+   tUpdateScanParamsResp  halUpdScanParams;
    WDI_UpdateScanParamsCb wdiUpdateScanParamsCb   = NULL;
-   wpt_uint32             uStatus; 
+   wpt_uint32             uStatus;
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData ))
@@ -22246,44 +22630,44 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
                   "Process UPD scan params ptr : %x", __FUNCTION__);
 
-  wdiUpdateScanParamsCb = (WDI_UpdateScanParamsCb)pWDICtx->pfncRspCB; 
+  wdiUpdateScanParamsCb = (WDI_UpdateScanParamsCb)pWDICtx->pfncRspCB;
 
   /*-------------------------------------------------------------------------
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
-  wpalMemoryCopy( (void *)&halUpdScanParams.status, 
-                  pEventData->pEventData, 
+  wpalMemoryCopy( (void *)&halUpdScanParams.status,
+                  pEventData->pEventData,
                   sizeof(halUpdScanParams.status));
 
   uStatus  = halUpdScanParams.status;
 
   /*Extract PNO version - 1st bit of the status */
-  pWDICtx->wdiPNOVersion = (uStatus & WDI_PNO_VERSION_MASK)? 1:0; 
+  pWDICtx->wdiPNOVersion = (uStatus & WDI_PNO_VERSION_MASK)? 1:0;
 
   /*Remove version bit*/
-  uStatus = uStatus & ( ~(WDI_PNO_VERSION_MASK)); 
+  uStatus = uStatus & ( ~(WDI_PNO_VERSION_MASK));
 
-  wdiStatus   =   WDI_HAL_2_WDI_STATUS(uStatus); 
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(uStatus);
 
   WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_INFO,
-              "UPD Scan Parameters rsp with status: %d", 
+              "UPD Scan Parameters rsp with status: %d",
               halUpdScanParams.status);
 
   /*Notify UMAC*/
   wdiUpdateScanParamsCb(wdiStatus, pWDICtx->pRspCBUserData);
 
-  return WDI_STATUS_SUCCESS; 
+  return WDI_STATUS_SUCCESS;
 }
 #endif // FEATURE_WLAN_SCAN_PNO
 
 #ifdef WLAN_FEATURE_PACKET_FILTERING
-WDI_Status 
+WDI_Status
 WDI_8023MulticastListReq
 (
   WDI_RcvFltPktSetMcListReqParamsType*  pwdiRcvFltPktSetMcListReqInfo,
@@ -22298,29 +22682,29 @@
              "%s", __FUNCTION__);
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_8023_MULTICAST_LIST_REQ;
-   wdiEventData.pEventData      = pwdiRcvFltPktSetMcListReqInfo; 
+   wdiEventData.pEventData      = pwdiRcvFltPktSetMcListReqInfo;
    wdiEventData.uEventDataSize  = sizeof(*pwdiRcvFltPktSetMcListReqInfo);
-   wdiEventData.pCBfnc          = wdi8023MulticastListCallback; 
+   wdiEventData.pCBfnc          = wdi8023MulticastListCallback;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }
 
-WDI_Status 
+WDI_Status
 WDI_ReceiveFilterSetFilterReq
 (
   WDI_SetRcvPktFilterReqParamsType* pwdiSetRcvPktFilterReqInfo,
@@ -22335,32 +22719,32 @@
              "%s",__FUNCTION__);
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_RECEIVE_FILTER_SET_FILTER_REQ;
-   wdiEventData.pEventData      = pwdiSetRcvPktFilterReqInfo; 
-   wdiEventData.uEventDataSize  = sizeof(*pwdiSetRcvPktFilterReqInfo) + 
-                                  (pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.numFieldParams 
+   wdiEventData.pEventData      = pwdiSetRcvPktFilterReqInfo;
+   wdiEventData.uEventDataSize  = sizeof(*pwdiSetRcvPktFilterReqInfo) +
+                                  (pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.numFieldParams
                                   * sizeof(WDI_RcvPktFilterFieldParams) - 1);
-   wdiEventData.pCBfnc          = wdiReceiveFilterSetFilterCallback; 
+   wdiEventData.pCBfnc          = wdiReceiveFilterSetFilterCallback;
    wdiEventData.pUserData       = pUserData;
 
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }
 
-WDI_Status 
+WDI_Status
 WDI_FilterMatchCountReq
 (
   WDI_RcvFltPktMatchCntReqParamsType* pwdiRcvFltPktMatchCntReqInfo,
@@ -22375,30 +22759,30 @@
              "%s",__FUNCTION__);
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ;
-   wdiEventData.pEventData      = pwdiRcvFltPktMatchCntReqInfo; 
+   wdiEventData.pEventData      = pwdiRcvFltPktMatchCntReqInfo;
    wdiEventData.uEventDataSize  = sizeof(*pwdiRcvFltPktMatchCntReqInfo);
-   wdiEventData.pCBfnc          = wdiFilterMatchCountCallback; 
+   wdiEventData.pCBfnc          = wdiFilterMatchCountCallback;
    wdiEventData.pUserData       = pUserData;
 
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
 }
 
-WDI_Status 
+WDI_Status
 WDI_ReceiveFilterClearFilterReq
 (
   WDI_RcvFltPktClearReqParamsType*  pwdiRcvFltPktClearReqInfo,
@@ -22413,23 +22797,23 @@
              "%s",__FUNCTION__);
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_RECEIVE_FILTER_CLEAR_FILTER_REQ;
-   wdiEventData.pEventData      = pwdiRcvFltPktClearReqInfo; 
+   wdiEventData.pEventData      = pwdiRcvFltPktClearReqInfo;
    wdiEventData.uEventDataSize  = sizeof(*pwdiRcvFltPktClearReqInfo);
-   wdiEventData.pCBfnc          = wdiReceiveFilterClearFilterCallback; 
+   wdiEventData.pCBfnc          = wdiReceiveFilterClearFilterCallback;
    wdiEventData.pUserData       = pUserData;
 
 
@@ -22438,51 +22822,63 @@
 
 /**
  @brief Process 8023 Multicast List Request function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_Process8023MulticastListReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_RcvFltPktSetMcListReqParamsType* pwdiFltPktSetMcListReqParamsType  = NULL;
    WDI_8023MulticastListCb    wdi8023MulticastListCb = NULL;
-   wpt_uint8*                 pSendBuffer           = NULL; 
+   wpt_uint8*                 pSendBuffer           = NULL;
    wpt_uint16                 usDataOffset          = 0;
    wpt_uint16                 usSendSize            = 0;
    tHalRcvFltMcAddrListType   rcvFltMcAddrListType;
    wpt_uint8                  i;
+   wpt_uint8                  ucCurrentBSSSesIdx = 0;
+   WDI_BSSSessionType*        pBSSSes = NULL;
 
    WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
              "%s",__FUNCTION__);
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
-       ( NULL == (pwdiFltPktSetMcListReqParamsType = 
+       ( NULL == (pwdiFltPktSetMcListReqParamsType =
        (WDI_RcvFltPktSetMcListReqParamsType*)pEventData->pEventData)) ||
-       ( NULL == (wdi8023MulticastListCb = 
+       ( NULL == (wdi8023MulticastListCb =
        (WDI_8023MulticastListCb)pEventData->pCBfnc)))
    {
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
+   }
+
+   ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
+                            pwdiFltPktSetMcListReqParamsType->mcAddrList.bssId, 
+                            &pBSSSes);  
+   if ( NULL == pBSSSes )
+   {
+       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                 " %s : Association for this BSSID does not exist",__FUNCTION__);
+       return WDI_STATUS_E_FAILURE; 
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, 
-                         WDI_8023_MULTICAST_LIST_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+                         WDI_8023_MULTICAST_LIST_REQ,
                          sizeof(tHalRcvFltMcAddrListType),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(tHalRcvFltMcAddrListType))))
@@ -22493,11 +22889,11 @@
                   pEventData, pwdiFltPktSetMcListReqParamsType,
                   wdi8023MulticastListCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   rcvFltMcAddrListType.cMulticastAddr = 
-       pwdiFltPktSetMcListReqParamsType->mcAddrList.ulMulticastAddrCnt; 
+   rcvFltMcAddrListType.cMulticastAddr =
+       pwdiFltPktSetMcListReqParamsType->mcAddrList.ulMulticastAddrCnt;
    for( i = 0; i < rcvFltMcAddrListType.cMulticastAddr; i++ )
    {
       wpalMemoryCopy(rcvFltMcAddrListType.multicastAddr[i],
@@ -22505,63 +22901,76 @@
                  sizeof(tSirMacAddr));
    }
 
+   rcvFltMcAddrListType.bssIdx = pBSSSes->ucBSSIdx;
    wpalMemoryCopy( pSendBuffer+usDataOffset, 
                    &rcvFltMcAddrListType, 
                    sizeof(rcvFltMcAddrListType)); 
 
    pWDICtx->wdiReqStatusCB     = pwdiFltPktSetMcListReqParamsType->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiFltPktSetMcListReqParamsType->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiFltPktSetMcListReqParamsType->pUserData;
 
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                         wdi8023MulticastListCb, pEventData->pUserData,
-                        WDI_8023_MULTICAST_LIST_RESP); 
+                        WDI_8023_MULTICAST_LIST_RESP);
 }
 
 /**
  @brief Process Receive Filter Set Filter Request function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessReceiveFilterSetFilterReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_SetRcvPktFilterReqParamsType* pwdiSetRcvPktFilterReqInfo  = NULL;
    WDI_ReceiveFilterSetFilterCb      wdiReceiveFilterSetFilterCb = NULL;
-   wpt_uint8*                 pSendBuffer           = NULL; 
+   wpt_uint8*                 pSendBuffer           = NULL;
    wpt_uint16                 usDataOffset          = 0;
    wpt_uint16                 usSendSize            = 0;
    wpt_uint32                 usRcvPktFilterCfgSize;
    tHalRcvPktFilterCfgType    *pRcvPktFilterCfg;
    wpt_uint8                  i;
+   wpt_uint8                  ucCurrentBSSSesIdx = 0;
+   WDI_BSSSessionType*        pBSSSes = NULL;
 
    WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
              "%s",__FUNCTION__);
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
-       ( NULL == (pwdiSetRcvPktFilterReqInfo = 
+       ( NULL == (pwdiSetRcvPktFilterReqInfo =
        (WDI_SetRcvPktFilterReqParamsType*)pEventData->pEventData)) ||
-       ( NULL == (wdiReceiveFilterSetFilterCb = 
+       ( NULL == (wdiReceiveFilterSetFilterCb =
        (WDI_ReceiveFilterSetFilterCb)pEventData->pCBfnc)))
    {
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
+   }
+
+   ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
+                            pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.bssId, 
+                            &pBSSSes);  
+   if ( NULL == pBSSSes )
+   {
+       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                 " %s : Association for this BSSID does not exist",__FUNCTION__);
+       return WDI_STATUS_E_FAILURE; 
    }
 
    usRcvPktFilterCfgSize = sizeof(tHalRcvPktFilterCfgType) + 
@@ -22578,15 +22987,16 @@
             "tHalRcvPktFilterCfgType: %x %x %x ",
             __FUNCTION__, pWDICtx, pEventData, pEventData->pEventData);
     WDI_ASSERT(0);
-    return WDI_STATUS_E_FAILURE; 
+    return WDI_STATUS_E_FAILURE;
   }
 
   wpalMemoryZero(pRcvPktFilterCfg, usRcvPktFilterCfgSize);
 
    /*-----------------------------------------------------------------------
      Get message buffer
+
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_RECEIVE_FILTER_SET_FILTER_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_RECEIVE_FILTER_SET_FILTER_REQ,
                          usRcvPktFilterCfgSize,
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + usRcvPktFilterCfgSize)))
@@ -22598,35 +23008,36 @@
                   wdiReceiveFilterSetFilterCb);
       WDI_ASSERT(0);
       wpalMemoryFree(pRcvPktFilterCfg);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
-              "UsData Off %d UsSend %d cfg %d",usDataOffset, 
+              "UsData Off %d UsSend %d cfg %d",usDataOffset,
               usSendSize,usRcvPktFilterCfgSize);
 
    pRcvPktFilterCfg->filterId = pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.filterId;
-   pRcvPktFilterCfg->filterType = pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.filterType;   
+   pRcvPktFilterCfg->filterType = pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.filterType;
    pRcvPktFilterCfg->numParams = pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.numFieldParams;
-   pRcvPktFilterCfg->coleasceTime = pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.coalesceTime;
+   pRcvPktFilterCfg->coalesceTime = pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.coalesceTime;
 
+   //pRcvPktFilterCfg->bssIdx = pBSSSes->ucBSSIdx;
 
    WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
-              "Out: FID %d FT %d",pRcvPktFilterCfg->filterId, 
+              "Out: FID %d FT %d",pRcvPktFilterCfg->filterId,
               pRcvPktFilterCfg->filterType);
    WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
               "NParams %d CT %d",pRcvPktFilterCfg->numParams, 
-              pRcvPktFilterCfg->coleasceTime);
+              pRcvPktFilterCfg->coalesceTime);
 
    for ( i = 0; i < pRcvPktFilterCfg->numParams; i++ )
    {
-       pRcvPktFilterCfg->paramsData[i].protocolLayer = 
+       pRcvPktFilterCfg->paramsData[i].protocolLayer =
            pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.paramsData[i].protocolLayer;
-       pRcvPktFilterCfg->paramsData[i].cmpFlag = 
+       pRcvPktFilterCfg->paramsData[i].cmpFlag =
            pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.paramsData[i].cmpFlag;
-       pRcvPktFilterCfg->paramsData[i].dataOffset = 
+       pRcvPktFilterCfg->paramsData[i].dataOffset =
            pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.paramsData[i].dataOffset;
-        pRcvPktFilterCfg->paramsData[i].dataLength = 
+        pRcvPktFilterCfg->paramsData[i].dataLength =
             pwdiSetRcvPktFilterReqInfo->wdiPktFilterCfg.paramsData[i].dataLength;
 
        wpalMemoryCopy(&pRcvPktFilterCfg->paramsData[i].compareData,
@@ -22638,65 +23049,65 @@
 
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
            "Out:Proto %d Comp Flag %d \n",
-           pRcvPktFilterCfg->paramsData[i].protocolLayer, 
+           pRcvPktFilterCfg->paramsData[i].protocolLayer,
            pRcvPktFilterCfg->paramsData[i].cmpFlag);
 
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
            "Data Offset %d Data Len %d\n",
-           pRcvPktFilterCfg->paramsData[i].dataOffset, 
+           pRcvPktFilterCfg->paramsData[i].dataOffset,
            pRcvPktFilterCfg->paramsData[i].dataLength);
 
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
            "CData: %d:%d:%d:%d:%d:%d\n",
-           pRcvPktFilterCfg->paramsData[i].compareData[0], 
-           pRcvPktFilterCfg->paramsData[i].compareData[1], 
-           pRcvPktFilterCfg->paramsData[i].compareData[2], 
+           pRcvPktFilterCfg->paramsData[i].compareData[0],
+           pRcvPktFilterCfg->paramsData[i].compareData[1],
+           pRcvPktFilterCfg->paramsData[i].compareData[2],
            pRcvPktFilterCfg->paramsData[i].compareData[3],
-           pRcvPktFilterCfg->paramsData[i].compareData[4], 
+           pRcvPktFilterCfg->paramsData[i].compareData[4],
            pRcvPktFilterCfg->paramsData[i].compareData[5]);
 
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
            "MData: %d:%d:%d:%d:%d:%d\n",
-           pRcvPktFilterCfg->paramsData[i].dataMask[0], 
-           pRcvPktFilterCfg->paramsData[i].dataMask[1], 
-           pRcvPktFilterCfg->paramsData[i].dataMask[2], 
+           pRcvPktFilterCfg->paramsData[i].dataMask[0],
+           pRcvPktFilterCfg->paramsData[i].dataMask[1],
+           pRcvPktFilterCfg->paramsData[i].dataMask[2],
            pRcvPktFilterCfg->paramsData[i].dataMask[3],
-           pRcvPktFilterCfg->paramsData[i].dataMask[4], 
+           pRcvPktFilterCfg->paramsData[i].dataMask[4],
            pRcvPktFilterCfg->paramsData[i].dataMask[5]);
    }
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   pRcvPktFilterCfg, 
-                   usRcvPktFilterCfgSize); 
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   pRcvPktFilterCfg,
+                   usRcvPktFilterCfgSize);
 
 
    pWDICtx->wdiReqStatusCB     = pwdiSetRcvPktFilterReqInfo->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiSetRcvPktFilterReqInfo->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiSetRcvPktFilterReqInfo->pUserData;
 
    WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
              "%s",__FUNCTION__);
    wpalMemoryFree(pRcvPktFilterCfg);
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                         wdiReceiveFilterSetFilterCb, pEventData->pUserData,
-                        WDI_RECEIVE_FILTER_SET_FILTER_RESP); 
+                        WDI_RECEIVE_FILTER_SET_FILTER_RESP);
 }
 
 /**
  @brief Process Packet Filter Match Count Request function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessFilterMatchCountReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -22705,7 +23116,7 @@
                                                                          NULL;
    WDI_FilterMatchCountCb                 wdiFilterMatchCountCb              =
                                                                          NULL;
-   wpt_uint8*                             pSendBuffer           = NULL; 
+   wpt_uint8*                             pSendBuffer           = NULL;
    wpt_uint16                             usDataOffset          = 0;
    wpt_uint16                             usSendSize            = 0;
 
@@ -22713,25 +23124,25 @@
              "%s",__FUNCTION__);
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
-       ( NULL == (pwdiRcvFltPktMatchCntReqParamsType = 
+       ( NULL == (pwdiRcvFltPktMatchCntReqParamsType =
        (WDI_RcvFltPktMatchCntReqParamsType*)pEventData->pEventData)) ||
-       ( NULL == (wdiFilterMatchCountCb = 
+       ( NULL == (wdiFilterMatchCountCb =
        (WDI_FilterMatchCountCb)pEventData->pCBfnc)))
    {
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, 
-                         WDI_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+                         WDI_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ,
                          0,
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < usDataOffset))
@@ -22742,71 +23153,83 @@
                   pEventData, pwdiRcvFltPktMatchCntReqParamsType,
                   wdiFilterMatchCountCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    //
    // Don't need to fill send buffer other than header
    //
    pWDICtx->wdiReqStatusCB     = pwdiRcvFltPktMatchCntReqParamsType->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiRcvFltPktMatchCntReqParamsType->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiRcvFltPktMatchCntReqParamsType->pUserData;
 
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiFilterMatchCountCb, 
-                        pEventData->pUserData, 
-                        WDI_PACKET_COALESCING_FILTER_MATCH_COUNT_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiFilterMatchCountCb,
+                        pEventData->pUserData,
+                        WDI_PACKET_COALESCING_FILTER_MATCH_COUNT_RESP);
 }
 
 /**
  @brief Process Receive Filter Clear Filter Request function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessReceiveFilterClearFilterReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
-{ 
+{
    WDI_RcvFltPktClearReqParamsType* pwdiRcvFltPktClearReqParamsType = NULL;
    WDI_ReceiveFilterClearFilterCb   wdiRcvFltPktClearFilterCb       = NULL;
-   wpt_uint8*                       pSendBuffer           = NULL; 
+   wpt_uint8*                       pSendBuffer           = NULL;
    wpt_uint16                       usDataOffset          = 0;
    wpt_uint16                       usSendSize            = 0;
    tHalRcvFltPktClearParam          rcvFltPktClearParam;
+   wpt_uint8                        ucCurrentBSSSesIdx = 0;
+   WDI_BSSSessionType*              pBSSSes = NULL;
 
    WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
              "%s",__FUNCTION__);
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiRcvFltPktClearReqParamsType =
        (WDI_RcvFltPktClearReqParamsType*)pEventData->pEventData)) ||
-       ( NULL == (wdiRcvFltPktClearFilterCb = 
+       ( NULL == (wdiRcvFltPktClearFilterCb =
        (WDI_ReceiveFilterClearFilterCb)pEventData->pCBfnc)))
    {
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
+   }
+
+   ucCurrentBSSSesIdx = WDI_FindAssocSession( pWDICtx, 
+                            pwdiRcvFltPktClearReqParamsType->filterClearParam.bssId, 
+                            &pBSSSes);  
+   if ( NULL == pBSSSes )
+   {
+       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+                 " %s : Association for this BSSID does not exist",__FUNCTION__);
+       return WDI_STATUS_E_FAILURE; 
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
    if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
-                         WDI_RECEIVE_FILTER_CLEAR_FILTER_REQ, 
+                         WDI_RECEIVE_FILTER_CLEAR_FILTER_REQ,
                          sizeof(tHalRcvFltPktClearParam),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(tHalRcvFltPktClearParam))))
@@ -22817,43 +23240,44 @@
                   pEventData, pwdiRcvFltPktClearReqParamsType,
                   wdiRcvFltPktClearFilterCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
 
    rcvFltPktClearParam.status = pwdiRcvFltPktClearReqParamsType->
-                                                    filterClearParam.status; 
+                                                    filterClearParam.status;
    rcvFltPktClearParam.filterId = pwdiRcvFltPktClearReqParamsType->
-                                                    filterClearParam.filterId; 
+                                                    filterClearParam.filterId;
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &rcvFltPktClearParam, 
-                   sizeof(rcvFltPktClearParam)); 
+   rcvFltPktClearParam.bssIdx = pBSSSes->ucBSSIdx;
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &rcvFltPktClearParam,
+                   sizeof(rcvFltPktClearParam));
 
    pWDICtx->wdiReqStatusCB     = pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiRcvFltPktClearReqParamsType->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiRcvFltPktClearReqParamsType->pUserData;
 
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
                         wdiRcvFltPktClearFilterCb, pEventData->pUserData,
-                        WDI_RECEIVE_FILTER_CLEAR_FILTER_RESP); 
+                        WDI_RECEIVE_FILTER_CLEAR_FILTER_RESP);
 }
 
 /**
  @brief Process 8023 Multicast List Response function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_Process8023MulticastListRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -22867,7 +23291,7 @@
              "%s",__FUNCTION__);
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData ))
@@ -22875,36 +23299,36 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wdi8023MulticastListCb = (WDI_8023MulticastListCb)pWDICtx->pfncRspCB; 
+   wdi8023MulticastListCb = (WDI_8023MulticastListCb)pWDICtx->pfncRspCB;
 
    /*-------------------------------------------------------------------------
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdi8023MulticastListCb(wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }
 
 /**
  @brief Process Set 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 
-  
+
+ @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_ProcessReceiveFilterSetFilterRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -22918,7 +23342,7 @@
           "%s",__FUNCTION__);
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData ))
@@ -22926,36 +23350,36 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiReceiveFilterSetFilterCb = (WDI_ReceiveFilterSetFilterCb)pWDICtx->
-                                                                   pfncRspCB; 
+                                                                   pfncRspCB;
 
    /*-------------------------------------------------------------------------
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiReceiveFilterSetFilterCb(wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }
 
 /**
  @brief Process Packet Filter Match Count Response function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessFilterMatchCountRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -22971,7 +23395,7 @@
              "%s",__FUNCTION__);
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData ))
@@ -22979,35 +23403,35 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wdiFilterMatchCountCb = (WDI_FilterMatchCountCb)pWDICtx->pfncRspCB; 
+   wdiFilterMatchCountCb = (WDI_FilterMatchCountCb)pWDICtx->pfncRspCB;
 
    /*-------------------------------------------------------------------------
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiFilterMatchCountCb(wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }
 
 /**
  @brief Process Receive Filter Clear Filter Response function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessReceiveFilterClearFilterRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -23021,7 +23445,7 @@
              "%s",__FUNCTION__);
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData ))
@@ -23029,22 +23453,22 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    wdiReceiveFilterClearFilterCb = (WDI_ReceiveFilterClearFilterCb)pWDICtx->
-                                                                 pfncRspCB; 
+                                                                 pfncRspCB;
 
    /*-------------------------------------------------------------------------
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiReceiveFilterClearFilterCb(wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }
 #endif // WLAN_FEATURE_PACKET_FILTERING
 
@@ -23052,16 +23476,16 @@
  @brief Process Shutdown Rsp function
         There is no shutdown response comming from HAL
         - function just kept for simmetry
- 
+
  @param  pWDICtx:         pointer to the WLAN DAL context
-         pEventData:      pointer to the event information structure 
+         pEventData:      pointer to the event information structure
 
  @see
  @return Result of the function call
 */
 WDI_Status
 WDI_ProcessShutdownRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -23075,19 +23499,19 @@
 /**
  @brief WDI_SetPowerParamsReq
 
- @param pwdiPowerParamsReqParams: the Set Power Params as 
+ @param pwdiPowerParamsReqParams: the Set Power Params as
                       specified by the Device Interface
-  
+
         wdiPowerParamsCb: callback for passing back the response
         of the Set Power Params operation received from the
         device
-  
+
         pUserData: user data will be passed back with the
-        callback 
-  
+        callback
+
  @return Result of the function call
 */
-WDI_Status 
+WDI_Status
 WDI_SetPowerParamsReq
 (
   WDI_SetPowerParamsReqParamsType* pwdiPowerParamsReqParams,
@@ -23099,23 +23523,23 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*------------------------------------------------------------------------
-     Sanity Check 
+     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; 
+     return WDI_STATUS_E_NOT_ALLOWED;
    }
 
    /*------------------------------------------------------------------------
      Fill in Event data and post to the Main FSM
    ------------------------------------------------------------------------*/
    wdiEventData.wdiRequest      = WDI_SET_POWER_PARAMS_REQ;
-   wdiEventData.pEventData      = pwdiPowerParamsReqParams; 
+   wdiEventData.pEventData      = pwdiPowerParamsReqParams;
    wdiEventData.uEventDataSize  = sizeof(*pwdiPowerParamsReqParams);
-   wdiEventData.pCBfnc          = wdiPowerParamsCb; 
+   wdiEventData.pCBfnc          = wdiPowerParamsCb;
    wdiEventData.pUserData       = pUserData;
 
    return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -23123,29 +23547,29 @@
 
 /**
  @brief Process Set Power Params Request function
- 
- @param  pWDICtx:         pointer to the WLAN DAL context 
-         pEventData:      pointer to the event information structure 
-  
+
+ @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_ProcessSetPowerParamsReq
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
 {
    WDI_SetPowerParamsReqParamsType* pwdiPowerParamsReqParams = NULL;
    WDI_SetPowerParamsCb             wdiPowerParamsCb         = NULL;
-   wpt_uint8*                       pSendBuffer              = NULL; 
+   wpt_uint8*                       pSendBuffer              = NULL;
    wpt_uint16                       usDataOffset             = 0;
    wpt_uint16                       usSendSize               = 0;
    tSetPowerParamsType              powerParams;
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pEventData ) ||
        ( NULL == (pwdiPowerParamsReqParams = (WDI_SetPowerParamsReqParamsType*)pEventData->pEventData)) ||
@@ -23154,13 +23578,13 @@
       WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
    /*-----------------------------------------------------------------------
      Get message buffer
    -----------------------------------------------------------------------*/
-   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_POWER_PARAMS_REQ, 
+   if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx, WDI_SET_POWER_PARAMS_REQ,
                          sizeof(powerParams),
                          &pSendBuffer, &usDataOffset, &usSendSize))||
        ( usSendSize < (usDataOffset + sizeof(powerParams) )))
@@ -23169,61 +23593,61 @@
                   "Unable to get send buffer in Set PNO req %x %x %x",
                   pEventData, pwdiPowerParamsReqParams, wdiPowerParamsCb);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
   /*  Ignore DTIM */
-  powerParams.uIgnoreDTIM = 
+  powerParams.uIgnoreDTIM =
     pwdiPowerParamsReqParams->wdiSetPowerParamsInfo.uIgnoreDTIM;
 
   /*DTIM Period*/
-  powerParams.uDTIMPeriod = 
+  powerParams.uDTIMPeriod =
     pwdiPowerParamsReqParams->wdiSetPowerParamsInfo.uDTIMPeriod;
 
   /* Listen Interval */
-  powerParams.uListenInterval= 
+  powerParams.uListenInterval=
     pwdiPowerParamsReqParams->wdiSetPowerParamsInfo.uListenInterval;
 
   /* Broadcast Multicas Filter  */
-  powerParams.uBcastMcastFilter = 
+  powerParams.uBcastMcastFilter =
     pwdiPowerParamsReqParams->wdiSetPowerParamsInfo.uBcastMcastFilter;
 
   /* Beacon Early Termination */
-  powerParams.uEnableBET = 
+  powerParams.uEnableBET =
     pwdiPowerParamsReqParams->wdiSetPowerParamsInfo.uEnableBET;
 
   /* Beacon Early Termination Interval */
-  powerParams.uBETInterval = 
-    pwdiPowerParamsReqParams->wdiSetPowerParamsInfo.uBETInterval; 
-    
+  powerParams.uBETInterval =
+    pwdiPowerParamsReqParams->wdiSetPowerParamsInfo.uBETInterval;
 
-   wpalMemoryCopy( pSendBuffer+usDataOffset, 
-                   &powerParams, 
-                   sizeof(powerParams)); 
+
+   wpalMemoryCopy( pSendBuffer+usDataOffset,
+                   &powerParams,
+                   sizeof(powerParams));
 
    pWDICtx->wdiReqStatusCB     = pwdiPowerParamsReqParams->wdiReqStatusCB;
-   pWDICtx->pReqStatusUserData = pwdiPowerParamsReqParams->pUserData; 
+   pWDICtx->pReqStatusUserData = pwdiPowerParamsReqParams->pUserData;
 
    /*-------------------------------------------------------------------------
-     Send Get STA Request to HAL 
+     Send Get STA Request to HAL
    -------------------------------------------------------------------------*/
-   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize, 
-                        wdiPowerParamsCb, pEventData->pUserData, WDI_SET_POWER_PARAMS_RESP); 
+   return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                        wdiPowerParamsCb, pEventData->pUserData, WDI_SET_POWER_PARAMS_RESP);
 }
 
 /**
  @brief Process Power Params 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 
-  
+
+ @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_ProcessSetPowerParamsRsp
-( 
+(
   WDI_ControlBlockType*  pWDICtx,
   WDI_EventInfoType*     pEventData
 )
@@ -23234,7 +23658,7 @@
    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
    /*-------------------------------------------------------------------------
-     Sanity check 
+     Sanity check
    -------------------------------------------------------------------------*/
    if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
        ( NULL == pEventData->pEventData ))
@@ -23242,21 +23666,21 @@
       WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
                   "%s: Invalid parameters", __FUNCTION__);
       WDI_ASSERT(0);
-      return WDI_STATUS_E_FAILURE; 
+      return WDI_STATUS_E_FAILURE;
    }
 
-   wdiPowerParamsCb = (WDI_SetPowerParamsCb)pWDICtx->pfncRspCB; 
+   wdiPowerParamsCb = (WDI_SetPowerParamsCb)pWDICtx->pfncRspCB;
 
    /*-------------------------------------------------------------------------
      Extract response and send it to UMAC
    -------------------------------------------------------------------------*/
    halStatus = *((eHalStatus*)pEventData->pEventData);
-   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus); 
+   wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
 
    /*Notify UMAC*/
    wdiPowerParamsCb(wdiStatus, pWDICtx->pRspCBUserData);
 
-   return WDI_STATUS_SUCCESS; 
+   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessSetPowerParamsRsp*/
 
 #ifdef WLAN_FEATURE_GTK_OFFLOAD
@@ -23890,8 +24314,8 @@
    ------------------------------------------------------------------------*/
    FillAllFeatureCaps(gpHostWlanFeatCaps, supportEnabledFeatures,
       (sizeof(supportEnabledFeatures)/sizeof(supportEnabledFeatures[0])));
-   WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_ERROR,
-      "bit 0 - %x %x %x %x - bit 128\n",
+   WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_INFO,
+      "Host caps %x %x %x %x\n",
       gpHostWlanFeatCaps->featCaps[0],
       gpHostWlanFeatCaps->featCaps[1],
       gpHostWlanFeatCaps->featCaps[2],
@@ -23965,7 +24389,7 @@
   }
 
   WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_INFO,
-       "bit 0 - %x %x %x %x - bit 128\n",
+       "Host Caps - %x %x %x %x\n",
       ((tWlanFeatCaps *)pEventData->pEventData)->featCaps[0],
       ((tWlanFeatCaps *)pEventData->pEventData)->featCaps[1],
       ((tWlanFeatCaps *)pEventData->pEventData)->featCaps[2],
@@ -24043,14 +24467,14 @@
 
    wpalMemoryCopy(gpFwWlanFeatCaps,(tWlanFeatCaps *) pEventData -> pEventData,
                     fCapsStructSize);
-   WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_ERROR,
-      "bit 0 - %x %x %x %x - bit 128\n",
+   WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_INFO,
+      "FW caps %x %x %x %x\n",
       gpFwWlanFeatCaps->featCaps[0],
       gpFwWlanFeatCaps->featCaps[1],
       gpFwWlanFeatCaps->featCaps[2],
       gpFwWlanFeatCaps->featCaps[3]
      );
-   
+
    wdiFeatureCapsExchangeCb = (WDI_featureCapsExchangeCb) pWDICtx -> pfncRspCB; 
 
    /*Notify UMAC - there is no callback right now but can be used in future if reqd */
diff --git a/CORE/WDI/WPAL/inc/wlan_qct_pal_api.h b/CORE/WDI/WPAL/inc/wlan_qct_pal_api.h
index d71cba8..872a278 100644
--- a/CORE/WDI/WPAL/inc/wlan_qct_pal_api.h
+++ b/CORE/WDI/WPAL/inc/wlan_qct_pal_api.h
@@ -295,4 +295,13 @@
 ---------------------------------------------------------------------------*/
 wpt_status wpalRivaSubystemRestart(void);
 
+/*---------------------------------------------------------------------------
+    wpalWlanReload -  Initiate WLAN Driver reload
+
+    Param:
+       None
+    Return:
+       NONE
+---------------------------------------------------------------------------*/
+void wpalWlanReload(void);
 #endif // __WLAN_QCT_PAL_API_H
diff --git a/CORE/WDI/WPAL/inc/wlan_qct_pal_packet.h b/CORE/WDI/WPAL/inc/wlan_qct_pal_packet.h
index 2c23501..17ae26c 100644
--- a/CORE/WDI/WPAL/inc/wlan_qct_pal_packet.h
+++ b/CORE/WDI/WPAL/inc/wlan_qct_pal_packet.h
@@ -63,7 +63,11 @@
 //   18 BD/PDUs containing the remaining 2232 bytes of the payload
 //     2346 - 114 = 2232; 2232 / 124 = 18
 //   So 21 BD/PDUs are required
-#define VPKT_SIZE_BUFFER  (21 * 128)
+
+//The size of AMSDU frame per spec can be a max of 3839 bytes 
+// in BD/PDUs that means 30 (one BD = 128 bytes) 
+// we must add the size of the 802.11 header to that 
+#define VPKT_SIZE_BUFFER  (30 * 128) + 32
 
 typedef enum
 {
diff --git a/CORE/WDI/WPAL/src/wlan_qct_pal_api.c b/CORE/WDI/WPAL/src/wlan_qct_pal_api.c
index c973b73..b2cb276 100644
--- a/CORE/WDI/WPAL/src/wlan_qct_pal_api.c
+++ b/CORE/WDI/WPAL/src/wlan_qct_pal_api.c
@@ -376,3 +376,17 @@
     }
     return eWLAN_PAL_STATUS_E_FAILURE;
 }
+
+/*---------------------------------------------------------------------------
+    wpalWlanReload -  Initiate WLAN Driver reload
+
+    Param:
+       None
+    Return:
+       NONE
+---------------------------------------------------------------------------*/
+void wpalWlanReload(void)
+{
+   vos_wlanRestart();
+   return;
+}
\ No newline at end of file
diff --git a/CORE/WDI/WPAL/src/wlan_qct_pal_device.c b/CORE/WDI/WPAL/src/wlan_qct_pal_device.c
index f37200d..c846fea 100644
--- a/CORE/WDI/WPAL/src/wlan_qct_pal_device.c
+++ b/CORE/WDI/WPAL/src/wlan_qct_pal_device.c
@@ -67,9 +67,12 @@
  * Preprocessor Definitions and Constants
  * -------------------------------------------------------------------------*/
 
-// address in the 8960 physical memory map
+// address in the Host physical memory map
+#ifdef WCN_PRONTO
+#define WCNSS_BASE_ADDRESS 0xFB000000
+#else
 #define WCNSS_BASE_ADDRESS 0x03000000
-
+#endif
 /*----------------------------------------------------------------------------
  * Type Declarations
  * -------------------------------------------------------------------------*/
diff --git a/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c b/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c
index 5391b91..98916ac 100644
--- a/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c
+++ b/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c
@@ -161,8 +161,6 @@
       else
       {
         wpalPacketAvailableCB = rxLowCB;
-        WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR,
-                    "Failed to allocate packet : %d ", (int)vosStatus);
       }
 #endif /* FEATURE_R33D */
       break;
diff --git a/Makefile b/Makefile
index 87c3eb9..5fbe151 100644
--- a/Makefile
+++ b/Makefile
@@ -72,7 +72,7 @@
 		$(HDD_SRC_DIR)/wlan_hdd_early_suspend.o \
 		$(HDD_SRC_DIR)/wlan_hdd_ftm.o \
 		$(HDD_SRC_DIR)/wlan_hdd_hostapd.o \
-		$(HDD_SRC_DIR)/wlan_hdd_innav.o \
+		$(HDD_SRC_DIR)/wlan_hdd_oemdata.o \
 		$(HDD_SRC_DIR)/wlan_hdd_main.o \
 		$(HDD_SRC_DIR)/wlan_hdd_mib.o \
 		$(HDD_SRC_DIR)/wlan_hdd_scan.o \
@@ -217,7 +217,7 @@
 
 SME_BTC_OBJS := $(SME_SRC_DIR)/btc/btcApi.o
 
-SME_MEAS_OBJS := $(SME_SRC_DIR)/meas/measApi.o
+SME_OEM_DATA_OBJS := $(SME_SRC_DIR)/oemData/oemDataApi.o
 
 SME_P2P_OBJS = $(SME_SRC_DIR)/p2p/p2p_Api.o
 
@@ -227,7 +227,7 @@
 		$(SME_CCM_OBJS) \
 		$(SME_CMN_OBJS) \
 		$(SME_CSR_OBJS) \
-		$(SME_MEAS_OBJS) \
+		$(SME_OEM_DATA_OBJS) \
 		$(SME_P2P_OBJS) \
 		$(SME_PMC_OBJS) \
 		$(SME_QOS_OBJS) \
@@ -470,6 +470,7 @@
 		-DWLAN_FEATURE_NEIGHBOR_ROAMING_DEBUG \
 		-DWLAN_FEATURE_VOWIFI_11R_DEBUG \
 		-DFEATURE_WLAN_WAPI \
+		-DFEATURE_OEM_DATA_SUPPORT \
 		-DSOFTAP_CHANNEL_RANGE \
 		-DWLAN_AP_STA_CONCURRENCY \
 		-DFEATURE_WLAN_SCAN_PNO \
@@ -524,6 +525,10 @@
 CDEFINES += -DWLAN_BTAMP_FEATURE
 endif
 
+CDEFINES += -DWLAN_FEATURE_11AC
+
+CDEFINES += -DWLAN_OPEN_SOURCE
+
 KBUILD_CPPFLAGS += $(CDEFINES)
 
 
diff --git a/firmware_bin/WCNSS_cfg.dat b/firmware_bin/WCNSS_cfg.dat
index 7f31c62..3364845 100644
--- a/firmware_bin/WCNSS_cfg.dat
+++ b/firmware_bin/WCNSS_cfg.dat
Binary files differ
diff --git a/firmware_bin/WCNSS_qcom_cfg.ini b/firmware_bin/WCNSS_qcom_cfg.ini
index 4a867da..cb32d0e 100644
--- a/firmware_bin/WCNSS_qcom_cfg.ini
+++ b/firmware_bin/WCNSS_qcom_cfg.ini
@@ -1,98 +1,157 @@
 # This file allows user to override the factory
+
 # defaults for the WLAN Driver
 
+
 # Enable IMPS or not
 gEnableImps=1
 
 # Enable/Disable Idle Scan
+
 gEnableIdleScan=0
 
+
 # Increase sleep duration (seconds) during IMPS
 # 0 implies no periodic wake up from IMPS. Periodic wakeup is 
 # unnecessary if Idle Scan is disabled.
 gImpsModSleepTime=0
 
+
 # Enable BMPS or not
 gEnableBmps=1
 
 # Enable suspend or not
+
 # 1: Enable standby, 2: Enable Deep sleep, 3: Enable Mcast/Bcast Filter
+
 gEnableSuspend=3
 
+
 # Phy Mode (auto, b, g, n, etc)
+# Valid values are 0-9, with 0 = Auto, 4 = 11n, 9 = 11ac
 gDot11Mode=0
 
+
 # Handoff Enable(1) Disable(0)
+
 gEnableHandoff=0
 
+
 # CSR Roaming Enable(1) Disable(0)
+
 gRoamingTime=0
 
+
 # Assigned MAC Addresses - This will be used until NV items are in place
+
 # Each byte of MAC address is represented in Hex format as XX
+
 Intf0MacAddress=000AF58989FF
 Intf1MacAddress=000AF58989FE
 Intf2MacAddress=000AF58989FD
+
 Intf3MacAddress=000AF58989FC
 
+
 # UAPSD service interval for VO,VI, BE, BK traffic
+
 InfraUapsdVoSrvIntv=0
+
 InfraUapsdViSrvIntv=0
+
 InfraUapsdBeSrvIntv=0
+
 InfraUapsdBkSrvIntv=0
 
+
 # Disable RSSI FW filtering
+
 gEnableFWRssiMonitoring=0
 
+
 # Make 1x1 the default antenna configuration
+
 gNumRxAnt=1
 
+
 # Beacon filtering frequency (unit in beacon intervals)
+
 gNthBeaconFilter=50
 
+
 # Enable WAPI or not
+
 # WAPIIsEnabled=0
 
+
 # Flags to filter Mcast abd Bcast RX packets.
+
 # Value 0: No filtering, 1: Filter all Multicast.
+
 # 2: Filter all Broadcast. 3: Filter all Mcast abd Bcast
+
 McastBcastFilter=3
 
+
 #Flag to enable HostARPOffload feature or not
+
 hostArpOffload=0
 
+
 #SoftAP Related Parameters
+
 # AP MAc addr
-gAPMacAddr=000AF58989EF
+
+gAPMacAddr=000AF589dcab
+
 
 # 802.11n Protection flag
+
 gEnableApProt=1
 
+
 #Enable OBSS protection
+
 gEnableApOBSSProt=0
 
+
 #Enable/Disable UAPSD for SoftAP
-gEnableApUapsd=1
+
+gEnableApUapsd=0
+
 
 # Fixed Rate
+
 gFixedRate=0
 
+
 # Maximum Tx power
+
 # gTxPowerCap=30
 
+
 # Fragmentation Threshold
+
 # gFragmentationThreshold=2346
 
+
 # RTS threshold
+
 RTSThreshold=2347
 
+
 # Intra-BSS forward
+
 gDisableIntraBssFwd=0
 
+
 # WMM Enable/Disable
+
 WmmIsEnabled=0
 
+
 # 802.11d support
+
 g11dSupportEnabled=1
 
 # CCX Support and fast transition
@@ -117,83 +176,162 @@
 #Check if the AP to which we are roaming is better than current AP in terms of RSSI.
 #Checking is disabled if set to Zero.Otherwise it will use this value as to how better 
 #the RSSI of the new/roamable AP should be for roaming
-RoamRssiDiff=0
+RoamRssiDiff=5
 
 # SAP Country code
+
 # Default Country Code is 2 bytes, 3rd byte is optional indoor or out door.
+
 # Example
+
 #   US Indoor, USI
+
 #   Korea Outdoor, KRO
+
 #   Japan without optional byte, JP
+
 #   France without optional byte, FR
+
 #gAPCntryCode=USI
 
+
 #Short Guard Interval Enable/disable
+
 gShortGI20Mhz=1
+
 gShortGI40Mhz=1
 
+
 #Auto Shutdown  Value in seconds. A value of 0 means Auto shutoff is disabled
+
 gAPAutoShutOff=0
 
+
 # SAP auto channel selection configuration
+
 # 0 = disable auto channel selection
+
 # 1 = enable auto channel selection, channel provided by supplicant will be ignored
+
 gApAutoChannelSelection=0
 
+
 # Listen Energy Detect Mode Configuration
+
 # Valid values 0-128
+
 # 128 means disable Energy Detect feature
+
 # 0-9 are threshold code and 7 is recommended value from system if feature is to be enabled.
+
 # 10-128 are reserved.
+
 # The EDET threshold mapping is as follows in 3dB step:
+
 # 0 = -60 dBm
+
 # 1 = -63 dBm
+
 # 2 = -66 dBm
+
 # ...
+
 # 7 = -81 dBm
+
 # 8 = -84 dBm
+
 # 9 = -87 dBm
+
 # Note: Any of these settings are valid. Setting 0 would yield the highest power saving (in a noisy environment) at the cost of more range. The range impact is approximately #calculated as:
+
 #
+
 #  Range Loss  (dB)  =  EDET threshold level (dBm) + 97 dBm.
+
 #
+
 gEnablePhyAgcListenMode=128
 
+
 #Preferred channel to start BT AMP AP mode (0 means, any channel)
+
 BtAmpPreferredChannel=0
 
+
 #Preferred band (both or 2.4 only or 5 only)
+
 BandCapability=0
 
+
 #Beacon Early Termination (1 = enable the BET feature, 0 = disable)
+
 enableBeaconEarlyTermination=0
+
 beaconEarlyTerminationWakeInterval=3
 
+
 #Bluetooth Alternate Mac Phy (1 = enable the BT AMP feature, 0 = disable)
+
 gEnableBtAmp=0
 
+
 #SOFTAP Channel Range selection 
+
 gAPChannelSelectStartChannel=1
+
 gAPChannelSelectEndChannel=11
 
+
 #SOFTAP Channel Range selection Operating band
+
 # 0:2.4GHZ 1: LOW-5GHZ 2:MID-5GHZ 3:HIGH-5GHZ 4: 4.9HZ BAND
+
 gAPChannelSelectOperatingBand=0
 
+
+#Channel Bonding
+gChannelBondingMode5GHz=6
+
+
 #Enable Keep alive with non-zero period value
+
 #gStaKeepAlivePeriod = 30
 
+
 #If set will start with active scan after driver load, otherwise will start with
+
 #passive scan to find out the domain
-gEnableBypass11d=1
+
+#gEnableBypass11d=1
+
 
 #If set to 0, will not scan DFS channels
+
 gEnableDFSChnlScan=1
 
-# Enable logp/SSR
+
+gVhtChannelWidth=2
 gEnableLogp=1
 
+
 # Enable Automatic Tx Power control
+
 gEnableAutomaticTxPowerControl=1
+
+# 0 for OLPC 1 for CLPC and SCPC
+gEnableCloseLoop=1
+
+#Data Inactivity Timeout when in powersave (in ms)
+gDataInactivityTimeout=200
+
+# VHT Tx/Rx MCS values
+# Valid values are 0,1,2. If commented out, the default value is 0.
+# 0=MCS0-7, 1=MCS0-8, 2=MCS0-9
+gVhtRxMCS=2
+gVhtTxMCS=2
+
+
 END
+
 # Note: Configuration parser would not read anything past the END marker
+
diff --git a/firmware_bin/WCNSS_qcom_wlan_nv.bin b/firmware_bin/WCNSS_qcom_wlan_nv.bin
index 557f8a8..e946dec 100644
--- a/firmware_bin/WCNSS_qcom_wlan_nv.bin
+++ b/firmware_bin/WCNSS_qcom_wlan_nv.bin
Binary files differ
diff --git a/riva/inc/wlan_hal_msg.h b/riva/inc/wlan_hal_msg.h
index 336cad0..4234c32 100644
--- a/riva/inc/wlan_hal_msg.h
+++ b/riva/inc/wlan_hal_msg.h
@@ -27,7 +27,7 @@
  *
  *  @author:   Kumar Anand
  *
- *             Copyright (C) 2010, Qualcomm, Inc. 
+ *             Copyright (C) 2010, Qualcomm, Inc.
  *             All rights reserved.
  *
  *=========================================================================*/
@@ -39,7 +39,6 @@
 #include "halCompiler.h"
 #include "wlan_qct_dev_defs.h"
 #include "wlan_nv.h"
-
 /*---------------------------------------------------------------------------
   API VERSIONING INFORMATION
 
@@ -54,8 +53,8 @@
       or if a new API is added
   All values are in the range 0..255 (ie they are 8-bit values)
  ---------------------------------------------------------------------------*/
-#define WLAN_HAL_VER_MAJOR 0
-#define WLAN_HAL_VER_MINOR 1
+#define WLAN_HAL_VER_MAJOR 1
+#define WLAN_HAL_VER_MINOR 3
 #define WLAN_HAL_VER_VERSION 1
 #define WLAN_HAL_VER_REVISION 0
 
@@ -65,6 +64,7 @@
 
 //This is to force compiler to use the maximum of an int ( 4 bytes )
 #define WLAN_HAL_MAX_ENUM_SIZE    0x7FFFFFFF
+#define WLAN_HAL_MSG_TYPE_MAX_ENUM_SIZE    0x7FFF
 
 //Max no. of transmit categories
 #define STACFG_MAX_TC    8
@@ -82,9 +82,9 @@
 #define WLAN_HAL_BSS_INVALID_IDX 0xFF
 
 //Default Beacon template size
-#define BEACON_TEMPLATE_SIZE 0x180 
+#define BEACON_TEMPLATE_SIZE 0x180
 
-//Param Change Bitmap sent to HAL 
+//Param Change Bitmap sent to HAL
 #define PARAM_BCN_INTERVAL_CHANGED                      (1 << 0)
 #define PARAM_SHORT_PREAMBLE_CHANGED                 (1 << 1)
 #define PARAM_SHORT_SLOT_TIME_CHANGED                 (1 << 2)
@@ -105,11 +105,8 @@
 /*Version string max length (including NUL) */
 #define WLAN_HAL_VERSION_LENGTH  64
 
-/*Max Num Of BSSIDS in INNAV_MEAS_REQ*/
-#define MAX_BSSIDS_IN_INNAV_MEAS_REQ 1
-
 /* Message types for messages exchanged between WDI and HAL */
-typedef enum 
+typedef enum
 {
    //Init/De-Init
    WLAN_HAL_START_REQ = 0,
@@ -179,7 +176,7 @@
    WLAN_HAL_MIC_FAILURE_IND             = 52,
    WLAN_HAL_FATAL_ERROR_IND             = 53,
    WLAN_HAL_SET_KEYDONE_MSG             = 54,
-   
+
    //NV Interface
    WLAN_HAL_DOWNLOAD_NV_REQ             = 55,
    WLAN_HAL_DOWNLOAD_NV_RSP             = 56,
@@ -198,11 +195,11 @@
    WLAN_HAL_DELETE_STA_CONTEXT_IND         = 67,
    WLAN_HAL_UPDATE_PROBE_RSP_TEMPLATE_REQ  = 68,
    WLAN_HAL_UPDATE_PROBE_RSP_TEMPLATE_RSP  = 69,
-   
+
   // PTT interface support
    WLAN_HAL_PROCESS_PTT_REQ   = 70,
    WLAN_HAL_PROCESS_PTT_RSP   = 71,
-   
+
    // BTAMP related events
    WLAN_HAL_SIGNAL_BTAMP_EVENT_REQ  = 72,
    WLAN_HAL_SIGNAL_BTAMP_EVENT_RSP  = 73,
@@ -261,14 +258,14 @@
    //P2P  WLAN_FEATURE_P2P
    WLAN_HAL_SET_P2P_GONOA_REQ      = 119,
    WLAN_HAL_SET_P2P_GONOA_RSP      = 120,
-   
+
    //WLAN Dump commands
    WLAN_HAL_DUMP_COMMAND_REQ       = 121,
    WLAN_HAL_DUMP_COMMAND_RSP       = 122,
 
-   //INNAV FEATURE SUPPORT
-   WLAN_HAL_START_INNAV_MEAS_REQ   = 123,
-   WLAN_HAL_START_INNAV_MEAS_RSP   = 124,
+   //OEM_DATA FEATURE SUPPORT
+   WLAN_HAL_START_OEM_DATA_REQ   = 123,
+   WLAN_HAL_START_OEM_DATA_RSP   = 124,
 
    //ADD SELF STA REQ and RSP
    WLAN_HAL_ADD_STA_SELF_REQ       = 125,
@@ -281,7 +278,7 @@
    // Coex Indication
    WLAN_HAL_COEX_IND               = 129,
 
-   // Tx Complete Indication 
+   // Tx Complete Indication
    WLAN_HAL_OTA_TX_COMPL_IND       = 130,
 
    //Host Suspend/resume messages
@@ -295,7 +292,7 @@
    WLAN_HAL_GET_TX_POWER_RSP       = 137,
 
    WLAN_HAL_P2P_NOA_ATTR_IND       = 138,
-   
+
    WLAN_HAL_ENABLE_RADAR_DETECT_REQ  = 139,
    WLAN_HAL_ENABLE_RADAR_DETECT_RSP  = 140,
    WLAN_HAL_GET_TPC_REPORT_REQ       = 141,
@@ -303,7 +300,7 @@
    WLAN_HAL_RADAR_DETECT_IND         = 143,
    WLAN_HAL_RADAR_DETECT_INTR_IND    = 144,
    WLAN_HAL_KEEP_ALIVE_REQ           = 145,
-   WLAN_HAL_KEEP_ALIVE_RSP           = 146,      
+   WLAN_HAL_KEEP_ALIVE_RSP           = 146,
 
    /*PNO messages*/
    WLAN_HAL_SET_PREF_NETWORK_REQ     = 147,
@@ -312,25 +309,25 @@
    WLAN_HAL_SET_RSSI_FILTER_RSP      = 150,
    WLAN_HAL_UPDATE_SCAN_PARAM_REQ    = 151,
    WLAN_HAL_UPDATE_SCAN_PARAM_RSP    = 152,
-   WLAN_HAL_PREF_NETW_FOUND_IND      = 153, 
+   WLAN_HAL_PREF_NETW_FOUND_IND      = 153,
 
    WLAN_HAL_SET_TX_PER_TRACKING_REQ  = 154,
    WLAN_HAL_SET_TX_PER_TRACKING_RSP  = 155,
    WLAN_HAL_TX_PER_HIT_IND           = 156,
-   
+
    WLAN_HAL_8023_MULTICAST_LIST_REQ   = 157,
-   WLAN_HAL_8023_MULTICAST_LIST_RSP   = 158,   
+   WLAN_HAL_8023_MULTICAST_LIST_RSP   = 158,
 
    WLAN_HAL_SET_PACKET_FILTER_REQ     = 159,
-   WLAN_HAL_SET_PACKET_FILTER_RSP     = 160,   
+   WLAN_HAL_SET_PACKET_FILTER_RSP     = 160,
    WLAN_HAL_PACKET_FILTER_MATCH_COUNT_REQ   = 161,
-   WLAN_HAL_PACKET_FILTER_MATCH_COUNT_RSP   = 162,   
+   WLAN_HAL_PACKET_FILTER_MATCH_COUNT_RSP   = 162,
    WLAN_HAL_CLEAR_PACKET_FILTER_REQ         = 163,
-   WLAN_HAL_CLEAR_PACKET_FILTER_RSP         = 164,  
-   /*This is temp fix. Should be removed once 
+   WLAN_HAL_CLEAR_PACKET_FILTER_RSP         = 164,
+   /*This is temp fix. Should be removed once
     * Host and Riva code is in sync*/
    WLAN_HAL_INIT_SCAN_CON_REQ               = 165,
-    
+
    WLAN_HAL_SET_POWER_PARAMS_REQ            = 166,
    WLAN_HAL_SET_POWER_PARAMS_RSP            = 167,
 
@@ -339,7 +336,7 @@
 
    // wake reason indication (WOW)
    WLAN_HAL_WAKE_REASON_IND                 = 170,
-   // GTK offload support 
+   // GTK offload support
    WLAN_HAL_GTK_OFFLOAD_REQ                 = 171,
    WLAN_HAL_GTK_OFFLOAD_RSP                 = 172,
    WLAN_HAL_GTK_OFFLOAD_GETINFO_REQ         = 173,
@@ -352,11 +349,19 @@
    WLAN_HAL_SET_THERMAL_MITIGATION_REQ      = 178,
    WLAN_HAL_SET_THERMAL_MITIGATION_RSP      = 179,
 
-   WLAN_HAL_MSG_MAX = WLAN_HAL_MAX_ENUM_SIZE
+  WLAN_HAL_MSG_MAX = WLAN_HAL_MSG_TYPE_MAX_ENUM_SIZE
 }tHalHostMsgType;
 
+/* Enumeration for Version */
+typedef enum
+{
+   WLAN_HAL_MSG_VERSION0 = 0,
+   WLAN_HAL_MSG_VERSION1 = 1,
+   WLAN_HAL_MSG_VERSION_MAX_FIELD = 0x7FFF /*define as 2 bytes data*/
+}tHalHostMsgVersion;
+
 /* Enumeration for Boolean - False/True, On/Off */
-typedef enum tagAniBoolean 
+typedef enum tagAniBoolean
 {
     eANI_BOOLEAN_FALSE = 0,
     eANI_BOOLEAN_TRUE,
@@ -397,6 +402,15 @@
     PHY_DOUBLE_CHANNEL_LOW_PRIMARY = 1,  // 40MHz IF bandwidth with lower 20MHz supporting the primary channel
     PHY_DOUBLE_CHANNEL_CENTERED = 2,     // 40MHz IF bandwidth centered on IF carrier
     PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3, // 40MHz IF bandwidth with higher 20MHz supporting the primary channel
+#ifdef WLAN_FEATURE_11AC
+    PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED = 4, //20/40MHZ offset LOW 40/80MHZ offset CENTERED
+    PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED = 5, //20/40MHZ offset CENTERED 40/80MHZ offset CENTERED
+    PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED = 6, //20/40MHZ offset HIGH 40/80MHZ offset CENTERED
+    PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW = 7,//20/40MHZ offset LOW 40/80MHZ offset LOW
+    PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW = 8, //20/40MHZ offset HIGH 40/80MHZ offset LOW
+    PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH = 9, //20/40MHZ offset LOW 40/80MHZ offset HIGH
+    PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH = 10,//20/40MHZ offset-HIGH 40/80MHZ offset HIGH
+#endif
     PHY_CHANNEL_BONDING_STATE_MAX = WLAN_HAL_MAX_ENUM_SIZE
 }ePhyChanBondState;
 
@@ -419,6 +433,9 @@
     eSTA_11bg,
     eSTA_11a,
     eSTA_11n,
+#ifdef WLAN_FEATURE_11AC
+    eSTA_11ac,
+#endif
     eSTA_INVALID_RATE_MODE = WLAN_HAL_MAX_ENUM_SIZE
 } tStaRateMode, *tpStaRateMode;
 
@@ -462,14 +479,6 @@
   eSIR_HT_OP_MODE_MAX = WLAN_HAL_MAX_ENUM_SIZE
 } tSirMacHTOperatingMode;
 
-typedef enum eSirMacHTSecondaryChannelOffset
-{
-    eHT_SECONDARY_CHANNEL_OFFSET_NONE = 0,
-    eHT_SECONDARY_CHANNEL_OFFSET_UP = 1,
-    eHT_SECONDARY_CHANNEL_OFFSET_DOWN = 3,
-    eHT_SECONDARY_CHANNEL_OFFSET_MAX = WLAN_HAL_MAX_ENUM_SIZE
-} tSirMacHTSecondaryChannelOffset;
-
 /// Encryption type enum used with peer
 typedef enum eAniEdType
 {
@@ -523,7 +532,7 @@
     eSIR_LINK_BTAMP_POSTASSOC_STATE  = 6,
     eSIR_LINK_BTAMP_AP_STATE  = 7,
     eSIR_LINK_BTAMP_STA_STATE  = 8,
-    
+
     /* Reserved for HAL Internal Use */
     eSIR_LINK_LEARN_STATE       = 9,
     eSIR_LINK_SCAN_STATE        = 10,
@@ -547,7 +556,7 @@
 }eHalStatsMask;
 
 /* BT-AMP events type */
-typedef enum 
+typedef enum
 {
     BTAMP_EVENT_CONNECTION_START,
     BTAMP_EVENT_CONNECTION_STOP,
@@ -613,18 +622,18 @@
     tAniEdType      encType;
 
     /*STATIC/DYNAMIC - valid only for WEP*/
-    tAniWepType     wepType; 
+    tAniWepType     wepType;
 
     /*Default WEP key, valid only for static WEP, must between 0 and 3.*/
     tANI_U8         defWEPIdx;
 
 #ifdef WLAN_SOFTAP_FEATURE
     /* valid only for non-static WEP encyrptions */
-    tSirKeys        key[SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS];            
+    tSirKeys        key[SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS];
 #else
     tSirKeys        key;
 #endif
-  
+
     /*Control for Replay Count, 1= Single TID based replay count on Tx
       0 = Per TID based replay count on TX */
     tANI_U8         singleTidRc;
@@ -636,7 +645,8 @@
 /* 4-byte control message header used by HAL*/
 typedef PACKED_PRE struct PACKED_POST
 {
-   tHalHostMsgType  msgType;
+   tHalHostMsgType  msgType:16;
+   tHalHostMsgVersion msgVersion:16;
    tANI_U32         msgLen;
 } tHalMsgHeader, *tpHalMsgHeader;
 
@@ -647,7 +657,7 @@
     * in shared header file between UMAC and HAL.*/
    tANI_U16   uCfgId;
 
-   /* Length of the Cfg. This parameter is used to go to next cfg 
+   /* Length of the Cfg. This parameter is used to go to next cfg
     * in the TLV format.*/
    tANI_U16   uCfgLen;
 
@@ -673,8 +683,8 @@
     /*Length of the config buffer*/
     tANI_U32  uConfigBufferLen;
 
-    /* Following this there is a TLV formatted buffer of length 
-     * "uConfigBufferLen" bytes containing all config values. 
+    /* Following this there is a TLV formatted buffer of length
+     * "uConfigBufferLen" bytes containing all config values.
      * The TLV is expected to be formatted like this:
      * 0           15            31           31+CFG_LEN-1        length-1
      * |   CFG_ID   |   CFG_LEN   |   CFG_BODY    |  CFG_ID  |......|
@@ -764,8 +774,8 @@
     /* Length of the config buffer. Allows UMAC to update multiple CFGs */
     tANI_U32  uConfigBufferLen;
 
-    /* Following this there is a TLV formatted buffer of length 
-     * "uConfigBufferLen" bytes containing all config values. 
+    /* Following this there is a TLV formatted buffer of length
+     * "uConfigBufferLen" bytes containing all config values.
      * The TLV is expected to be formatted like this:
      * 0           15            31           31+CFG_LEN-1        length-1
      * |   CFG_ID   |   CFG_LEN   |   CFG_BODY    |  CFG_ID  |......|
@@ -888,7 +898,7 @@
       frameType.*/
     tANI_U8 frameLength;
 
-    /* Following the framelength there is a MAC frame buffer if frameLength 
+    /* Following the framelength there is a MAC frame buffer if frameLength
        is non-zero. */
     tSirMacMgmtHdr macMgmtHdr;
 
@@ -925,7 +935,7 @@
       frameType.*/
     tANI_U8 frameLength;
 
-    /* Following the framelength there is a MAC frame buffer if frameLength 
+    /* Following the framelength there is a MAC frame buffer if frameLength
        is non-zero. */
     tSirMacMgmtHdr macMgmtHdr;
 
@@ -968,7 +978,7 @@
   WLAN_HAL_START_SCAN_REQ
 ---------------------------------------------------------------------------*/
 
-typedef PACKED_PRE struct PACKED_POST 
+typedef PACKED_PRE struct PACKED_POST
 {
    /*Indicates the channel to scan*/
    tANI_U8 scanChannel;
@@ -1069,9 +1079,9 @@
       macMgmtHdr. If zero, HAL will generate the appropriate MAC frame based on
       frameType.*/
     tANI_U8 frameLength;
-    
-    /*Following the framelength there is a MAC frame buffer if frameLength 
-      is non-zero.*/    
+
+    /*Following the framelength there is a MAC frame buffer if frameLength
+      is non-zero.*/
     tSirMacMgmtHdr macMgmtHdr;
 
     /*Entry to hold number of active BSS idx's*/
@@ -1179,7 +1189,7 @@
     /*RIFS mode 0 - NA, 1 - Allowed */
     tANI_U8 rifsMode;
 
-    /*L-SIG TXOP Protection mechanism 
+    /*L-SIG TXOP Protection mechanism
       0 - No Support, 1 - Supported
       SG - there is global field */
     tANI_U8 lsigTxopProtection;
@@ -1200,16 +1210,13 @@
     /*Short GI support for 20Mhz packets*/
     tANI_U8 fShortGI20Mhz;
 
-    /*These rates are the intersection of peer and self capabilities.*/
-    tSirSupportedRates supportedRates;
-
     /*Robust Management Frame (RMF) enabled/disabled*/
     tANI_U8 rmfEnabled;
 
     /* The unicast encryption type in the association */
     tANI_U32 encryptType;
-    
-    /*HAL should update the existing STA entry, if this flag is set. UMAC 
+
+    /*HAL should update the existing STA entry, if this flag is set. UMAC
       will set this flag in case of RE-ASSOC, where we want to reuse the old
       STA ID. 0 = Add, 1 = Update*/
     tANI_U8 action;
@@ -1231,10 +1238,10 @@
 
     /*Delayed BA Support*/
     tANI_U8 delayedBASupport;
-    
+
     /*Max AMPDU duration in 32us*/
     tANI_U8 us32MaxAmpduDuration;
-    
+
     /*HT STA should set it to 1 if it is enabled in BSS. HT STA should set
       it to 0 if AP does not support it. This indication is sent to HAL and
       HAL uses this flag to pickup up appropriate 40Mhz rates.*/
@@ -1250,12 +1257,190 @@
 
     tANI_U8  p2pCapableSta;
 
+    /*Reserved to align next field on a dword boundary*/
+    tANI_U8  reserved;
+
+    /*These rates are the intersection of peer and self capabilities.*/
+    tSirSupportedRates supportedRates;
+
 } tConfigStaParams, *tpConfigStaParams;
 
+/*------------------------------------------------------------------------
+ * WLAN_HAL_CONFIG_STA_REQ
+ * ----------------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST {
+    /*
+    * For Self STA Entry: this represents Self Mode.
+    * For Peer Stations, this represents the mode of the peer.
+    * On Station:
+    * --this mode is updated when PE adds the Self Entry.
+    * -- OR when PE sends 'ADD_BSS' message and station context in BSS is used to indicate the mode of the AP.
+    * ON AP:
+    * -- this mode is updated when PE sends 'ADD_BSS' and Sta entry for that BSS is used
+    *     to indicate the self mode of the AP.
+    * -- OR when a station is associated, PE sends 'ADD_STA' message with this mode updated.
+    */
+
+    tStaRateMode        opRateMode;
+    // 11b, 11a and aniLegacyRates are IE rates which gives rate in unit of 500Kbps
+    tANI_U16             llbRates[SIR_NUM_11B_RATES];
+    tANI_U16             llaRates[SIR_NUM_11A_RATES];
+    tANI_U16             aniLegacyRates[SIR_NUM_POLARIS_RATES];
+    tANI_U16             reserved;
+
+    //Taurus only supports 26 Titan Rates(no ESF/concat Rates will be supported)
+    //First 26 bits are reserved for those Titan rates and
+    //the last 4 bits(bit28-31) for Taurus, 2(bit26-27) bits are reserved.
+    tANI_U32             aniEnhancedRateBitmap; //Titan and Taurus Rates
+
+    /*
+    * 0-76 bits used, remaining reserved
+    * bits 0-15 and 32 should be set.
+    */
+    tANI_U8 supportedMCSSet[SIR_MAC_MAX_SUPPORTED_MCS_SET];
+
+    /*
+     * RX Highest Supported Data Rate defines the highest data
+     * rate that the STA is able to receive, in unites of 1Mbps.
+     * This value is derived from "Supported MCS Set field" inside
+     * the HT capability element.
+     */
+    tANI_U16 rxHighestDataRate;
+
+    /* Indicates the Maximum MCS that can be received for each number
+        * of spacial streams */
+    tANI_U16 vhtRxMCSMap;
+
+    /*Indicate the highest VHT data rate that the STA is able to receive*/
+    tANI_U16 vhtRxHighestDataRate;
+
+    /* Indicates the Maximum MCS that can be transmitted  for each number
+         * of spacial streams */
+    tANI_U16 vhtTxMCSMap;
+
+    /*Indicate the highest VHT data rate that the STA is able to transmit*/
+    tANI_U16 vhtTxHighestDataRate;
+
+} tSirSupportedRates_V1, *tpSirSupportedRates_V1;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+    /*BSSID of STA*/
+    tSirMacAddr bssId;
+
+    /*ASSOC ID, as assigned by UMAC*/
+    tANI_U16 assocId;
+
+    /* STA entry Type: 0 - Self, 1 - Other/Peer, 2 - BSSID, 3 - BCAST */
+    tANI_U8 staType;
+
+    /*Short Preamble Supported.*/
+    tANI_U8 shortPreambleSupported;
+
+    /*MAC Address of STA*/
+    tSirMacAddr staMac;
+
+    /*Listen interval of the STA*/
+    tANI_U16 listenInterval;
+
+    /*Support for 11e/WMM*/
+    tANI_U8 wmmEnabled;
+
+    /*11n HT capable STA*/
+    tANI_U8 htCapable;
+
+    /*TX Width Set: 0 - 20 MHz only, 1 - 20/40 MHz*/
+    tANI_U8 txChannelWidthSet;
+
+    /*RIFS mode 0 - NA, 1 - Allowed */
+    tANI_U8 rifsMode;
+
+    /*L-SIG TXOP Protection mechanism
+      0 - No Support, 1 - Supported
+      SG - there is global field */
+    tANI_U8 lsigTxopProtection;
+
+    /*Max Ampdu Size supported by STA. TPE programming.
+      0 : 8k , 1 : 16k, 2 : 32k, 3 : 64k */
+    tANI_U8 maxAmpduSize;
+
+    /*Max Ampdu density. Used by RA.  3 : 0~7 : 2^(11nAMPDUdensity -4)*/
+    tANI_U8 maxAmpduDensity;
+
+    /*Max AMSDU size 1 : 3839 bytes, 0 : 7935 bytes*/
+    tANI_U8 maxAmsduSize;
+
+    /*Short GI support for 40Mhz packets*/
+    tANI_U8 fShortGI40Mhz;
+
+    /*Short GI support for 20Mhz packets*/
+    tANI_U8 fShortGI20Mhz;
+
+    /*Robust Management Frame (RMF) enabled/disabled*/
+    tANI_U8 rmfEnabled;
+
+    /* The unicast encryption type in the association */
+    tANI_U32 encryptType;
+
+    /*HAL should update the existing STA entry, if this flag is set. UMAC
+      will set this flag in case of RE-ASSOC, where we want to reuse the old
+      STA ID. 0 = Add, 1 = Update*/
+    tANI_U8 action;
+
+    /*U-APSD Flags: 1b per AC.  Encoded as follows:
+       b7 b6 b5 b4 b3 b2 b1 b0 =
+       X  X  X  X  BE BK VI VO */
+    tANI_U8 uAPSD;
+
+    /*Max SP Length*/
+    tANI_U8 maxSPLen;
+
+    /*11n Green Field preamble support
+      0 - Not supported, 1 - Supported */
+    tANI_U8 greenFieldCapable;
+
+    /*MIMO Power Save mode*/
+    tSirMacHTMIMOPowerSaveState mimoPS;
+
+    /*Delayed BA Support*/
+    tANI_U8 delayedBASupport;
+
+    /*Max AMPDU duration in 32us*/
+    tANI_U8 us32MaxAmpduDuration;
+
+    /*HT STA should set it to 1 if it is enabled in BSS. HT STA should set
+      it to 0 if AP does not support it. This indication is sent to HAL and
+      HAL uses this flag to pickup up appropriate 40Mhz rates.*/
+    tANI_U8 fDsssCckMode40Mhz;
+
+    /* Valid STA Idx when action=Update. Set to 0xFF when invalid!
+       Retained for backward compalibity with existing HAL code*/
+    tANI_U8 staIdx;
+
+    /* BSSID of BSS to which station is associated. Set to 0xFF when invalid.
+       Retained for backward compalibity with existing HAL code*/
+    tANI_U8 bssIdx;
+
+    tANI_U8  p2pCapableSta;
+
+    /*Reserved to align next field on a dword boundary*/
+    tANI_U8  reserved;
+        /*These rates are the intersection of peer and self capabilities.*/
+    tSirSupportedRates_V1 supportedRates;
+
+    tANI_U8  vhtCapable;
+    tANI_U8  vhtTxChannelWidthSet;
+
+} tConfigStaParams_V1, *tpConfigStaParams_V1;
+
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader header;
+   PACKED_PRE union PACKED_POST {
    tConfigStaParams configStaParams;
+    tConfigStaParams_V1 configStaParams_V1;
+   } uStaParams;
 }  tConfigStaReqMsg, *tpConfigStaReqMsg;
 
 /*---------------------------------------------------------------------------
@@ -1276,7 +1461,7 @@
   /* DPU Index for PTK */
   tANI_U8 dpuIndex;
 
-  /* DPU Index for GTK */  
+  /* DPU Index for GTK */
   tANI_U8 bcastDpuIndex;
 
   /*DPU Index for IGTK  */
@@ -1306,7 +1491,7 @@
 ---------------------------------------------------------------------------*/
 
 /* Delete STA Request params */
-typedef PACKED_PRE struct PACKED_POST 
+typedef PACKED_PRE struct PACKED_POST
 {
    /* Index of STA to delete */
    tANI_U8    staIdx;
@@ -1324,7 +1509,7 @@
 ---------------------------------------------------------------------------*/
 
 /* Delete STA Response Params */
-typedef PACKED_PRE struct PACKED_POST 
+typedef PACKED_PRE struct PACKED_POST
 {
    /*success or failure */
    tANI_U32   status;
@@ -1396,8 +1581,8 @@
 // Concurrency role.  These are generic IDs that identify the various roles
 // in the software system.
 typedef enum {
-    HAL_STA_MODE=0, 
-    HAL_STA_SAP_MODE=1, // to support softAp mode . This is misleading. It means AP MODE only. 
+    HAL_STA_MODE=0,
+    HAL_STA_SAP_MODE=1, // to support softAp mode . This is misleading. It means AP MODE only.
     HAL_P2P_CLIENT_MODE,
     HAL_P2P_GO_MODE,
     HAL_MONITOR_MODE,
@@ -1410,7 +1595,7 @@
 //bit 3 - p2p go mode
 typedef enum
 {
-    HAL_STA=1, 
+    HAL_STA=1,
     HAL_SAP=2,
     HAL_STA_SAP=3, //to support sta, softAp  mode . This means STA+AP mode
     HAL_P2P_CLIENT=4,
@@ -1479,11 +1664,142 @@
     /*Reserved to align next field on a dword boundary*/
     tANI_U8 reserved;
 
+    /*SSID of the BSS*/
+    tSirMacSSid ssId;
+
+    /*HAL should update the existing BSS entry, if this flag is set.
+      UMAC will set this flag in case of reassoc, where we want to resue the
+      the old BSSID and still return success 0 = Add, 1 = Update*/
+    tANI_U8 action;
+
+    /* MAC Rate Set */
+    tSirMacRateSet rateSet;
+
+    /*Enable/Disable HT capabilities of the BSS*/
+    tANI_U8 htCapable;
+
+    // Enable/Disable OBSS protection
+    tANI_U8 obssProtEnabled;
+
+    /*RMF enabled/disabled*/
+    tANI_U8 rmfEnabled;
+
+    /*HT Operating Mode operating mode of the 802.11n STA*/
+    tSirMacHTOperatingMode htOperMode;
+
+    /*Dual CTS Protection: 0 - Unused, 1 - Used*/
+    tANI_U8 dualCTSProtection;
+
+    /* Probe Response Max retries */
+    tANI_U8   ucMaxProbeRespRetryLimit;
+
+    /* To Enable Hidden ssid */
+    tANI_U8   bHiddenSSIDEn;
+
+    /* To Enable Disable FW Proxy Probe Resp */
+    tANI_U8   bProxyProbeRespEn;
+
+    /* Boolean to indicate if EDCA params are valid. UMAC might not have valid
+       EDCA params or might not desire to apply EDCA params during config BSS.
+       0 implies Not Valid ; Non-Zero implies valid*/
+    tANI_U8   edcaParamsValid;
+
+    /*EDCA Parameters for Best Effort Access Category*/
+    tSirMacEdcaParamRecord acbe;
+
+    /*EDCA Parameters forBackground Access Category*/
+    tSirMacEdcaParamRecord acbk;
+
+    /*EDCA Parameters for Video Access Category*/
+    tSirMacEdcaParamRecord acvi;
+
+    /*EDCA Parameters for Voice Access Category*/
+    tSirMacEdcaParamRecord acvo;
+
+#ifdef WLAN_FEATURE_VOWIFI_11R
+    tANI_U8 extSetStaKeyParamValid; //Ext Bss Config Msg if set
+    tSetStaKeyParams extSetStaKeyParam;  //SetStaKeyParams for ext bss msg
+#endif
+
+    /* Persona for the BSS can be STA,AP,GO,CLIENT value same as tHalConMode */
+    tANI_U8   halPersona;
+
+    tANI_U8 bSpectrumMgtEnable;
+
+    /*HAL fills in the tx power used for mgmt frames in txMgmtPower*/
+    tANI_S8     txMgmtPower;
+    /*maxTxPower has max power to be used after applying the power constraint if any */
+    tANI_S8     maxTxPower;
     /*Context of the station being added in HW
       Add a STA entry for "itself" -
       On AP  - Add the AP itself in an "STA context"
       On STA - Add the AP to which this STA is joining in an "STA context" */
     tConfigStaParams staContext;
+} tConfigBssParams, * tpConfigBssParams;
+
+
+/*--------------------------------------------------------------------------
+ * WLAN_HAL_CONFIG_BSS_REQ
+ *--------------------------------------------------------------------------*/
+typedef PACKED_PRE struct PACKED_POST
+{
+    /* BSSID */
+    tSirMacAddr bssId;
+
+#ifdef HAL_SELF_STA_PER_BSS
+    /* Self Mac Address */
+    tSirMacAddr  selfMacAddr;
+#endif
+
+    /* BSS type */
+    tSirBssType bssType;
+
+    /*Operational Mode: AP =0, STA = 1*/
+    tANI_U8 operMode;
+
+    /*Network Type*/
+    tSirNwType nwType;
+
+    /*Used to classify PURE_11G/11G_MIXED to program MTU*/
+    tANI_U8 shortSlotTimeSupported;
+
+    /*Co-exist with 11a STA*/
+    tANI_U8 llaCoexist;
+
+    /*Co-exist with 11b STA*/
+    tANI_U8 llbCoexist;
+
+    /*Co-exist with 11g STA*/
+    tANI_U8 llgCoexist;
+
+    /*Coexistence with 11n STA*/
+    tANI_U8 ht20Coexist;
+
+    /*Non GF coexist flag*/
+    tANI_U8 llnNonGFCoexist;
+
+    /*TXOP protection support*/
+    tANI_U8 fLsigTXOPProtectionFullSupport;
+    /*RIFS mode*/
+    tANI_U8 fRIFSMode;
+
+    /*Beacon Interval in TU*/
+    tSirMacBeaconInterval beaconInterval;
+
+    /*DTIM period*/
+    tANI_U8 dtimPeriod;
+
+    /*TX Width Set: 0 - 20 MHz only, 1 - 20/40 MHz*/
+    tANI_U8 txChannelWidthSet;
+
+    /*Operating channel*/
+    tANI_U8 currentOperChannel;
+
+    /*Extension channel for channel bonding*/
+    tANI_U8 currentExtChannel;
+
+    /*Reserved to align next field on a dword boundary*/
+    tANI_U8 reserved;
 
     /*SSID of the BSS*/
     tSirMacSSid ssId;
@@ -1520,14 +1836,14 @@
     /* To Enable Disable FW Proxy Probe Resp */
     tANI_U8   bProxyProbeRespEn;
 
-    /* Boolean to indicate if EDCA params are valid. UMAC might not have valid 
-       EDCA params or might not desire to apply EDCA params during config BSS. 
+    /* Boolean to indicate if EDCA params are valid. UMAC might not have valid
+       EDCA params or might not desire to apply EDCA params during config BSS.
        0 implies Not Valid ; Non-Zero implies valid*/
     tANI_U8   edcaParamsValid;
 
     /*EDCA Parameters for Best Effort Access Category*/
     tSirMacEdcaParamRecord acbe;
-    
+
     /*EDCA Parameters forBackground Access Category*/
     tSirMacEdcaParamRecord acbk;
 
@@ -1542,22 +1858,32 @@
     tSetStaKeyParams extSetStaKeyParam;  //SetStaKeyParams for ext bss msg
 #endif
 
-    /* Persona for the BSS can be STA,AP,GO,CLIENT value same as tHalConMode */    
+    /* Persona for the BSS can be STA,AP,GO,CLIENT value same as tHalConMode */
     tANI_U8   halPersona;
-   
+
     tANI_U8 bSpectrumMgtEnable;
 
     /*HAL fills in the tx power used for mgmt frames in txMgmtPower*/
     tANI_S8     txMgmtPower;
     /*maxTxPower has max power to be used after applying the power constraint if any */
     tANI_S8     maxTxPower;
-  
-} tConfigBssParams, * tpConfigBssParams;
+    /*Context of the station being added in HW
+      Add a STA entry for "itself" -
+      On AP  - Add the AP itself in an "STA context"
+      On STA - Add the AP to which this STA is joining in an "STA context" */
+    tConfigStaParams_V1 staContext;
+
+    tANI_U8   vhtCapable;
+    tANI_U8   vhtTxChannelWidthSet;
+} tConfigBssParams_V1, * tpConfigBssParams_V1;
 
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader header;
+   PACKED_PRE union PACKED_POST {
    tConfigBssParams configBssParams;
+    tConfigBssParams_V1 configBssParams_V1;
+   }uBssParams;
 }  tConfigBssReqMsg, *tpConfigBssReqMsg;
 
 /*---------------------------------------------------------------------------
@@ -1657,19 +1983,19 @@
 typedef PACKED_PRE struct PACKED_POST
 {
   /*Indicates the BSSID to which STA is going to associate*/
-  tSirMacAddr     bssId; 
+  tSirMacAddr     bssId;
 
   /*Indicates the channel to switch to.*/
   tANI_U8         ucChannel;
 
   /* Self STA MAC */
   tSirMacAddr selfStaMacAddr;
-     
+
   /*Local power constraint*/
   tANI_U8         ucLocalPowerConstraint;
 
   /*Secondary channel offset */
-  tSirMacHTSecondaryChannelOffset  secondaryChannelOffset;
+  ePhyChanBondState  secondaryChannelOffset;
 
   /*link State*/
   tSirLinkState   linkState;
@@ -1757,7 +2083,7 @@
 
     /*Array of keys.*/
     tSirKeys        key[SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS];
-  
+
     /*Control for Replay Count, 1= Single TID based replay count on Tx
     0 = Per TID based replay count on TX */
     tANI_U8         singleTidRc;
@@ -1829,7 +2155,7 @@
 {
     /*BSS Index of the BSS*/
     tANI_U8         bssIdx;
-    
+
     /*Encryption Type used with peer*/
     tAniEdType      encType;
 
@@ -1907,7 +2233,48 @@
    tRemoveStaKeyRspParams removeStaKeyRspParams;
 }  tRemoveStaKeyRspMsg, *tpRemoveStaKeyRspMsg;
 
+#ifdef FEATURE_OEM_DATA_SUPPORT
 
+#ifndef OEM_DATA_REQ_SIZE
+#define OEM_DATA_REQ_SIZE 70
+#endif
+
+#ifndef OEM_DATA_RSP_SIZE
+#define OEM_DATA_RSP_SIZE 968
+#endif
+
+/*-------------------------------------------------------------------------
+WLAN_HAL_START_OEM_DATA_REQ
+--------------------------------------------------------------------------*/
+typedef PACKED_PRE struct PACKED_POST
+{
+    tANI_U32                 status;
+    tSirMacAddr              selfMacAddr;
+    tANI_U8                 oemDataReq[OEM_DATA_REQ_SIZE];
+} tStartOemDataReqParams, *tpStartOemDataReqParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+    tHalMsgHeader                header;
+    tStartOemDataReqParams  startOemDataReqParams;
+} tStartOemDataReqMsg, *tpStartOemDataReqMsg;
+
+/*-------------------------------------------------------------------------
+WLAN_HAL_START_OEM_DATA_RSP
+--------------------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+   tANI_U8                   oemDataRsp[OEM_DATA_RSP_SIZE];
+} tStartOemDataRspParams, *tpStartOemDataRspParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+   tHalMsgHeader             header;
+   tStartOemDataRspParams    startOemDataRspParams;
+} tStartOemDataRspMsg, *tpStartOemDataRspMsg;
+
+#endif
 
 
 
@@ -1924,14 +2291,14 @@
     tANI_U8 localPowerConstraint;
 
     /*Secondary channel offset */
-    tSirMacHTSecondaryChannelOffset secondaryChannelOffset;
+    ePhyChanBondState secondaryChannelOffset;
 
     //HAL fills in the tx power used for mgmt frames in this field.
     tPowerdBm txMgmtPower;
 
     /* Max TX power */
     tPowerdBm maxTxPower;
-    
+
     /* Self STA MAC */
     tSirMacAddr selfStaMacAddr;
 
@@ -1943,7 +2310,7 @@
      * by way of ignoring if using new host/old FW or old host/new FW since it is at the end of this struct
      */
     tSirMacAddr bssId;
-   
+
 }tSwitchChannelParams, *tpSwitchChannelParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -1969,7 +2336,7 @@
 
     /* BSSID needed to identify session - same as in request*/
     tSirMacAddr bssId;
-    
+
 }tSwitchChannelRspParams, *tpSwitchChannelRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -1988,11 +2355,11 @@
    tANI_U16 bssIdx;
 
    /* Best Effort */
-   tSirMacEdcaParamRecord acbe; 
+   tSirMacEdcaParamRecord acbe;
 
    /* Background */
    tSirMacEdcaParamRecord acbk;
-   
+
    /* Video */
    tSirMacEdcaParamRecord acvi;
 
@@ -2035,10 +2402,10 @@
 
     /* Encryption mode */
     tANI_U8 encMode;
-    
+
     /* status */
     tANI_U32  status;
-    
+
     /* Statistics */
     tANI_U32  sendBlocks;
     tANI_U32  recvBlocks;
@@ -2076,20 +2443,20 @@
     tANI_U32 multiple_retry_cnt[4]; //The number of MSDU packets and MMPDU frames per AC that the 802.11
                                     // station successfully transmitted after more than one retransmission attempt
 
-    tANI_U32 tx_frm_cnt[4];         //Total number of packets(per AC) that were successfully transmitted 
-                                    //(with and without retries, including multi-cast, broadcast)     
-    tANI_U32 rx_frm_cnt;            //Total number of packets that were successfully received 
-                                    //(after appropriate filter rules including multi-cast, broadcast)    
+    tANI_U32 tx_frm_cnt[4];         //Total number of packets(per AC) that were successfully transmitted
+                                    //(with and without retries, including multi-cast, broadcast)
+    tANI_U32 rx_frm_cnt;            //Total number of packets that were successfully received
+                                    //(after appropriate filter rules including multi-cast, broadcast)
     tANI_U32 frm_dup_cnt;           //Total number of duplicate frames received successfully
     tANI_U32 fail_cnt[4];           //Total number packets(per AC) failed to transmit
     tANI_U32 rts_fail_cnt;          //Total number of RTS/CTS sequence failures for transmission of a packet
     tANI_U32 ack_fail_cnt;          //Total number packets failed transmit because of no ACK from the remote entity
-    tANI_U32 rts_succ_cnt;          //Total number of RTS/CTS sequence success for transmission of a packet 
-    tANI_U32 rx_discard_cnt;        //The sum of the receive error count and dropped-receive-buffer error count. 
+    tANI_U32 rts_succ_cnt;          //Total number of RTS/CTS sequence success for transmission of a packet
+    tANI_U32 rx_discard_cnt;        //The sum of the receive error count and dropped-receive-buffer error count.
                                     //HAL will provide this as a sum of (FCS error) + (Fail get BD/PDU in HW)
     tANI_U32 rx_error_cnt;          //The receive error count. HAL will provide the RxP FCS error global counter.
-    tANI_U32 tx_byte_cnt;           //The sum of the transmit-directed byte count, transmit-multicast byte count 
-                                    //and transmit-broadcast byte count. HAL will sum TPE UC/MC/BCAST global counters 
+    tANI_U32 tx_byte_cnt;           //The sum of the transmit-directed byte count, transmit-multicast byte count
+                                    //and transmit-broadcast byte count. HAL will sum TPE UC/MC/BCAST global counters
                                     //to provide this.
 }tAniSummaryStatsInfo, *tpAniSummaryStatsInfo;
 
@@ -2107,50 +2474,50 @@
 
 typedef PACKED_PRE struct PACKED_POST
 {
-    tANI_U32 rx_frag_cnt;              //The number of MPDU frames received by the 802.11 station for MSDU packets 
+    tANI_U32 rx_frag_cnt;              //The number of MPDU frames received by the 802.11 station for MSDU packets
                                        //or MMPDU frames
-    tANI_U32 promiscuous_rx_frag_cnt;  //The number of MPDU frames received by the 802.11 station for MSDU packets 
+    tANI_U32 promiscuous_rx_frag_cnt;  //The number of MPDU frames received by the 802.11 station for MSDU packets
                                        //or MMPDU frames when a promiscuous packet filter was enabled
-    tANI_U32 rx_input_sensitivity;     //The receiver input sensitivity referenced to a FER of 8% at an MPDU length 
-                                       //of 1024 bytes at the antenna connector. Each element of the array shall correspond 
+    tANI_U32 rx_input_sensitivity;     //The receiver input sensitivity referenced to a FER of 8% at an MPDU length
+                                       //of 1024 bytes at the antenna connector. Each element of the array shall correspond
                                        //to a supported rate and the order shall be the same as the supporteRates parameter.
-    tANI_U32 max_pwr;                  //The maximum transmit power in dBm upto one decimal. 
-                                       //for eg: if it is 10.5dBm, the value would be 105 
-    tANI_U32 sync_fail_cnt;            //Number of times the receiver failed to synchronize with the incoming signal 
-                                       //after detecting the sync in the preamble of the transmitted PLCP protocol data unit. 
+    tANI_U32 max_pwr;                  //The maximum transmit power in dBm upto one decimal.
+                                       //for eg: if it is 10.5dBm, the value would be 105
+    tANI_U32 sync_fail_cnt;            //Number of times the receiver failed to synchronize with the incoming signal
+                                       //after detecting the sync in the preamble of the transmitted PLCP protocol data unit.
 
-    tANI_U32 tx_rate;                  //Legacy transmit rate, in units of 500 kbit/sec, for the most 
-                                       //recently transmitted frame    
+    tANI_U32 tx_rate;                  //Legacy transmit rate, in units of 500 kbit/sec, for the most
+                                       //recently transmitted frame
     tANI_U32  mcs_index;               //mcs index for HT20 and HT40 rates
-    tANI_U32  tx_rate_flags;           //to differentiate between HT20 and 
-                                       //HT40 rates;  short and long guard interval  
+    tANI_U32  tx_rate_flags;           //to differentiate between HT20 and
+                                       //HT40 rates;  short and long guard interval
 }tAniGlobalClassAStatsInfo, *tpAniGlobalClassAStatsInfo;
 
 typedef PACKED_PRE struct PACKED_POST
 {
-    tANI_U32 rx_wep_unencrypted_frm_cnt;  //The number of unencrypted received MPDU frames that the MAC layer discarded when 
-                                          //the IEEE 802.11 dot11ExcludeUnencrypted management information base (MIB) object 
+    tANI_U32 rx_wep_unencrypted_frm_cnt;  //The number of unencrypted received MPDU frames that the MAC layer discarded when
+                                          //the IEEE 802.11 dot11ExcludeUnencrypted management information base (MIB) object
                                           //is enabled
-    tANI_U32 rx_mic_fail_cnt;             //The number of received MSDU packets that that the 802.11 station discarded 
+    tANI_U32 rx_mic_fail_cnt;             //The number of received MSDU packets that that the 802.11 station discarded
                                           //because of MIC failures
-    tANI_U32 tkip_icv_err;                //The number of encrypted MPDU frames that the 802.11 station failed to decrypt 
+    tANI_U32 tkip_icv_err;                //The number of encrypted MPDU frames that the 802.11 station failed to decrypt
                                           //because of a TKIP ICV error
-    tANI_U32 aes_ccmp_format_err;         //The number of received MPDU frames that the 802.11 discarded because of an 
+    tANI_U32 aes_ccmp_format_err;         //The number of received MPDU frames that the 802.11 discarded because of an
                                           //invalid AES-CCMP format
-    tANI_U32 aes_ccmp_replay_cnt;         //The number of received MPDU frames that the 802.11 station discarded because of 
+    tANI_U32 aes_ccmp_replay_cnt;         //The number of received MPDU frames that the 802.11 station discarded because of
                                           //the AES-CCMP replay protection procedure
-    tANI_U32 aes_ccmp_decrpt_err;         //The number of received MPDU frames that the 802.11 station discarded because of 
+    tANI_U32 aes_ccmp_decrpt_err;         //The number of received MPDU frames that the 802.11 station discarded because of
                                           //errors detected by the AES-CCMP decryption algorithm
-    tANI_U32 wep_undecryptable_cnt;       //The number of encrypted MPDU frames received for which a WEP decryption key was 
+    tANI_U32 wep_undecryptable_cnt;       //The number of encrypted MPDU frames received for which a WEP decryption key was
                                           //not available on the 802.11 station
-    tANI_U32 wep_icv_err;                 //The number of encrypted MPDU frames that the 802.11 station failed to decrypt 
+    tANI_U32 wep_icv_err;                 //The number of encrypted MPDU frames that the 802.11 station failed to decrypt
                                           //because of a WEP ICV error
-    tANI_U32 rx_decrypt_succ_cnt;         //The number of received encrypted packets that the 802.11 station successfully 
+    tANI_U32 rx_decrypt_succ_cnt;         //The number of received encrypted packets that the 802.11 station successfully
                                           //decrypted
     tANI_U32 rx_decrypt_fail_cnt;         //The number of encrypted packets that the 802.11 station failed to decrypt
 
 }tAniGlobalSecurityStats, *tpAniGlobalSecurityStats;
-   
+
 typedef PACKED_PRE struct PACKED_POST
 {
     tAniGlobalSecurityStats ucStats;
@@ -2159,26 +2526,26 @@
 
 typedef PACKED_PRE struct PACKED_POST
 {
-    tANI_U32 rx_amsdu_cnt;             //This counter shall be incremented for a received A-MSDU frame with the stations 
-                                       //MAC address in the address 1 field or an A-MSDU frame with a group address in the 
+    tANI_U32 rx_amsdu_cnt;             //This counter shall be incremented for a received A-MSDU frame with the stations
+                                       //MAC address in the address 1 field or an A-MSDU frame with a group address in the
                                        //address 1 field
     tANI_U32 rx_ampdu_cnt;             //This counter shall be incremented when the MAC receives an AMPDU from the PHY
-    tANI_U32 tx_20_frm_cnt;            //This counter shall be incremented when a Frame is transmitted only on the 
+    tANI_U32 tx_20_frm_cnt;            //This counter shall be incremented when a Frame is transmitted only on the
                                        //primary channel
     tANI_U32 rx_20_frm_cnt;            //This counter shall be incremented when a Frame is received only on the primary channel
-    tANI_U32 rx_mpdu_in_ampdu_cnt;     //This counter shall be incremented by the number of MPDUs received in the A-MPDU 
+    tANI_U32 rx_mpdu_in_ampdu_cnt;     //This counter shall be incremented by the number of MPDUs received in the A-MPDU
                                        //when an A-MPDU is received
-    tANI_U32 ampdu_delimiter_crc_err;  //This counter shall be incremented when an MPDU delimiter has a CRC error when this 
-                                       //is the first CRC error in the received AMPDU or when the previous delimiter has been 
+    tANI_U32 ampdu_delimiter_crc_err;  //This counter shall be incremented when an MPDU delimiter has a CRC error when this
+                                       //is the first CRC error in the received AMPDU or when the previous delimiter has been
                                        //decoded correctly
 }tAniGlobalClassCStatsInfo, *tpAniGlobalClassCStatsInfo;
 
 typedef PACKED_PRE struct PACKED_POST
 {
-    tANI_U32 tx_frag_cnt[4];        //The number of MPDU frames that the 802.11 station transmitted and acknowledged 
+    tANI_U32 tx_frag_cnt[4];        //The number of MPDU frames that the 802.11 station transmitted and acknowledged
                                     //through a received 802.11 ACK frame
-    tANI_U32 tx_ampdu_cnt;          //This counter shall be incremented when an A-MPDU is transmitted 
-    tANI_U32 tx_mpdu_in_ampdu_cnt;  //This counter shall increment by the number of MPDUs in the AMPDU when an A-MPDU 
+    tANI_U32 tx_ampdu_cnt;          //This counter shall be incremented when an A-MPDU is transmitted
+    tANI_U32 tx_mpdu_in_ampdu_cnt;  //This counter shall increment by the number of MPDUs in the AMPDU when an A-MPDU
                                     //is transmitted
 }tAniPerStaStatsInfo, *tpAniPerStaStatsInfo;
 
@@ -2197,7 +2564,7 @@
    tANI_U16 msgType;
 
    /* length of the entire request, includes the pStatsBuf length too */
-   tANI_U16 msgLen;  
+   tANI_U16 msgLen;
 
 } tHalStatsRspParams, *tpHalStatsRspParams;
 
@@ -2331,7 +2698,7 @@
     tANI_U32 srvInterval[WLAN_HAL_MAX_AC];   // Service Interval
     tANI_U32 susInterval[WLAN_HAL_MAX_AC];   // Suspend Interval
     tANI_U32 delayInterval[WLAN_HAL_MAX_AC]; // Delay Interval
-           
+
 } tAddTsParams, *tpAddTsParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -2370,14 +2737,14 @@
     tANI_U16 tspecIdx;
 
     /* To lookup station id using the mac address */
-    tSirMacAddr bssId; 
+    tSirMacAddr bssId;
 
 } tDelTsParams, *tpDelTsParams;
 
 typedef PACKED_PRE struct PACKED_POST
 {
     tHalMsgHeader header;
-    tDelTsParams  delTsParams; 
+    tDelTsParams  delTsParams;
 }  tDelTsReqMsg, *tpDelTsReqMsg;
 
 /*---------------------------------------------------------------------------
@@ -2449,7 +2816,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     tHalMsgHeader header;
-    tAddBASessionParams  addBASessionParams; 
+    tAddBASessionParams  addBASessionParams;
 }tAddBASessionReqMsg, *tpAddBASessionReqMsg;
 
 /*---------------------------------------------------------------------------
@@ -2474,10 +2841,10 @@
 
     /* Reordering Window buffer */
     tANI_U8 winSize;
-    
+
     /*Station Index to id the sta */
     tANI_U8 STAID;
-    
+
     /* Starting Sequence Number */
     tANI_U16 SSN;
 } tAddBASessionRspParams, *tpAddBASessionRspParams;
@@ -2508,7 +2875,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     tHalMsgHeader header;
-    tAddBAParams  addBAParams; 
+    tAddBAParams  addBAParams;
 }  tAddBAReqMsg, *tpAddBAReqMsg;
 
 
@@ -2523,7 +2890,7 @@
 
     /* Dialog token */
     tANI_U8 baDialogToken;
- 
+
 } tAddBARspParams, *tpAddBARspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -2562,17 +2929,17 @@
     /* Session Id */
     tANI_U8 baSessionID;
 
-    /* baCandidateCnt is followed by trigger BA 
+    /* baCandidateCnt is followed by trigger BA
      * Candidate List(tTriggerBaCandidate)
      */
     tANI_U16 baCandidateCnt;
-    
+
 } tTriggerBAParams, *tpTriggerBAParams;
 
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader header;
-   tTriggerBAParams  triggerBAParams; 
+   tTriggerBAParams  triggerBAParams;
 }  tTriggerBAReqMsg, *tpTriggerBAReqMsg;
 
 
@@ -2582,18 +2949,18 @@
 
 typedef PACKED_PRE struct PACKED_POST
 {
-   
+
     /* TO SUPPORT BT-AMP */
-    tSirMacAddr  bssId; 
+    tSirMacAddr  bssId;
 
     /* success or failure */
     tANI_U32   status;
 
-    /* baCandidateCnt is followed by trigger BA 
+    /* baCandidateCnt is followed by trigger BA
      * Rsp Candidate List(tTriggerRspBaCandidate)
      */
     tANI_U16 baCandidateCnt;
-    
+
 
 } tTriggerBARspParams, *tpTriggerBARspParams;
 
@@ -2618,13 +2985,13 @@
     /* DELBA direction
        1 - Originator
        0 - Recipient */
-    tANI_U8 baDirection;  
+    tANI_U8 baDirection;
 } tDelBAParams, *tpDelBAParams;
 
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader header;
-   tDelBAParams  delBAParams; 
+   tDelBAParams  delBAParams;
 }  tDelBAReqMsg, *tpDelBAReqMsg;
 
 /*---------------------------------------------------------------------------
@@ -2660,7 +3027,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     tHalMsgHeader header;
-    tTsmStatsParams  tsmStatsParams; 
+    tTsmStatsParams  tsmStatsParams;
 }  tTsmStatsReqMsg, *tpTsmStatsReqMsg;
 
 
@@ -2672,25 +3039,25 @@
     /*success or failure */
     tANI_U32   status;
 
-    /* Uplink Packet Queue delay */ 
+    /* Uplink Packet Queue delay */
     tANI_U16      UplinkPktQueueDly;
 
-    /* Uplink Packet Queue delay histogram */ 
+    /* Uplink Packet Queue delay histogram */
     tANI_U16      UplinkPktQueueDlyHist[4];
 
-    /* Uplink Packet Transmit delay */ 
+    /* Uplink Packet Transmit delay */
     tANI_U32      UplinkPktTxDly;
 
-    /* Uplink Packet loss */ 
+    /* Uplink Packet loss */
     tANI_U16      UplinkPktLoss;
 
-    /* Uplink Packet count */ 
+    /* Uplink Packet count */
     tANI_U16      UplinkPktCount;
 
-    /* Roaming count */ 
+    /* Roaming count */
     tANI_U8       RoamingCount;
 
-    /* Roaming Delay */ 
+    /* Roaming Delay */
     tANI_U16      RoamingDly;
 } tTsmStatsRspParams, *tpTsmStatsRspParams;
 
@@ -2727,14 +3094,14 @@
 {
     /* Fragment sequence number of the NV Image. Note that NV Image might not
      * fit into one message due to size limitation of the SMD channel FIFO. UMAC
-     * can hence choose to chop the NV blob into multiple fragments starting with 
-     * seqeunce number 0, 1, 2 etc. The last fragment MUST be indicated by 
+     * can hence choose to chop the NV blob into multiple fragments starting with
+     * seqeunce number 0, 1, 2 etc. The last fragment MUST be indicated by
      * marking the isLastFragment field to 1. Note that all the NV blobs would be
      * concatenated together by HAL without any padding bytes in between.*/
     tANI_U16 fragNumber;
 
     /* Is this the last fragment? When set to 1 it indicates that no more fragments
-     * will be sent by UMAC and HAL can concatenate all the NV blobs rcvd & proceed 
+     * will be sent by UMAC and HAL can concatenate all the NV blobs rcvd & proceed
      * with the parsing. HAL would generate a WLAN_HAL_DOWNLOAD_NV_RSP to the
      * WLAN_HAL_DOWNLOAD_NV_REQ after it receives each fragment */
     tANI_U16 isLastFragment;
@@ -2781,7 +3148,7 @@
     /* Size of NV Blob */
     tANI_U32 nvBlobSize;
 
-    /* Following the 'nvBlobSize', there should be nvBlobSize bytes of 
+    /* Following the 'nvBlobSize', there should be nvBlobSize bytes of
      * NV blob i.e. uint8[nvBlobSize] */
 } tHalNvStoreParams, *tpHalNvStoreParams;
 
@@ -2803,10 +3170,10 @@
 
 typedef PACKED_PRE struct PACKED_POST
 {
-    tSirMacAddr  srcMacAddr;     //address used to compute MIC 
+    tSirMacAddr  srcMacAddr;     //address used to compute MIC
     tSirMacAddr  taMacAddr;      //transmitter address
     tSirMacAddr  dstMacAddr;
-    tANI_U8      multicast;             
+    tANI_U8      multicast;
     tANI_U8      IV1;            // first byte of IV
     tANI_U8      keyId;          // second byte of IV
     tANI_U8      TSC[SIR_CIPHER_SEQ_CTR_SIZE]; // sequence number
@@ -2919,7 +3286,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     tSirMacAddr BSSID;
-    tANI_U8   channel; 
+    tANI_U8   channel;
 }tSirEnableRadarInfoType, *tptSirEnableRadarInfoType;
 
 
@@ -2932,7 +3299,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     tHalMsgHeader header;
-    tEnableRadarReqParams  enableRadarReqParams; 
+    tEnableRadarReqParams  enableRadarReqParams;
 }tEnableRadarReqMsg, *tpEnableRadarReqMsg;
 
 /*---------------------------------------------------------------------------
@@ -2950,7 +3317,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     tHalMsgHeader header;
-    tEnableRadarRspParams  enableRadarRspParams; 
+    tEnableRadarRspParams  enableRadarRspParams;
 }tEnableRadarRspMsg, *tpEnableRadarRspMsg;
 
 /*---------------------------------------------------------------------------
@@ -2965,7 +3332,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     tHalMsgHeader header;
-    tRadarDetectIntrIndParams  radarDetectIntrIndParams; 
+    tRadarDetectIntrIndParams  radarDetectIntrIndParams;
 }tRadarDetectIntrIndMsg, *tptRadarDetectIntrIndMsg;
 
 /*---------------------------------------------------------------------------
@@ -2986,7 +3353,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader header;
-   tRadarDetectIndParams  radarDetectIndParams; 
+   tRadarDetectIndParams  radarDetectIndParams;
 }tRadarDetectIndMsg, *tptRadarDetectIndMsg;
 
 
@@ -3004,7 +3371,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader header;
-   tSirGetTpcReportReqParams  getTpcReportReqParams; 
+   tSirGetTpcReportReqParams  getTpcReportReqParams;
 }tSirGetTpcReportReqMsg, *tpSirGetTpcReportReqMsg;
 
 /*---------------------------------------------------------------------------
@@ -3020,7 +3387,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     tHalMsgHeader header;
-    tSirGetTpcReportRspParams  getTpcReportRspParams; 
+    tSirGetTpcReportRspParams  getTpcReportRspParams;
 }tSirGetTpcReportRspMsg, *tpSirGetTpcReportRspMsg;
 
 #endif
@@ -3045,7 +3412,7 @@
 }tSendProbeRespReqMsg, *tpSendProbeRespReqMsg;
 
 /*---------------------------------------------------------------------------
- *WLAN_HAL_UPDATE_PROBE_RSP_TEMPLATE_RSP 
+ *WLAN_HAL_UPDATE_PROBE_RSP_TEMPLATE_RSP
  *--------------------------------------------------------------------------*/
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3062,7 +3429,7 @@
 
 
 /*---------------------------------------------------------------------------
- *WLAN_HAL_UNKNOWN_ADDR2_FRAME_RX_IND 
+ *WLAN_HAL_UNKNOWN_ADDR2_FRAME_RX_IND
  *--------------------------------------------------------------------------*/
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3089,7 +3456,7 @@
                        // HAL copies bssid from the sta table.
 #ifdef WLAN_SOFTAP_FEATURE
     tSirMacAddr addr2;        //
-    tANI_U16    reasonCode;   // To unify the keepalive / unknown A2 / tim-based disa                                                                        
+    tANI_U16    reasonCode;   // To unify the keepalive / unknown A2 / tim-based disa
 #endif
 
 }tDeleteStaContextParams, *tpDeleteStaContextParams;
@@ -3233,6 +3600,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
    tANI_U8     sendDataNull;
+   tANI_U8     bssIdx;
 } tHalExitBmpsReqParams, *tpHalExitBmpsReqParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3253,7 +3621,7 @@
     tANI_U8     ref;
 } tEidByteInfo, *tpEidByteInfo;
 
-typedef PACKED_PRE struct PACKED_POST 
+typedef PACKED_PRE struct PACKED_POST
 {
     tANI_U16    capabilityInfo;
     tANI_U16    capabilityMask;
@@ -3278,7 +3646,7 @@
 /*---------------------------------------------------------------------------
  * WLAN_HAL_REM_BCN_FILTER_REQ
  *--------------------------------------------------------------------------*/
-typedef PACKED_PRE struct PACKED_POST 
+typedef PACKED_PRE struct PACKED_POST
 {
     tANI_U8  ucIeCount;
     tANI_U8  ucRemIeId[1];
@@ -3316,6 +3684,7 @@
    tANI_U8 targetIPv6Addr2Valid : 1;
    tANI_U8 reserved1 : 5;
    tANI_U8 reserved2;   //make it DWORD aligned
+   tANI_U8 bssIdx;
 } tHalNSOffloadParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3352,9 +3721,10 @@
 {
     tANI_U8          packetType;
     tANI_U32         timePeriod;
-    tHalIpv4Addr     hostIpv4Addr; 
+    tHalIpv4Addr     hostIpv4Addr;
     tHalIpv4Addr     destIpv4Addr;
     tSirMacAddr      destMacAddr;
+    tANI_U8          bssIdx;
 } tHalKeepAliveReq, *tpHalKeepAliveReq;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3379,7 +3749,7 @@
     tANI_U8   bRssiThres3NegNotify : 1;
     tANI_U8   bReserved10          : 2;
 } tHalRSSIThresholds, *tpHalRSSIThresholds;
-    
+
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader header;
@@ -3399,6 +3769,7 @@
     tANI_U8     beTriggerEnabled:1;
     tANI_U8     viTriggerEnabled:1;
     tANI_U8     voTriggerEnabled:1;
+    tANI_U8     bssIdx;
 } tUapsdReqParams, *tpUapsdReqParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3413,6 +3784,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader header;
+   tANI_U8       bssIdx;
 }  tHalExitUapsdReqMsg, *tpHalExitUapsdReqMsg;
 
 /*---------------------------------------------------------------------------
@@ -3426,13 +3798,14 @@
     tANI_U8  ucPatternId;           // Pattern ID
     // Pattern byte offset from beginning of the 802.11 packet to start of the
     // wake-up pattern
-    tANI_U8  ucPatternByteOffset;   
+    tANI_U8  ucPatternByteOffset;
     tANI_U8  ucPatternSize;         // Non-Zero Pattern size
     tANI_U8  ucPattern[HAL_WOWL_BCAST_PATTERN_MAX_SIZE]; // Pattern
     tANI_U8  ucPatternMaskSize;     // Non-zero pattern mask size
     tANI_U8  ucPatternMask[HAL_WOWL_BCAST_PATTERN_MAX_SIZE]; // Pattern mask
     tANI_U8  ucPatternExt[HAL_WOWL_BCAST_PATTERN_MAX_SIZE]; // Extra pattern
     tANI_U8  ucPatternMaskExt[HAL_WOWL_BCAST_PATTERN_MAX_SIZE]; // Extra pattern mask
+    tANI_U8  bssIdx;
 } tHalWowlAddBcastPtrn, *tpHalWowlAddBcastPtrn;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3441,6 +3814,8 @@
    tHalWowlAddBcastPtrn ptrnParams;
 }  tHalWowlAddBcastPtrnReqMsg, *tpHalWowlAddBcastPtrnReqMsg;
 
+
+
 /*---------------------------------------------------------------------------
  * WLAN_HAL_DEL_WOWL_BCAST_PTRN
  *--------------------------------------------------------------------------*/
@@ -3448,6 +3823,7 @@
 {
     /* Pattern ID of the wakeup pattern to be deleted */
     tANI_U8  ucPatternId;
+    tANI_U8  bssIdx;
 } tHalWowlDelBcastPtrn, *tpHalWowlDelBcastPtrn;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3462,59 +3838,59 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     /* Enables/disables magic packet filtering */
-    tANI_U8   ucMagicPktEnable; 
+    tANI_U8   ucMagicPktEnable;
 
     /* Magic pattern */
     tSirMacAddr magicPtrn;
 
-    /* Enables/disables packet pattern filtering in firmware. 
-       Enabling this flag enables broadcast pattern matching 
-       in Firmware. If unicast pattern matching is also desired,  
-       ucUcastPatternFilteringEnable flag must be set tot true 
-       as well 
+    /* Enables/disables packet pattern filtering in firmware.
+       Enabling this flag enables broadcast pattern matching
+       in Firmware. If unicast pattern matching is also desired,
+       ucUcastPatternFilteringEnable flag must be set tot true
+       as well
     */
     tANI_U8   ucPatternFilteringEnable;
 
-    /* Enables/disables unicast packet pattern filtering. 
-       This flag specifies whether we want to do pattern match 
-       on unicast packets as well and not just broadcast packets. 
-       This flag has no effect if the ucPatternFilteringEnable 
+    /* Enables/disables unicast packet pattern filtering.
+       This flag specifies whether we want to do pattern match
+       on unicast packets as well and not just broadcast packets.
+       This flag has no effect if the ucPatternFilteringEnable
        (main controlling flag) is set to false
     */
-    tANI_U8   ucUcastPatternFilteringEnable;                     
+    tANI_U8   ucUcastPatternFilteringEnable;
 
-    /* This configuration is valid only when magicPktEnable=1. 
-     * It requests hardware to wake up when it receives the 
+    /* This configuration is valid only when magicPktEnable=1.
+     * It requests hardware to wake up when it receives the
      * Channel Switch Action Frame.
      */
     tANI_U8   ucWowChnlSwitchRcv;
 
-    /* This configuration is valid only when magicPktEnable=1. 
-     * It requests hardware to wake up when it receives the 
-     * Deauthentication Frame. 
+    /* This configuration is valid only when magicPktEnable=1.
+     * It requests hardware to wake up when it receives the
+     * Deauthentication Frame.
      */
     tANI_U8   ucWowDeauthRcv;
 
-    /* This configuration is valid only when magicPktEnable=1. 
-     * It requests hardware to wake up when it receives the 
-     * Disassociation Frame. 
+    /* This configuration is valid only when magicPktEnable=1.
+     * It requests hardware to wake up when it receives the
+     * Disassociation Frame.
      */
     tANI_U8   ucWowDisassocRcv;
 
-    /* This configuration is valid only when magicPktEnable=1. 
+    /* This configuration is valid only when magicPktEnable=1.
      * It requests hardware to wake up when it has missed
      * consecutive beacons. This is a hardware register
-     * configuration (NOT a firmware configuration). 
+     * configuration (NOT a firmware configuration).
      */
     tANI_U8   ucWowMaxMissedBeacons;
 
-    /* This configuration is valid only when magicPktEnable=1. 
+    /* This configuration is valid only when magicPktEnable=1.
      * This is a timeout value in units of microsec. It requests
      * hardware to unconditionally wake up after it has stayed
-     * in WoWLAN mode for some time. Set 0 to disable this feature.      
+     * in WoWLAN mode for some time. Set 0 to disable this feature.
      */
     tANI_U8   ucWowMaxSleepUsec;
-    
+
     /* This configuration directs the WoW packet filtering to look for EAP-ID
      * requests embedded in EAPOL frames and use this as a wake source.
      */
@@ -3537,6 +3913,8 @@
      */
     tANI_U8   ucWoWBSSConnLoss;
 
+    tANI_U8   bssIdx;
+
 } tHalWowlEnterParams, *tpHalWowlEnterParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3548,9 +3926,17 @@
 /*---------------------------------------------------------------------------
  * WLAN_HAL_EXIT_WOWL_REQ
  *--------------------------------------------------------------------------*/
+
 typedef PACKED_PRE struct PACKED_POST
 {
-   tHalMsgHeader header;
+    tANI_U8   bssIdx;
+
+} tHalWowlExitParams, *tpHalWowlExitParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+   tHalMsgHeader     header;
+   tHalWowlExitParams exitWowlParams;
 }  tHalWowlExitReqMsg, *tpHalWowlExitReqMsg;
 
 /*---------------------------------------------------------------------------
@@ -3630,6 +4016,7 @@
 {
     /* success or failure */
     tANI_U32   status;
+    tANI_U8    bssIdx;
 } tHalEnterBmpsRspParams, *tpHalEnterBmpsRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3645,6 +4032,7 @@
 {
     /* success or failure */
     tANI_U32   status;
+    tANI_U8    bssIdx;
 } tHalExitBmpsRspParams, *tpHalExitBmpsRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3660,6 +4048,7 @@
 {
     /* success or failure */
     tANI_U32    status;
+    tANI_U8     bssIdx;
 }tUapsdRspParams, *tpUapsdRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3675,6 +4064,7 @@
 {
     /* success or failure */
     tANI_U32   status;
+    tANI_U8    bssIdx;
 } tHalExitUapsdRspParams, *tpHalExitUapsdRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3725,7 +4115,8 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     /* success or failure */
-    tANI_U32   status;
+   tANI_U32   status;
+   tANI_U8    bssIdx;
 } tHalEnterWowlRspParams, *tpHalEnterWowlRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3740,7 +4131,8 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     /* success or failure */
-    tANI_U32   status;
+   tANI_U32   status;
+   tANI_U8    bssIdx;
 } tHalExitWowlRspParams, *tpHalExitWowlRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3785,7 +4177,8 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     /* success or failure */
-    tANI_U32   status;
+   tANI_U32   status;
+   tANI_U8    bssIdx;
 } tHalAddWowlBcastPtrnRspParams, *tpHalAddWowlBcastPtrnRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3800,7 +4193,8 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     /* success or failure */
-    tANI_U32   status;
+   tANI_U32   status;
+   tANI_U8    bssIdx;
 } tHalDelWowlBcastPtrnRspParams, *tpHalDelWowlBcastPtrnRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -3933,6 +4327,7 @@
 {
     /* TX Power in milli watts */
     tANI_U32  txPower;
+    tANI_U8   bssIdx;
 }tSetTxPwrReqParams, *tpSetTxPwrReqParams;
 
 
@@ -4001,7 +4396,7 @@
 {
   tANI_U8   opp_ps;
   tANI_U32  ctWindow;
-  tANI_U8   count; 
+  tANI_U8   count;
   tANI_U32  duration;
   tANI_U32  interval;
   tANI_U32  single_noa_duration;
@@ -4066,7 +4461,7 @@
 
    /* DPU Signature */
    tANI_U8 dpuSignature;
-   
+
 }tAddStaSelfRspParams, *tpAddStaSelfRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -4229,7 +4624,7 @@
     tANI_U32   rspLength;
     /*FiXME: Currently considering the  the responce will be less than 100bytes */
     tANI_U8    rspBuffer[DUMPCMD_RSP_BUFFER];
-    
+
 } tHalDumpCmdRspParams, *tpHalDumpCmdRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -4257,7 +4652,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader   header;
-   tCoexIndParams  coexIndParams; 
+   tCoexIndParams  coexIndParams;
 }tCoexIndMsg, *tpCoexIndMsg;
 
 /*---------------------------------------------------------------------------
@@ -4273,7 +4668,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader   header;
-   tTxComplParams  txComplParams; 
+   tTxComplParams  txComplParams;
 }tTxComplIndMsg, *tpTxComplIndMsg;
 
 /*---------------------------------------------------------------------------
@@ -4283,7 +4678,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     tANI_U32 configuredMcstBcstFilterSetting;
-    tANI_U32 activeSessionCount; 
+    tANI_U32 activeSessionCount;
 }tHalWlanHostSuspendIndParam,*tpHalWlanHostSuspendIndParam;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -4299,7 +4694,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     tANI_BOOLEAN bDot11ExcludeUnencrypted;
-    tSirMacAddr bssId; 
+    tSirMacAddr bssId;
 }tHalWlanExcludeUnEncryptedIndParam,*tpHalWlanExcludeUnEncryptedIndParam;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -4337,7 +4732,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader      header;
-   tNoaAttrIndParams  noaAttrIndParams; 
+   tNoaAttrIndParams  noaAttrIndParams;
 }tNoaAttrIndMsg, *tpNoaAttrIndMsg;
 #endif
 
@@ -4386,7 +4781,7 @@
 /*Maximum size of the probe template*/
 #define WLAN_HAL_PNO_MAX_PROBE_SIZE     450
 
-/*Type of PNO enabling 
+/*Type of PNO enabling
   Immediate - scanning will start immediately and PNO procedure will
   be repeated based on timer
   Suspend - scanning will start at suspend
@@ -4400,22 +4795,22 @@
 } ePNOMode;
 
 /*Authentication type*/
-typedef enum 
+typedef enum
 {
-    eAUTH_TYPE_ANY                   = 0,    
+    eAUTH_TYPE_ANY                   = 0,
     eAUTH_TYPE_OPEN_SYSTEM           = 1,
-    
+
     // Upper layer authentication types
     eAUTH_TYPE_WPA                   = 2,
     eAUTH_TYPE_WPA_PSK               = 3,
-    
+
     eAUTH_TYPE_RSN                   = 4,
     eAUTH_TYPE_RSN_PSK               = 5,
     eAUTH_TYPE_FT_RSN                = 6,
     eAUTH_TYPE_FT_RSN_PSK            = 7,
     eAUTH_TYPE_WAPI_WAI_CERTIFICATE  = 8,
     eAUTH_TYPE_WAPI_WAI_PSK          = 9,
-    
+
     eAUTH_TYPE_MAX = WLAN_HAL_MAX_ENUM_SIZE
 
 }tAuthType;
@@ -4429,7 +4824,7 @@
     eED_TKIP          = 3,
     eED_CCMP          = 4,
     eED_WPI           = 5,
-        
+
     eED_TYPE_MAX = WLAN_HAL_MAX_ENUM_SIZE
 } tEdType;
 
@@ -4443,7 +4838,7 @@
   eBCAST_TYPE_MAX     = WLAN_HAL_MAX_ENUM_SIZE
 } tSSIDBcastType;
 
-/* 
+/*
   The network description for which PNO will have to look for
 */
 typedef PACKED_PRE struct PACKED_POST
@@ -4452,51 +4847,51 @@
   tSirMacSSid ssId;
 
   /*Authentication type for the network*/
-  tAuthType   authentication; 
+  tAuthType   authentication;
 
   /*Encryption type for the network*/
-  tEdType     encryption; 
+  tEdType     encryption;
 
-  /*Indicate the channel on which the Network can be found 
+  /*Indicate the channel on which the Network can be found
     0 - if all channels */
   tANI_U8     ucChannelCount;
   tANI_U8     aChannels[WLAN_HAL_PNO_MAX_NETW_CHANNELS];
 
   /*Indicates the RSSI threshold for the network to be considered*/
   tANI_U8     rssiThreshold;
-}tNetworkType; 
+}tNetworkType;
 
 typedef PACKED_PRE struct PACKED_POST
 {
   /*How much it should wait */
-  tANI_U32    uTimerValue; 
+  tANI_U32    uTimerValue;
 
-  /*How many times it should repeat that wait value 
+  /*How many times it should repeat that wait value
     0 - keep using this timer until PNO is disabled*/
-  tANI_U32    uTimerRepeat; 
+  tANI_U32    uTimerRepeat;
 
-  /*e.g:   2 3 
-           4 0 
+  /*e.g:   2 3
+           4 0
     - it will wait 2s between consecutive scans for 3 times
     - after that it will wait 4s between consecutive scans until disabled*/
-}tScanTimer; 
+}tScanTimer;
 
-/* 
+/*
   The network parameters to be sent to the PNO algorithm
 */
 typedef PACKED_PRE struct PACKED_POST
 {
   /*set to 0 if you wish for PNO to use its default telescopic timer*/
-  tANI_U8     ucScanTimersCount; 
+  tANI_U8     ucScanTimersCount;
 
-  /*A set value represents the amount of time that PNO will wait between 
+  /*A set value represents the amount of time that PNO will wait between
     two consecutive scan procedures
     If the desired is for a uniform timer that fires always at the exact same
     interval - one single value is to be set
     If there is a desire for a more complex - telescopic like timer multiple
     values can be set - once PNO reaches the end of the array it will
     continue scanning at intervals presented by the last value*/
-  tScanTimer  aTimerValues[WLAN_HAL_PNO_MAX_SCAN_TIMERS]; 
+  tScanTimer  aTimerValues[WLAN_HAL_PNO_MAX_SCAN_TIMERS];
 
 }tScanTimersType;
 
@@ -4507,7 +4902,7 @@
 
     /*Immediate,  On Suspend,   On Resume*/
     ePNOMode         modePNO;
-    
+
     /*Number of networks sent for PNO*/
     tANI_U32          ucNetworksCount;
 
@@ -4515,20 +4910,20 @@
     tNetworkType     aNetworks[WLAN_HAL_PNO_MAX_SUPP_NETWORKS];
 
     /*The scan timers required for PNO*/
-    tScanTimersType  scanTimers; 
+    tScanTimersType  scanTimers;
 
     /*Probe template for 2.4GHz band*/
-    tANI_U16         us24GProbeSize; 
+    tANI_U16         us24GProbeSize;
     tANI_U8          a24GProbeTemplate[WLAN_HAL_PNO_MAX_PROBE_SIZE];
 
     /*Probe template for 5GHz band*/
-    tANI_U16         us5GProbeSize; 
+    tANI_U16         us5GProbeSize;
     tANI_U8          a5GProbeTemplate[WLAN_HAL_PNO_MAX_PROBE_SIZE];
 
 } tPrefNetwListParams, * tpPrefNetwListParams;
 
 /*
-  Preferred network list request 
+  Preferred network list request
 */
 typedef PACKED_PRE struct PACKED_POST
 {
@@ -4537,7 +4932,7 @@
 }  tSetPrefNetwListReq, *tpSetPrefNetwListReq;
 
 
-/* 
+/*
   The network description for which PNO will have to look for
 */
 typedef PACKED_PRE struct PACKED_POST
@@ -4546,22 +4941,22 @@
   tSirMacSSid ssId;
 
   /*Authentication type for the network*/
-  tAuthType   authentication; 
+  tAuthType   authentication;
 
   /*Encryption type for the network*/
-  tEdType     encryption; 
+  tEdType     encryption;
 
   /*SSID broadcast type, normal, hidden or unknown*/
   tSSIDBcastType bcastNetworkType;
 
-  /*Indicate the channel on which the Network can be found 
+  /*Indicate the channel on which the Network can be found
     0 - if all channels */
   tANI_U8     ucChannelCount;
   tANI_U8     aChannels[WLAN_HAL_PNO_MAX_NETW_CHANNELS];
 
   /*Indicates the RSSI threshold for the network to be considered*/
   tANI_U8     rssiThreshold;
-}tNetworkTypeNew; 
+}tNetworkTypeNew;
 
 typedef PACKED_PRE struct PACKED_POST {
 
@@ -4570,22 +4965,22 @@
 
     /*Immediate,  On Suspend,   On Resume*/
     ePNOMode         modePNO;
-    
+
     /*Number of networks sent for PNO*/
-    tANI_U32         ucNetworksCount; 
+    tANI_U32         ucNetworksCount;
 
     /*The networks that PNO needs to look for*/
     tNetworkTypeNew  aNetworks[WLAN_HAL_PNO_MAX_SUPP_NETWORKS];
 
     /*The scan timers required for PNO*/
-    tScanTimersType  scanTimers; 
+    tScanTimersType  scanTimers;
 
     /*Probe template for 2.4GHz band*/
-    tANI_U16         us24GProbeSize; 
+    tANI_U16         us24GProbeSize;
     tANI_U8          a24GProbeTemplate[WLAN_HAL_PNO_MAX_PROBE_SIZE];
 
     /*Probe template for 5GHz band*/
-    tANI_U16         us5GProbeSize; 
+    tANI_U16         us5GProbeSize;
     tANI_U8          a5GProbeTemplate[WLAN_HAL_PNO_MAX_PROBE_SIZE];
 
 } tPrefNetwListParamsNew, * tpPrefNetwListParamsNew;
@@ -4600,25 +4995,25 @@
 }  tSetPrefNetwListReqNew, *tpSetPrefNetwListReqNew;
 
 /*
-  Preferred network list response 
+  Preferred network list response
 */
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader header;
 
-   /*status of the request - just to indicate that PNO has acknowledged 
+   /*status of the request - just to indicate that PNO has acknowledged
      the request and will start scanning*/
    tANI_U32   status;
 }  tSetPrefNetwListResp, *tpSetPrefNetwListResp;
 
 /*
-  Preferred network indication parameters 
+  Preferred network indication parameters
 */
 typedef PACKED_PRE struct PACKED_POST {
 
   /*Network that was found with the highest RSSI*/
   tSirMacSSid ssId;
-  
+
   /*Indicates the RSSI */
   tANI_U8     rssi;
 
@@ -4642,7 +5037,7 @@
 } tRssiFilterParams, * tpRssiFilterParams;
 
 /*
-  RSSI Filter request 
+  RSSI Filter request
 */
 typedef PACKED_PRE struct PACKED_POST
 {
@@ -4659,32 +5054,32 @@
    tANI_U32   status;
 }  tSetRssiFilterResp, *tpSetRssiFilterResp;
 /*
-  Update scan params 
+  Update scan params
 */
-typedef PACKED_PRE struct PACKED_POST  
+typedef PACKED_PRE struct PACKED_POST
 {
 
   /*Host setting for 11d*/
-  tANI_U8   b11dEnabled; 
+  tANI_U8   b11dEnabled;
 
   /*Lets PNO know that host has determined the regulatory domain*/
   tANI_U8   b11dResolved;
 
   /*Channels on which PNO is allowed to scan*/
-  tANI_U8   ucChannelCount; 
-  tANI_U8   aChannels[WLAN_HAL_PNO_MAX_NETW_CHANNELS]; 
+  tANI_U8   ucChannelCount;
+  tANI_U8   aChannels[WLAN_HAL_PNO_MAX_NETW_CHANNELS];
 
   /*Minimum channel time*/
-  tANI_U16  usActiveMinChTime; 
+  tANI_U16  usActiveMinChTime;
 
   /*Maximum channel time*/
-  tANI_U16  usActiveMaxChTime; 
+  tANI_U16  usActiveMaxChTime;
 
   /*Minimum channel time*/
-  tANI_U16  usPassiveMinChTime; 
+  tANI_U16  usPassiveMinChTime;
 
   /*Maximum channel time*/
-  tANI_U16  usPassiveMaxChTime; 
+  tANI_U16  usPassiveMaxChTime;
 
   /*Cb State*/
   ePhyChanBondState cbState;
@@ -4693,7 +5088,7 @@
 
 /*
   Update scan params - sent from host to PNO
-  to be used during PNO scanning 
+  to be used during PNO scanning
 */
 typedef PACKED_PRE struct PACKED_POST{
 
@@ -4703,7 +5098,7 @@
 
 /*
   Update scan params - sent from host to PNO
-  to be used during PNO scanning 
+  to be used during PNO scanning
 */
 typedef PACKED_PRE struct PACKED_POST{
 
@@ -4770,7 +5165,7 @@
   HAL_RCV_FILTER_TYPE_MAX_ENUM_SIZE
 }tHalReceivePacketFilterType;
 
-typedef enum 
+typedef enum
 {
   HAL_FILTER_PROTO_TYPE_INVALID,
   HAL_FILTER_PROTO_TYPE_MAC,
@@ -4781,7 +5176,7 @@
   HAL_FILTER_PROTO_TYPE_MAX
 }tHalRcvPktFltProtocolType;
 
-typedef enum 
+typedef enum
 {
   HAL_FILTER_CMP_TYPE_INVALID,
   HAL_FILTER_CMP_TYPE_EQUAL,
@@ -4790,7 +5185,7 @@
   HAL_FILTER_CMP_TYPE_MAX
 }tHalRcvPktFltCmpFlagType;
 
-typedef PACKED_PRE struct PACKED_POST 
+typedef PACKED_PRE struct PACKED_POST
 {
     tANI_U8                          protocolLayer;
     tANI_U8                          cmpFlag;
@@ -4805,29 +5200,40 @@
 {
     tANI_U8                         filterId;
     tANI_U8                         filterType;
-    tANI_U8                         numParams; 
-    tANI_U32                        coleasceTime; 
+    tANI_U8                         numParams;
+    tANI_U32                        coalesceTime;
     tHalRcvPktFilterParams          paramsData[1];
 }tHalRcvPktFilterCfgType, *tpHalRcvPktFilterCfgType;
 
 typedef PACKED_PRE struct PACKED_POST
 {
+    tANI_U8                         filterId;
+    tANI_U8                         filterType;
+    tANI_U8                         numParams;
+    tANI_U32                        coleasceTime;
+    tANI_U8                         bssIdx;
+    tHalRcvPktFilterParams          paramsData[1];
+}tHalSessionizedRcvPktFilterCfgType, *tpHalSessionizedRcvPktFilterCfgType;
+
+typedef PACKED_PRE struct PACKED_POST
+{
   tHalMsgHeader                 header;
   tHalRcvPktFilterCfgType       pktFilterCfg;
 } tHalSetRcvPktFilterReqMsg, *tpHalSetRcvPktFilterReqMsg;
 
-
-typedef PACKED_PRE struct PACKED_POST 
+typedef PACKED_PRE struct PACKED_POST
 {
     tANI_U8         dataOffset; /* from start of the respective frame header */
     tANI_U32       cMulticastAddr;
     tSirMacAddr    multicastAddr[HAL_MAX_NUM_MULTICAST_ADDRESS];
+    tANI_U8        bssIdx;
 } tHalRcvFltMcAddrListType, *tpHalRcvFltMcAddrListType;
 
 typedef PACKED_PRE struct PACKED_POST
 {
     /* success or failure */
     tANI_U32   status;
+    tANI_U8    bssIdx;
 } tHalSetPktFilterRspParams, *tpHalSetPktFilterRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -4836,12 +5242,18 @@
    tHalSetPktFilterRspParams   pktFilterRspParams;
 }  tHalSetPktFilterRspMsg, *tpHalSetPktFilterRspMsg;
 
+typedef PACKED_PRE struct PACKED_POST
+{
+   tANI_U8    bssIdx;
+} tHalRcvFltPktMatchCntReqParams, *tpHalRcvFltPktMatchCntReqParams;
 
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader        header;
+   tHalRcvFltPktMatchCntReqParams   pktMatchCntReqParams;
 } tHalRcvFltPktMatchCntReqMsg, *tpHalRcvFltPktMatchCntReqMsg;
 
+
 typedef PACKED_PRE struct PACKED_POST
 {
    tANI_U8    filterId;
@@ -4851,8 +5263,9 @@
 {
    /* Success or Failure */
    tANI_U32                 status;
-   tANI_U32                 matchCnt;   
-   tHalRcvFltPktMatchCnt    filterMatchCnt[HAL_MAX_NUM_FILTERS]; 
+   tANI_U32                 matchCnt;
+   tHalRcvFltPktMatchCnt    filterMatchCnt[HAL_MAX_NUM_FILTERS];
+   tANI_U8                  bssIdx;
 } tHalRcvFltPktMatchRspParams, *tptHalRcvFltPktMatchRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -4865,6 +5278,7 @@
 {
     tANI_U32   status;  /* only valid for response message */
     tANI_U8    filterId;
+    tANI_U8    bssIdx;
 }tHalRcvFltPktClearParam, *tpHalRcvFltPktClearParam;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -4881,7 +5295,8 @@
 
 typedef PACKED_PRE struct PACKED_POST
 {
-    tANI_U32   status;  
+    tANI_U32   status;
+    tANI_U8    bssIdx;
 }tHalRcvFltPktSetMcListRspType, *tpHalRcvFltPktSetMcListRspType;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -4907,7 +5322,7 @@
   tANI_U32 uIgnoreDTIM;
 
   /*DTIM Period*/
-  tANI_U32 uDTIMPeriod; 
+  tANI_U32 uDTIMPeriod;
 
   /* Listen Interval */
   tANI_U32 uListenInterval;
@@ -4919,7 +5334,7 @@
   tANI_U32 uEnableBET;
 
   /* Beacon Early Termination Interval */
-  tANI_U32 uBETInterval; 
+  tANI_U32 uBETInterval;
 }tSetPowerParamsType, *tpSetPowerParamsType;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -4949,7 +5364,7 @@
 
 typedef PACKED_PRE struct PACKED_POST{
 
-   tHalMsgHeader header;    
+   tHalMsgHeader header;
    tWlanFeatCaps wlanFeatCaps;
 
 }  tWlanFeatCapsMsg, *tpWlanFeatCapsMsg;
@@ -4958,9 +5373,18 @@
 typedef enum {
     MCC        = 0,
     P2P        = 1,
+    DOT11AC    = 2,
+    SLM_SESSIONIZATION = 3,
     MAX_FEATURE_SUPPORTED = 128,
 } placeHolderInCapBitmap;
 
+
+#define IS_MCC_SUPPORTED_BY_HOST (!!(halMsg_GetHostWlanFeatCaps(MCC)))
+#define IS_SLM_SESSIONIZATION_SUPPORTED_BY_HOST (!!(halMsg_GetHostWlanFeatCaps(SLM_SESSIONIZATION)))
+
+
+tANI_U8 halMsg_GetHostWlanFeatCaps(tANI_U8 feat_enum_value);
+
 #define setFeatCaps(a,b)   {  tANI_U32 arr_index, bit_index; \
                               if ((b>=0) && (b<=127)) { \
                                 arr_index = b/32; \
@@ -4979,7 +5403,7 @@
                               if ((b>=0) && (b<=127)) { \
                                 arr_index = b/32; \
                                 bit_index = b % 32; \
-                                (a)->featCaps[arr_index] |= (0<<bit_index); \
+                                (a)->featCaps[arr_index] &= ~(1<<bit_index); \
                               } \
                            }
 
@@ -5053,6 +5477,8 @@
 {
     tHalMsgHeader       header;
     tWakeReasonParams   wakeReasonParams;
+    tANI_U32            uBssIdx : 8;
+    tANI_U32            bReserved : 24;
 } tHalWakeReasonInd, *tpHalWakeReasonInd;
 
 /*---------------------------------------------------------------------------
@@ -5067,9 +5493,10 @@
 typedef PACKED_PRE struct PACKED_POST
 {
   tANI_U32     ulFlags;             /* optional flags */
-  tANI_U8      aKCK[HAL_GTK_KCK_BYTES];  /* Key confirmation key */ 
+  tANI_U8      aKCK[HAL_GTK_KCK_BYTES];  /* Key confirmation key */
   tANI_U8      aKEK[HAL_GTK_KEK_BYTES];  /* key encryption key */
   tANI_U64     ullKeyReplayCounter; /* replay counter */
+  tANI_U8      bssIdx;
 } tHalGtkOffloadReqParams, *tpHalGtkOffloadReqParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -5084,6 +5511,7 @@
 typedef PACKED_PRE struct PACKED_POST
 {
     tANI_U32   ulStatus;   /* success or failure */
+    tANI_U8    bssIdx;
 } tHalGtkOffloadRspParams, *tpHalGtkOffloadRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -5096,10 +5524,16 @@
 /*---------------------------------------------------------------------------
 * WLAN_HAL_GTK_OFFLOAD_GETINFO_REQ
 *--------------------------------------------------------------------------*/
+typedef PACKED_PRE struct PACKED_POST
+{
+   tANI_U8    bssIdx;
+
+} tHalGtkOffloadGetInfoReqParams, *tptHalGtkOffloadGetInfoReqParams;
 
 typedef PACKED_PRE struct PACKED_POST
 {
    tHalMsgHeader header;
+   tHalGtkOffloadGetInfoReqParams gtkOffloadGetInfoReqParams;
 }  tHalGtkOffloadGetInfoReqMsg, *tpHalGtkOffloadGetInfoReqMsg;
 
 /*---------------------------------------------------------------------------
@@ -5113,6 +5547,7 @@
    tANI_U32   ulTotalRekeyCount;    /* total rekey attempts */
    tANI_U32   ulGTKRekeyCount;      /* successful GTK rekeys */
    tANI_U32   ulIGTKRekeyCount;     /* successful iGTK rekeys */
+   tANI_U8    bssIdx;
 } tHalGtkOffloadGetInfoRspParams, *tptHalGtkOffloadGetInfoRspParams;
 
 typedef PACKED_PRE struct PACKED_POST
@@ -5150,7 +5585,7 @@
    HAL_THERMAL_MITIGATION_LEVEL_3 - 3rd level of thermal mitigation
    HAL_THERMAL_MITIGATION_LEVEL_4 - 4th level of thermal mitigation
 */
-typedef enum 
+typedef enum
 {
   HAL_THERMAL_MITIGATION_LEVEL_INVALID = -1,
   HAL_THERMAL_MITIGATION_LEVEL_0,
@@ -5169,7 +5604,7 @@
 
    /* Thermal Mitigation Level */
    tHalThermalMitigationLevelType thermalMitLevel;
-    
+
 }tSetThermalMitgationType, *tpSetThermalMitgationType;
 
 /* WLAN_HAL_SET_THERMAL_MITIGATION_REQ */
diff --git a/riva/inc/wlan_nv.h b/riva/inc/wlan_nv.h
index de4ec17..d881276 100644
--- a/riva/inc/wlan_nv.h
+++ b/riva/inc/wlan_nv.h
@@ -523,10 +523,92 @@
     HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS,
     HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS,
 
+#ifdef WLAN_FEATURE_11AC
+    /*11A duplicate 80MHz Rates*/
+    HAL_PHY_RATE_11AC_DUP_6_MBPS,
+    HAL_PHY_RATE_11AC_DUP_9_MBPS,
+    HAL_PHY_RATE_11AC_DUP_12_MBPS,
+    HAL_PHY_RATE_11AC_DUP_18_MBPS,
+    HAL_PHY_RATE_11AC_DUP_24_MBPS,
+    HAL_PHY_RATE_11AC_DUP_36_MBPS,
+    HAL_PHY_RATE_11AC_DUP_48_MBPS,
+    HAL_PHY_RATE_11AC_DUP_54_MBPS,
+
+    /*11AC rate 20MHZ Normal GI*/
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS,
+    
+    /*11AC rate 20MHZ Shortl GI*/
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,
+    HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,
+    
+    /*11AC rates 40MHZ normal GI*/
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS ,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
+    
+    /*11AC rates 40MHZ short GI*/
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS ,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
+    HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
+    
+    /*11AC rates 80 MHZ normal GI*/
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS ,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
+    
+    /*11AC rates 80 MHZ short GI*/
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS ,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
+    HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
+#endif //WLAN_FEATURE_11AC
+
     NUM_HAL_PHY_RATES,
     HAL_PHY_RATE_INVALID,
     MIN_RATE_INDEX = 0,
-    MAX_RATE_INDEX = HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS,
+    MAX_RATE_INDEX = NUM_HAL_PHY_RATES - 1,
     HAL_PHY_RATE_INVALID_MAX_FIELD = 0x7FFFFFFF  /* define as 4 bytes data */
 }eHalPhyRates;
 
diff --git a/riva/inc/wlan_qct_dev_defs.h b/riva/inc/wlan_qct_dev_defs.h
index c0e9ddb..87a2f84 100644
--- a/riva/inc/wlan_qct_dev_defs.h
+++ b/riva/inc/wlan_qct_dev_defs.h
@@ -37,14 +37,45 @@
  * --------------------------------------------------------------------
  */
 
+#ifdef WCN_PRONTO
+#ifdef WCN_PRONTO_V1
+
+/* In Pronto 1.0 TPE descriptor size is increased to 1K per station
+ * but not the cMEM allocated for hardware descriptors. Due to this
+ * memory limitation the number of stations are limited to 9 and BSS
+ * to 2 respectively. 
+ *
+ * In Pronto 2.0, TPE descriptor size is reverted
+ * back to 512 bytes and hence more stations and BSSs can be supported
+ * from Pronto 2.0
+ *
+ * In Pronto 1.0, 9 HW stations are supported including BCAST STA(staId 0)
+ * and SELF STA(staId 1). So total ASSOC stations which can connect to
+ * Pronto 1.0 Softap = 9 - 1(self sta) - 1(Bcast sta) = 7 stations
+ */
+#define HAL_NUM_STA                 9
+#define HAL_NUM_BSSID               2
+#define HAL_NUM_UMA_DESC_ENTRIES    9
+
+#else /* WCN_PRONTO_V1 */
+
+#define HAL_NUM_STA                 14
+#define HAL_NUM_BSSID               4
+#define HAL_NUM_UMA_DESC_ENTRIES    14
+
+#endif /* WCN_PRONTO_V1 */
+#else  /* WCN_PRONTO */
+
 /*In prima 12 HW stations are supported including BCAST STA(staId 0)
  and SELF STA(staId 1) so total ASSOC stations which can connect to Prima
  SoftAP = 12 - 1(Self STa) - 1(Bcast Sta) = 10 Stations. */
-
 #define HAL_NUM_STA                 12
 #define HAL_NUM_BSSID               2
 #define HAL_NUM_UMA_DESC_ENTRIES    12
 
+#endif /* WCN_PRONTO */
+
+
 #define HAL_INVALID_BSSIDX          HAL_NUM_BSSID
 
 #define MAX_NUM_OF_BACKOFFS         8
@@ -121,11 +152,21 @@
     /* Special WQ for BMU to dropping all frames coming to this WQ ID */
     BMUWQ_SINK = 255,
 
-    /* Total BMU WQ count in Volans */
+#ifdef WCN_PRONTO
+    BMUWQ_BMU_CMEM_IDLE_BD = 27,
+    /* Total BMU WQ count in Pronto */
+    BMUWQ_NUM = 28,
+    
+    //WQs 17 through 22 are enabled in Pronto. So, set not supported mask to 0.
+    BMUWQ_NOT_SUPPORTED_MASK = 0x0,
+#else
+    /* Total BMU WQ count in Prima */
     BMUWQ_NUM = 27,
 
-    //Volans has excluded support for WQs 17 through 22.
+    //Prima has excluded support for WQs 17 through 22.
     BMUWQ_NOT_SUPPORTED_MASK = 0x7e0000,
+#endif //WCN_PRONTO
+
 
     /* Aliases */
     BMUWQ_BTQM_TX_MGMT = BMUWQ_BTQM,
