prima: Registering txBdCompletion callback for mgmt frames.

Passing txBdToken and registering txBdCompletion callback for mgmt
frames to get the ack confirmation for these frames.

Change-Id: Ib3f922dcde5513785a3f75cec2dd0072d18ca1eb
CRs-Fixed: 812924
diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
index 9f4b197..d89a43d 100644
--- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c
+++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
@@ -1722,12 +1722,28 @@
     MTRACE(macTrace(pMac, TRACE_CODE_TX_MGMT,
            psessionEntry->peSessionId,
            pMacHdr->fc.subType));
-    /// Queue Association Response frame in high priority WQ
-    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 );
+
+    if (IS_FEATURE_SUPPORTED_BY_FW(ENHANCED_TXBD_COMPLETION))
+    {
+        limLog(pMac, LOG1, FL("Re/AssocRsp - txBdToken %u"), pMac->lim.txBdToken);
+        /// Queue Association Response frame in high priority WQ
+        halstatus = halTxFrameWithTxComplete( pMac, pPacket, ( tANI_U16 ) nBytes,
+                HAL_TXRX_FRM_802_11_MGMT,
+                ANI_TXDIR_TODS,
+                7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+                limTxComplete, pFrame, limTxBdComplete,
+                txFlag, pMac->lim.txBdToken );
+        pMac->lim.txBdToken++;
+    }
+    else
+    {
+        /// Queue Association Response frame in high priority WQ
+        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 );
+    }
     MTRACE(macTrace(pMac, TRACE_CODE_TX_COMPLETE,
            psessionEntry->peSessionId,
            halstatus));
@@ -2630,12 +2646,27 @@
                           ( !IS_BROADCAST_MAC(pMlmAssocReq->peerMacAddr) ) ){
         txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
     }
+    if (IS_FEATURE_SUPPORTED_BY_FW(ENHANCED_TXBD_COMPLETION))
+    {
+        limLog(pMac, LOG1, FL("Assoc Req - txBdToken %u"), pMac->lim.txBdToken);
+        halstatus = halTxFrameWithTxComplete( pMac, pPacket,
+                ( tANI_U16 ) (sizeof(tSirMacMgmtHdr) + nPayload),
+                HAL_TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS,
+                7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+                limTxComplete, pFrame, limTxBdComplete, txFlag,
+                pMac->lim.txBdToken);
+        pMac->lim.txBdToken++;
+    }
+    else
+    {
+        halstatus = halTxFrame( pMac, pPacket,
+                ( tANI_U16 ) (sizeof(tSirMacMgmtHdr) + nPayload),
+                HAL_TXRX_FRM_802_11_MGMT,
+                ANI_TXDIR_TODS,
+                7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+                limTxComplete, pFrame, txFlag );
+    }
 
-    halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) (sizeof(tSirMacMgmtHdr) + nPayload),
-            HAL_TXRX_FRM_802_11_MGMT,
-            ANI_TXDIR_TODS,
-            7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
-            limTxComplete, pFrame, txFlag );
     MTRACE(macTrace(pMac, TRACE_CODE_TX_COMPLETE,
            psessionEntry->peSessionId,
            halstatus));
@@ -3076,11 +3107,25 @@
     MTRACE(macTrace(pMac, TRACE_CODE_TX_MGMT,
            psessionEntry->peSessionId,
            pMacHdr->fc.subType));
-    halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) (nBytes + ft_ies_length),
-            HAL_TXRX_FRM_802_11_MGMT,
-            ANI_TXDIR_TODS,
-            7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
-            limTxComplete, pFrame, txFlag );
+    if (IS_FEATURE_SUPPORTED_BY_FW(ENHANCED_TXBD_COMPLETION))
+    {
+        limLog( pMac, LOG1, FL("Reassoc req - txBdToken %u"), pMac->lim.txBdToken);
+        halstatus = halTxFrameWithTxComplete( pMac, pPacket,
+                ( tANI_U16 ) (nBytes + ft_ies_length),
+                HAL_TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS,
+                7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+                limTxComplete, pFrame, limTxBdComplete, txFlag,
+                pMac->lim.txBdToken);
+        pMac->lim.txBdToken++;
+    }
+    else
+    {
+        halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) (nBytes + ft_ies_length),
+                HAL_TXRX_FRM_802_11_MGMT,
+                ANI_TXDIR_TODS,
+                7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+                limTxComplete, pFrame, txFlag );
+    }
     MTRACE(macTrace(pMac, TRACE_CODE_TX_COMPLETE,
            psessionEntry->peSessionId,
            halstatus));
@@ -3210,7 +3255,7 @@
 #if defined WLAN_FEATURE_VOWIFI
     tANI_U8               PowerCapsPopulated = FALSE;
 #endif
-    tpSirMacMgmtHdr     pMacHdr;
+    tpSirMacMgmtHdr       pMacHdr;
 
     if(NULL == psessionEntry)
     {
@@ -3479,12 +3524,25 @@
 
     // enable caching
     WLANTL_EnableCaching(psessionEntry->staId);
-
-    halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) (sizeof(tSirMacMgmtHdr) + nPayload),
-                            HAL_TXRX_FRM_802_11_MGMT,
-                            ANI_TXDIR_TODS,
-                            7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
-                            limTxComplete, pFrame, txFlag );
+    if (IS_FEATURE_SUPPORTED_BY_FW(ENHANCED_TXBD_COMPLETION))
+    {
+        limLog(pMac, LOG1, FL("Reassoc req - txBdToken %u"), pMac->lim.txBdToken);
+        halstatus = halTxFrameWithTxComplete( pMac, pPacket,
+                ( tANI_U16 ) (sizeof(tSirMacMgmtHdr) + nPayload),
+                HAL_TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS,
+                7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+                limTxComplete, pFrame, limTxBdComplete,
+                txFlag, pMac->lim.txBdToken );
+        pMac->lim.txBdToken++;
+    }
+    else
+    {
+        halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) (sizeof(tSirMacMgmtHdr) + nPayload),
+                HAL_TXRX_FRM_802_11_MGMT,
+                ANI_TXDIR_TODS,
+                7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+                limTxComplete, pFrame, txFlag );
+    }
     MTRACE(macTrace(pMac, TRACE_CODE_TX_COMPLETE,
            psessionEntry->peSessionId,
            halstatus));
@@ -3505,8 +3563,9 @@
 } // limSendReassocReqMgmtFrame
 
 eHalStatus limAuthTxCompleteCnf(tpAniSirGlobal pMac, void *pData)
- {
+{
     tANI_U32 txCompleteSuccess;
+    tpSirTxBdStatus pTxBdStatus;
 
     if (!pData)
     {
@@ -3514,10 +3573,21 @@
                 FL(" pData is NULL"));
         return eHAL_STATUS_FAILURE;
     }
-    txCompleteSuccess = *((tANI_U32*) pData);
 
-    limLog(pMac, LOG1,
-                   FL("txCompleteSuccess= %d"),txCompleteSuccess);
+    if (IS_FEATURE_SUPPORTED_BY_FW(ENHANCED_TXBD_COMPLETION))
+    {
+        pTxBdStatus = (tpSirTxBdStatus) pData;
+        txCompleteSuccess = pTxBdStatus->txCompleteStatus;
+        limLog(pMac, LOG1, FL("txCompleteStatus %u, txBdToken %u"),
+                pTxBdStatus->txCompleteStatus, pTxBdStatus->txBdToken);
+    }
+    else
+    {
+        txCompleteSuccess = *((tANI_U32*) pData);
+        limLog(pMac, LOG1,
+                FL("txCompleteSuccess= %d"), txCompleteSuccess);
+    }
+
     if(txCompleteSuccess)
     {
        pMac->authAckStatus = LIM_AUTH_ACK_RCD_SUCCESS;
@@ -3845,13 +3915,16 @@
     if(eSIR_TRUE == waitForAck)
     {
         pMac->authAckStatus = LIM_AUTH_ACK_NOT_RCD;
-
+        limLog(pMac, LOGE, FL("Auth frame - txBdToken %u"),
+                pMac->lim.txBdToken);
         halstatus = halTxFrameWithTxComplete( pMac, pPacket,
                     ( tANI_U16 ) frameLen,
                     HAL_TXRX_FRM_802_11_MGMT,
                     ANI_TXDIR_TODS,
                     7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
-                    limTxComplete, pFrame, limAuthTxCompleteCnf, txFlag );
+                    limTxComplete, pFrame, limAuthTxCompleteCnf, txFlag,
+                    pMac->lim.txBdToken);
+        pMac->lim.txBdToken++;
         MTRACE(macTrace(pMac, TRACE_CODE_TX_COMPLETE,
                psessionEntry->peSessionId,
                halstatus));
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index 05b4052..2c4b638 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -8449,3 +8449,20 @@
     else
          limLog(pMac, LOGW, FL("Pending Management count going negative"));
 }
+
+eHalStatus limTxBdComplete(tpAniSirGlobal pMac, void *pData)
+{
+    tpSirTxBdStatus pTxBdStatus;
+
+    if (!pData)
+    {
+       limLog(pMac, LOGE, FL("pData is NULL"));
+       return eHAL_STATUS_FAILURE;
+    }
+
+    pTxBdStatus = (tpSirTxBdStatus) pData;
+
+    limLog(pMac, LOG1, FL("txBdToken %u, txBdStatus %u"),
+            pTxBdStatus->txBdToken, pTxBdStatus->txCompleteStatus);
+    return eHAL_STATUS_SUCCESS;
+}
diff --git a/CORE/MAC/src/pe/lim/limUtils.h b/CORE/MAC/src/pe/lim/limUtils.h
index e550ba5..2d955cf 100644
--- a/CORE/MAC/src/pe/lim/limUtils.h
+++ b/CORE/MAC/src/pe/lim/limUtils.h
@@ -568,4 +568,6 @@
                                    tpPESession psessionEntry);
 
 void limDecrementPendingMgmtCount (tpAniSirGlobal pMac);
+
+eHalStatus limTxBdComplete(tpAniSirGlobal pMac, void *pData);
 #endif /* __LIM_UTILS_H */