OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / system / wlan / ti / sta_dk_4_0_4_32 / common / src / TNETW_Driver / FW_Transfer / Cmd_MBox / CmdMBox.c
diff --git a/system/wlan/ti/sta_dk_4_0_4_32/common/src/TNETW_Driver/FW_Transfer/Cmd_MBox/CmdMBox.c b/system/wlan/ti/sta_dk_4_0_4_32/common/src/TNETW_Driver/FW_Transfer/Cmd_MBox/CmdMBox.c
new file mode 100644 (file)
index 0000000..8bb0381
--- /dev/null
@@ -0,0 +1,1253 @@
+/****************************************************************************
+**+-----------------------------------------------------------------------+**
+**|                                                                       |**
+**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
+**| All rights reserved.                                                  |**
+**|                                                                       |**
+**| Redistribution and use in source and binary forms, with or without    |**
+**| modification, are permitted provided that the following conditions    |**
+**| are met:                                                              |**
+**|                                                                       |**
+**|  * Redistributions of source code must retain the above copyright     |**
+**|    notice, this list of conditions and the following disclaimer.      |**
+**|  * Redistributions in binary form must reproduce the above copyright  |**
+**|    notice, this list of conditions and the following disclaimer in    |**
+**|    the documentation and/or other materials provided with the         |**
+**|    distribution.                                                      |**
+**|  * Neither the name Texas Instruments nor the names of its            |**
+**|    contributors may be used to endorse or promote products derived    |**
+**|    from this software without specific prior written permission.      |**
+**|                                                                       |**
+**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
+**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
+**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
+**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
+**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
+**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
+**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
+**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
+**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
+**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
+**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
+**|                                                                       |**
+**+-----------------------------------------------------------------------+**
+****************************************************************************/
+
+/****************************************************************************
+ *
+ *   MODULE:  CmdMBox.c
+ *   PURPOSE: Handle the wlan hardware command mailbox
+ *   
+ ****************************************************************************/
+#include "osTIType.h"
+#include "whalCommon.h"
+#include "TNETWIF.h"
+#include "whalHwDefs.h"
+#include "FwEvent_api.h"
+#include "CmdQueue_api.h"
+#include "CmdMBox_api.h"
+#include "CmdMBox.h"
+#include "tnetwCommon.h"
+#include "osApi.h"
+
+/* Check if HostIfReg is On. This function is used on SDIO only. */
+int CmdMbox_CheckAndAck(TI_HANDLE hTNETWIF, UINT32 Intr);
+
+#define CMDMBOX_DEBUG_PRINT 0
+
+#ifdef REPORT_LOG
+#define CMDMBOX_CHECK_STATUS \
+    switch (pCmdMBox->HW_CmdMBox.cmdStatus) \
+    { \
+       case CMD_STATUS_SUCCESS: \
+               { \
+                       WLAN_REPORT_INFORMATION(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG, \
+                              ("CMD_MBOX: CMD_STATUS_SUCCESS\n")); \
+                       break; \
+               } \
+       case CMD_STATUS_REJECT_MEAS_SG_ACTIVE: \
+               { \
+                       WLAN_REPORT_INFORMATION(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG, \
+                              ("CMD_MBOX: ERROR: CMD_STATUS_REJECT_MEAS_SG_ACTIVE received\n")); \
+            break; \
+               } \
+       case CMD_MAILBOX_IDLE: \
+       case CMD_STATUS_UNKNOWN_CMD: \
+       case CMD_STATUS_UNKNOWN_IE: \
+    case CMD_STATUS_RX_BUSY: \
+    case CMD_STATUS_INVALID_PARAM: \
+    case CMD_STATUS_TEMPLATE_TOO_LARGE: \
+    case CMD_STATUS_OUT_OF_MEMORY: \
+    case CMD_STATUS_STA_TABLE_FULL: \
+       case CMD_STATUS_RADIO_ERROR: \
+       case CMD_STATUS_WRONG_NESTING: \
+               { \
+                       /* print the error */ \
+            WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG, \
+                              ("%s: ERROR: %s (%d), command: %s (%d), IE: %s (%d)\n", \
+                               __FUNCTION__, CmdQueue_GetErrorString(pCmdMBox->HW_CmdMBox.cmdStatus), \
+                               pCmdMBox->HW_CmdMBox.cmdStatus, \
+                               CmdQueue_GetCmdString(pCmdMBox->HW_CmdMBox.cmdID), \
+                               pCmdMBox->HW_CmdMBox.cmdID, \
+                               CmdQueue_GetIEString(pCmdMBox->HW_CmdMBox.cmdID, *(UINT16*)&(pCmdMBox->HW_CmdMBox.parameters)), \
+                               *(UINT16*)&(pCmdMBox->HW_CmdMBox.parameters))); \
+                       /* continue as if the command succedded */ \
+                       pCmdMBox->HW_CmdMBox.cmdStatus = (uint16)CMD_STATUS_SUCCESS; \
+                       break; \
+               } \
+    case CMD_STATUS_TIMEOUT: \
+       case CMD_STATUS_FW_RESET: \
+       default: \
+        /* if the FW is not responding, start recovery */ \
+        { \
+            CmdQueue_Error(pCmdMBox->hCmdQueue); \
+                       break; \
+        } \
+       } /* end of switch */
+#else
+#define CMDMBOX_CHECK_STATUS \
+    switch (pCmdMBox->HW_CmdMBox.cmdStatus) \
+    { \
+       case CMD_STATUS_SUCCESS: \
+               { \
+                       break; \
+               } \
+       case CMD_STATUS_REJECT_MEAS_SG_ACTIVE: \
+               { \
+            break; \
+               } \
+       case CMD_MAILBOX_IDLE: \
+       case CMD_STATUS_UNKNOWN_CMD: \
+       case CMD_STATUS_UNKNOWN_IE: \
+    case CMD_STATUS_RX_BUSY: \
+    case CMD_STATUS_INVALID_PARAM: \
+    case CMD_STATUS_TEMPLATE_TOO_LARGE: \
+    case CMD_STATUS_OUT_OF_MEMORY: \
+    case CMD_STATUS_STA_TABLE_FULL: \
+       case CMD_STATUS_RADIO_ERROR: \
+       case CMD_STATUS_WRONG_NESTING: \
+               { \
+                       /* continue as if the command succedded */ \
+                       pCmdMBox->HW_CmdMBox.cmdStatus = (uint16)CMD_STATUS_SUCCESS; \
+                       break; \
+               } \
+    case CMD_STATUS_TIMEOUT: \
+       case CMD_STATUS_FW_RESET: \
+       default: \
+        /* if the FW is not responding, start recovery */ \
+        { \
+            CmdQueue_Error(pCmdMBox->hCmdQueue); \
+                       break; \
+        } \
+       } /* end of switch */
+#endif /* REPORT_LOG */
+
+
+#if CMDMBOX_DEBUG_PRINT
+static char *StateString_array[16] = {
+    "CMDMBOX_STATE_SENDCMD_NORMAL_IDLE",  /* 0 */
+    "CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_BUS",  /* 1 */
+    "CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_TXN_BUF",  /* 2 */
+    "CMDMBOX_STATE_SENDCMD_NORMAL_WRITE_TRIG_v",  /* 3 */
+    "CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_TXN_TRIG",  /* 4 */
+    "CMDMBOX_STATE_SENDCMD_BLOCKING_IDLE",  /* 5 */
+    "CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_BUS",  /* 6 */
+    "CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_TXN_BUF",  /* 7 */
+    "CMDMBOX_STATE_SENDCMD_BLOCKING_WRITE_TRIG_v",  /* 8 */
+    "CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_TXN_TRIG",  /* 9 */
+    "CMDMBOX_STATE_SENDCMD_BLOCKING_POLL_CMPLT_v",  /* 10 */
+    "CMDMBOX_STATE_SENDCMD_BLOCKING_FINISH_v",  /* 11 */
+    "CMDMBOX_STATE_GETRESULT_NORMAL_IDLE",  /* 12 */
+    "CMDMBOX_STATE_GETRESULT_NORMAL_WAIT_TXN",  /* 13 */
+    "CMDMBOX_STATE_GETRESULT_BLOCKING_IDLE",  /* 14 */
+    "CMDMBOX_STATE_GETRESULT_BLOCKING_WAIT_TXN",  /* 15 */  
+};
+static char *StateString[NUM_COMMANDS];
+
+static char *EventString[CMDMBOX_EVENT_NUM] = {
+    "CMDMBOX_EVENT_SEND_CMD",  /* 1 */
+    "CMDMBOX_EVENT_CMD_CMPLT",  /* 2 */
+    "CMDMBOX_EVENT_BUS_READY",  /* 3 */
+    "CMDMBOX_EVENT_TXN_CMPLT",  /* 4 */
+    "CMDMBOX_EVENT_GET_RESULT",  /* 5 */
+};
+
+#endif
+
+/****************************************************************************
+ *                      CmdMBox_Create()
+ ****************************************************************************
+ * DESCRIPTION: Create the mailbox object
+ * 
+ * INPUTS:  
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: The Created object
+ ****************************************************************************/
+TI_HANDLE       CmdMBox_Create(TI_HANDLE hOs)
+{
+    CmdMBox_T *pObj;
+
+    pObj = os_memoryAlloc (hOs, sizeof(CmdMBox_T));
+    if (pObj == NULL)
+    {
+        WLAN_OS_REPORT(("FATAL ERROR: CmdMBox_Create(): Error Creating CmdMBox - Aborting\n"));
+        return NULL;
+    }
+
+    /* reset control module control block */
+    os_memoryZero(hOs, pObj, sizeof(CmdMBox_T));
+    pObj->hOs = hOs;
+
+    /* allocates Timer to use for CmdMBox timeout*/
+    pObj->hTimer = os_timerCreate(hOs, CmdMBox_TimeOut, pObj);
+    if (pObj->hTimer == NULL)
+    {
+        CmdMBox_Destroy(pObj);
+        WLAN_OS_REPORT(("FATAL ERROR: CmdMBox_Create(): Error Creating CmdMBox Timer- Aborting\n"));
+        return NULL;
+    }
+
+#if CMDMBOX_DEBUG_PRINT
+    StateString[0] = StateString_array[0];
+    StateString[1] = StateString_array[1];
+    StateString[2] = StateString_array[2];
+    StateString[3] = StateString_array[3];
+    StateString[4] = StateString_array[4];
+    StateString[10] = StateString_array[5];
+    StateString[11] = StateString_array[6];
+    StateString[12] = StateString_array[7];
+    StateString[13] = StateString_array[8];
+    StateString[14] = StateString_array[9];
+    StateString[15] = StateString_array[10];
+    StateString[16] = StateString_array[11];
+    StateString[20] = StateString_array[12];
+    StateString[21] = StateString_array[13];
+    StateString[30] = StateString_array[14];
+    StateString[31] = StateString_array[15];
+#endif
+
+    return(pObj);
+}
+
+/****************************************************************************
+ *                      CmdMBox_Destroy()
+ ****************************************************************************
+ * DESCRIPTION: Destroy the object 
+ * 
+ * INPUTS:  
+ *      hCmdMBox        The object to free
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: OK or NOK
+ ****************************************************************************/
+int             CmdMBox_Destroy(TI_HANDLE hCmdMBox)
+{
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+
+    /* free timer */
+    if (pCmdMBox->hTimer)
+        utils_nullTimerDestroy(pCmdMBox->hOs, pCmdMBox->hTimer);
+    
+    /* free context */
+       os_memoryFree(pCmdMBox->hOs, pCmdMBox, sizeof(CmdMBox_T));
+    
+    return OK;
+}
+
+/****************************************************************************
+ *                      CmdMBox_Config()
+ *****************************************************************************
+ * DESCRIPTION: Configure the object 
+ * 
+ * INPUTS:  
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: OK or NOK
+ ****************************************************************************/
+int CmdMBox_Config (TI_HANDLE hCmdMBox, TI_HANDLE hTNETWIF, TI_HANDLE hFwEvent, TI_HANDLE hCmdQueue, TI_HANDLE hReport)
+{
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+    
+    pCmdMBox->hReport = hReport;
+    pCmdMBox->hTNETWIF = hTNETWIF;
+    pCmdMBox->hFwEvent = hFwEvent;
+    pCmdMBox->hCmdQueue = hCmdQueue;
+    
+    pCmdMBox->GetResultNormal_State = CMDMBOX_STATE_GETRESULT_NORMAL_IDLE;
+    pCmdMBox->GetResultBlocking_State = CMDMBOX_STATE_GETRESULT_BLOCKING_IDLE;
+    pCmdMBox->SendCmdNormal_State = CMDMBOX_STATE_SENDCMD_NORMAL_IDLE;
+    pCmdMBox->SendCmdBlocking_State = CMDMBOX_STATE_SENDCMD_BLOCKING_IDLE;
+    pCmdMBox->ActiveSM = NULL;  
+    
+  #ifdef USE_SYNC_API /* Blocking mode is using Synch IF  */
+    pCmdMBox->SendCmdSM = CmdMBox_SM_SendCmdBlocking;
+    pCmdMBox->GetResultSM = CmdMBox_SM_GetResultBlocking;   
+  #else
+    pCmdMBox->SendCmdSM = CmdMBox_SM_SendCmdNormal;
+    pCmdMBox->GetResultSM = CmdMBox_SM_GetResultNormal; 
+  #endif
+
+    pCmdMBox->CmdMBox_FW_address = 0;
+    pCmdMBox->GetResult_ParamsBuf = NULL;
+    pCmdMBox->GetResult_ParamsLen = 0;
+   
+    os_timerStop (pCmdMBox->hOs, pCmdMBox->hTimer);
+
+    return OK;
+}
+
+
+/****************************************************************************
+ *                      CmdMBox_ConfigCb()
+ ****************************************************************************
+ * DESCRIPTION: Configure the mailbox address callback
+ * 
+ * INPUTS:  
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: OK or NOK
+ ****************************************************************************/
+static void CmdMBox_ConfigHwCb (TI_HANDLE hCmdMBox, UINT8 module_id, TI_STATUS status)
+{
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+
+    WLAN_REPORT_INIT (pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,  
+                      ("CmdMBox_ConfigHw: CmdMBox FW address = 0x%x\n", 
+                      pCmdMBox->CmdMBox_FW_address));
+
+    /* Call upper layer callback */
+    pCmdMBox->fCb (pCmdMBox->hCb, module_id, OK);
+}
+
+
+/****************************************************************************
+ *                      CmdMBox_ConfigHw()
+ ****************************************************************************
+ * DESCRIPTION: Configure the mailbox address 
+ * 
+ * INPUTS:  
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: OK or NOK
+ ****************************************************************************/
+TI_STATUS CmdMBox_ConfigHw (TI_HANDLE hCmdMBox, UINT8 module_id, fnotify_t fCb, TI_HANDLE hCb)
+{
+    CmdMBox_T *pCmdMBox = (CmdMBox_T*)hCmdMBox;
+    int        status;
+
+    pCmdMBox->fCb = (TNETWIF_callback_t)fCb;
+    pCmdMBox->hCb = hCb;
+
+    /* 
+     * Get the command mailbox address
+     */
+    status = TNETWIF_ReadRegOpt (pCmdMBox->hTNETWIF, 
+                                 REG_COMMAND_MAILBOX_PTR, 
+                                 &pCmdMBox->CmdMBox_FW_address,
+                                 module_id,
+                                 CmdMBox_ConfigHwCb,
+                                 hCmdMBox);
+
+    switch (status)
+    {
+    case TNETWIF_ERROR:
+        WLAN_REPORT_FATAL_ERROR (pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,  
+                                 ("CmdMBox_ConfigHw: ERROR reading Mailbox addresses (0x%x) !!!\n", 
+                                 pCmdMBox->CmdMBox_FW_address ));
+        break;
+
+    case TNETWIF_COMPLETE:
+        WLAN_REPORT_INIT (pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,  
+                          ("CmdMBox_ConfigHw: CmdMBox FW address = 0x%x\n", 
+                          pCmdMBox->CmdMBox_FW_address));
+        break;
+    }
+       
+    return (TI_STATUS)status;
+}
+
+/****************************************************************************
+ *                      CmdMBox_SetMode()
+ ****************************************************************************
+ * DESCRIPTION: Set the operational mode from blocking to normal
+ * 
+ * RETURNS: None
+ ****************************************************************************/
+int CmdMBox_SetModeNormal (TI_HANDLE hCmdMBox)
+{
+  #if defined(USE_SYNC_API)
+
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+
+    /* Set the state to NORMAL */
+    pCmdMBox->SendCmdSM = CmdMBox_SM_SendCmdNormal;
+    pCmdMBox->GetResultSM = CmdMBox_SM_GetResultNormal; 
+    
+    FwEvent_Enable (pCmdMBox->hFwEvent, ACX_INTR_CMD_COMPLETE);
+    
+    WLAN_REPORT_INFORMATION (pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+            ("CmdMBox_SetMode: CmdMBox mode is now NORMAL"));       
+
+
+  #endif
+
+    return OK;
+}
+
+/****************************************************************************
+ *                      CmdMBox_Reconfig()
+ ****************************************************************************
+ * DESCRIPTION: 
+ * 
+ * INPUTS:  
+ * 
+ * RETURNS: OK or NOK
+ ****************************************************************************/
+int                 CmdMBox_Restart(TI_HANDLE hCmdMBox)
+{
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+    
+    return CmdMBox_Config(hCmdMBox, pCmdMBox->hTNETWIF, pCmdMBox->hFwEvent, pCmdMBox->hCmdQueue, pCmdMBox->hReport);
+}
+
+
+/****************************************************************************
+ *                      CmdMBox_SendCmd()
+ ****************************************************************************
+ * DESCRIPTION: Try to send the Command to the Mailbox
+ * 
+ * INPUTS:  
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: OK or NOK
+ ****************************************************************************/
+int                 CmdMBox_SendCmd(TI_HANDLE hCmdMBox, Command_e cmdType, UINT8* pParamsBuf, UINT32 paramsLen)
+{
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+    
+    /* prepare the Cmd Hw template */
+    pCmdMBox->HW_CmdMBox.cmdID = cmdType;
+    pCmdMBox->HW_CmdMBox.cmdStatus = OK; 
+    os_memoryCopy(pCmdMBox->hOs, (void*)pCmdMBox->HW_CmdMBox.parameters, (void*)pParamsBuf, paramsLen);
+    /* must make sure that the length is multiple of 32bit */
+    if(paramsLen&0x3)
+        paramsLen  = (paramsLen + 4) & 0xFFFFFFFC;  
+    pCmdMBox->CmdLen = paramsLen + CMDMBOX_HEADER_LEN;  
+
+    pCmdMBox->ActiveSM = pCmdMBox->SendCmdSM;
+    return  pCmdMBox->ActiveSM(hCmdMBox, CMDMBOX_EVENT_SEND_CMD);
+}
+
+/****************************************************************************
+ *                      CmdMBox_GetResult()
+ ****************************************************************************
+ * DESCRIPTION: Get result of the Cmd
+ * 
+ * INPUTS:  
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: OK or NOK
+ ****************************************************************************/
+int                 CmdMBox_GetResult(TI_HANDLE hCmdMBox, UINT8* pParamsBuf, UINT32 paramsLen, UINT32* pStatus)
+{
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+    int rc;
+
+    pCmdMBox->GetResult_ParamsBuf = pParamsBuf;
+    pCmdMBox->GetResult_ParamsLen= paramsLen;
+    
+
+    pCmdMBox->ActiveSM = pCmdMBox->GetResultSM;
+    rc = pCmdMBox->ActiveSM(hCmdMBox, CMDMBOX_EVENT_GET_RESULT);
+
+       if (pCmdMBox->HW_CmdMBox.cmdStatus == CMD_STATUS_SUCCESS || pCmdMBox->HW_CmdMBox.cmdStatus == CMD_STATUS_REJECT_MEAS_SG_ACTIVE) 
+               {
+                       *pStatus = OK;
+               }
+               else
+               {
+                       *pStatus = NOK;
+               }
+    return rc;
+}
+
+/****************************************************************************
+ *                      CmdMBox_CmdCmplt()
+ ****************************************************************************
+ * DESCRIPTION: CallBack for command complete interrupt
+ * 
+ * INPUTS:  CbFunc  The Callback will be called we upon command complete interrupt 
+ * 
+ * RETURNS: None
+ ****************************************************************************/
+TI_STATUS  CmdMBox_CmdCmplt(TI_HANDLE hCmdMBox)
+{
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+    TI_STATUS  rc;
+
+    pCmdMBox->ActiveSM = pCmdMBox->SendCmdSM;
+    rc = (TI_STATUS)pCmdMBox->ActiveSM (hCmdMBox, CMDMBOX_EVENT_CMD_CMPLT);
+    if (rc == TNETWIF_COMPLETE)
+        rc = TNETWIF_OK;
+    return rc;
+}
+
+/****************************************************************************
+ *                      CmdMBox_TxnCmplt()
+ ****************************************************************************
+ * DESCRIPTION: CallBack for Txn complete
+ * 
+ * INPUTS:  
+ * 
+ * RETURNS: None
+ ****************************************************************************/
+void                CmdMBox_TxnCmplt(TI_HANDLE hCmdMBox, UINT8 module_id ,TI_STATUS status)
+{
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+    
+    pCmdMBox->ActiveSM(hCmdMBox, CMDMBOX_EVENT_TXN_CMPLT);
+}
+
+/****************************************************************************
+ *                      CmdMBox_BusReady()
+ ****************************************************************************
+ * DESCRIPTION: CallBack for Txn complete
+ * 
+ * INPUTS:  
+ * 
+ * RETURNS: None
+ ****************************************************************************/
+void                CmdMBox_BusReady(TI_HANDLE hCmdMBox, UINT8 module_id ,TI_STATUS status)
+{
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+    
+    pCmdMBox->ActiveSM(hCmdMBox, CMDMBOX_EVENT_BUS_READY);
+}
+
+/****************************************************************************
+ *                      CmdMBox_SM_GetResultNormal()
+ ****************************************************************************
+ * DESCRIPTION: CmdMBox SM
+ * 
+ * INPUTS:  
+ * 
+ * RETURNS: None
+ ****************************************************************************/
+int             CmdMBox_SM_GetResultNormal(CmdMBox_T* pCmdMBox, CmdMBox_SMEvents_e event)
+{
+    int rc = OK;
+    BOOLEAN breakWhile = FALSE;
+    
+    while(!breakWhile)
+    {
+#if CMDMBOX_DEBUG_PRINT
+        WLAN_OS_REPORT(("CmdMBox_SM_GetResultNormal: state = %s (%d) event = %s(%d)\n",
+            StateString[pCmdMBox->GetResultNormal_State],
+            pCmdMBox->GetResultNormal_State,
+            EventString[event],
+            event));
+#endif
+        switch(pCmdMBox->GetResultNormal_State)
+        {
+            /***************************************
+            CMDMBOX_STATE_GETRESULT_NORMAL_IDLE
+            ***************************************/
+            case CMDMBOX_STATE_GETRESULT_NORMAL_IDLE:
+                switch(event)
+                {
+                    case CMDMBOX_EVENT_GET_RESULT:
+
+                        /* read the results */
+                        if(pCmdMBox->GetResult_ParamsBuf)
+                        {                       
+                            /* need to read the results also */
+                            rc = TNETWIF_ReadMemOpt (pCmdMBox->hTNETWIF, 
+                                                     pCmdMBox->CmdMBox_FW_address, 
+                                                     PADREAD (&pCmdMBox->HW_CmdMBox), 
+                                                     pCmdMBox->GetResult_ParamsLen + CMDMBOX_HEADER_LEN,
+                                                     FW_EVENT_MODULE_ID, 
+                                                     CmdMBox_TxnCmplt, 
+                                                     pCmdMBox);
+                        }
+                        else
+                        {
+                            /* need to read the status only */                          
+                            rc = TNETWIF_ReadMemOpt (pCmdMBox->hTNETWIF, 
+                                                     pCmdMBox->CmdMBox_FW_address, 
+                                                     PADREAD (&pCmdMBox->HW_CmdMBox), 
+                                                     CMDMBOX_HEADER_LEN,
+                                                     FW_EVENT_MODULE_ID, 
+                                                     CmdMBox_TxnCmplt, 
+                                                     pCmdMBox);
+                        }                       
+
+                        if(rc == TNETWIF_PENDING)
+                        {
+                            pCmdMBox->GetResultNormal_State = CMDMBOX_STATE_GETRESULT_NORMAL_WAIT_TXN;
+                        }
+                        else
+                        {
+
+                            /* check the status */
+                            CMDMBOX_CHECK_STATUS;                           
+
+                            /* 
+                            if GetResult_ParamsBuf is NULL then we only need to check the status and then 
+                            we don't need to copy the results 
+                            */
+                            if(pCmdMBox->GetResult_ParamsBuf)
+                            {
+                                /* copy the results to the caller buffer */
+                                os_memoryCopy(pCmdMBox->hOs, (void*)pCmdMBox->GetResult_ParamsBuf, (void*)pCmdMBox->HW_CmdMBox.parameters, pCmdMBox->GetResult_ParamsLen);
+                            }
+                            
+                            pCmdMBox->GetResultNormal_State = CMDMBOX_STATE_GETRESULT_NORMAL_IDLE;
+                        }               
+                        breakWhile = TRUE;
+                        break;
+                    default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                            ("CmdMBox_SM_GetResultNormal: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_GETRESULT_NORMAL_IDLE\n",event));     
+                            return NOK;
+                }
+                break;
+            /***************************************
+            CMDMBOX_STATE_GETRESULT_NORMAL_WAIT_TXN
+            ***************************************/
+            case CMDMBOX_STATE_GETRESULT_NORMAL_WAIT_TXN:
+                switch(event)
+                {
+                    case CMDMBOX_EVENT_TXN_CMPLT:
+
+                        /* check the status */
+                        CMDMBOX_CHECK_STATUS;
+
+                        /* 
+                        if GetResult_ParamsBuf is NULL then we only need to check the status and then 
+                        we don't need to copy the results 
+                        */
+                        if(pCmdMBox->GetResult_ParamsBuf)
+                        {
+                            /* copy the results to the caller buffer */
+                            os_memoryCopy(pCmdMBox->hOs, (void*)pCmdMBox->GetResult_ParamsBuf, (void*)pCmdMBox->HW_CmdMBox.parameters, pCmdMBox->GetResult_ParamsLen);
+                        }
+                        
+                        /* call the CmdQueue CB */
+                        if (pCmdMBox->HW_CmdMBox.cmdStatus == CMD_STATUS_SUCCESS || pCmdMBox->HW_CmdMBox.cmdStatus == CMD_STATUS_REJECT_MEAS_SG_ACTIVE) 
+                                               {
+                                                       CmdQueue_ResultReceived(pCmdMBox->hCmdQueue, OK);
+                                               }
+                                               else
+                                               {
+                                                       CmdQueue_ResultReceived(pCmdMBox->hCmdQueue, NOK);
+                                               }
+                        
+                        FwEvent_EventComplete(pCmdMBox->hFwEvent, TNETWIF_OK);
+                        pCmdMBox->GetResultNormal_State = CMDMBOX_STATE_GETRESULT_NORMAL_IDLE;
+                        return OK;
+                    default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                            ("CmdMBox_SM_GetResultNormal: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_GETRESULT_NORMAL_WAIT_TXN\n",event));     
+                            return NOK;
+                }
+/*                break;  */
+            default:
+                WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                    ("CmdMBox_SM_GetResultNormal: ** ERROR **  No such state (%d)\n",pCmdMBox->GetResultNormal_State));     
+                    return NOK;
+        }
+    }
+       
+    return rc;
+    
+}
+
+
+#ifdef USE_SYNC_API
+
+/****************************************************************************
+ *                      CmdMBox_SM_GetResultBlocking()
+ ****************************************************************************
+ * DESCRIPTION: CmdMBox SM
+ * 
+ * INPUTS:  
+ * 
+ * RETURNS: None
+ ****************************************************************************/
+int             CmdMBox_SM_GetResultBlocking(CmdMBox_T* pCmdMBox, CmdMBox_SMEvents_e event)
+{
+    int rc = OK;
+    BOOLEAN breakWhile = FALSE;
+    
+    while(!breakWhile)
+    {
+#if CMDMBOX_DEBUG_PRINT
+        WLAN_OS_REPORT(("CmdMBox_SM_GetResultBlocking: state = %s (%d) event = %s(%d)\n",
+            StateString[pCmdMBox->GetResultBlocking_State],
+            pCmdMBox->GetResultBlocking_State,
+            EventString[event],
+            event));
+#endif
+        switch(pCmdMBox->GetResultBlocking_State)
+        {
+            /***************************************
+            CMDMBOX_STATE_GETRESULT_BLOCKING_IDLE
+            ***************************************/
+            case CMDMBOX_STATE_GETRESULT_BLOCKING_IDLE:
+                switch(event)
+                {
+                    case CMDMBOX_EVENT_GET_RESULT:
+                        /* read the results */
+                        if(pCmdMBox->GetResult_ParamsBuf)
+                        {
+                            /* need to read the results also */
+                            rc = TNETWIF_ReadMemSync (pCmdMBox->hTNETWIF, 
+                                                      pCmdMBox->CmdMBox_FW_address, 
+                                                      PADREAD(&pCmdMBox->HW_CmdMBox), 
+                                                      pCmdMBox->GetResult_ParamsLen + CMDMBOX_HEADER_LEN);
+                        }
+                        else
+                        {
+                            rc = TNETWIF_ReadMemSync (pCmdMBox->hTNETWIF, 
+                                                      pCmdMBox->CmdMBox_FW_address, 
+                                                      PADREAD (&pCmdMBox->HW_CmdMBox), 
+                                                      CMDMBOX_HEADER_LEN);                         
+                        }
+
+                        if(rc == TNETWIF_PENDING)
+                        {
+                            pCmdMBox->GetResultBlocking_State = CMDMBOX_STATE_GETRESULT_BLOCKING_WAIT_TXN;
+                        }
+                        else
+                        {
+                            /* check the status */
+                            CMDMBOX_CHECK_STATUS;
+
+                            /* 
+                            if GetResult_ParamsBuf is NULL then we only need to check the status and then 
+                            we don't need to copy the results 
+                            */
+                            if(pCmdMBox->GetResult_ParamsBuf)
+                            {
+                                /* copy the results to the caller buffer */
+                                os_memoryCopy(pCmdMBox->hOs, (void*)pCmdMBox->GetResult_ParamsBuf, (void*)pCmdMBox->HW_CmdMBox.parameters, pCmdMBox->GetResult_ParamsLen);
+                            }               
+                        }               
+                        breakWhile = TRUE;
+                        break;
+                    default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                            ("CmdMBox_SM_GetResultBlocking: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_GETRESULT_BLOCKING_IDLE\n",event));     
+                            return NOK;
+                }
+                break;
+            /***************************************
+            CMDMBOX_STATE_GETRESULT_BLOCKING_WAIT_TXN
+            ***************************************/
+            case CMDMBOX_STATE_GETRESULT_BLOCKING_WAIT_TXN:
+                switch(event)
+                {
+                               case CMDMBOX_EVENT_TXN_CMPLT:
+                                               
+                        /* check the status */
+                        CMDMBOX_CHECK_STATUS;
+
+                        /* 
+                        if GetResult_ParamsBuf is NULL then we only need to check the status and then 
+                        we don't need to copy the results 
+                        */
+                        if(pCmdMBox->GetResult_ParamsBuf)
+                        {
+                            /* copy the results to the caller buffer */
+                            os_memoryCopy(pCmdMBox->hOs, (void*)pCmdMBox->GetResult_ParamsBuf, (void*)pCmdMBox->HW_CmdMBox.parameters, pCmdMBox->GetResult_ParamsLen);
+                        }
+
+                        /* call the CmdQueue CB */
+                                               if (pCmdMBox->HW_CmdMBox.cmdStatus == CMD_STATUS_SUCCESS || pCmdMBox->HW_CmdMBox.cmdStatus == CMD_STATUS_REJECT_MEAS_SG_ACTIVE) 
+                                               {
+                                                       CmdQueue_ResultReceived(pCmdMBox->hCmdQueue, OK);
+                                               }
+                                               else
+                                               {
+                                                       CmdQueue_ResultReceived(pCmdMBox->hCmdQueue, NOK);
+                                               }
+                        
+
+                        pCmdMBox->GetResultBlocking_State = CMDMBOX_STATE_GETRESULT_BLOCKING_IDLE;
+                        breakWhile = TRUE;
+                        break;
+                    default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                            ("CmdMBox_SM_GetResultBlocking: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_GETRESULT_BLOCKING_WAIT_TXN\n",event));     
+                            return NOK;
+                }
+                break;
+            default:
+                WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                    ("CmdMBox_SM_GetResultBlocking: ** ERROR **  No such state (%d)\n",pCmdMBox->GetResultBlocking_State));     
+                    return NOK;
+        }
+    }
+    return rc;
+    
+}
+
+#endif /* USE_SYNC_API */
+
+
+/****************************************************************************
+ *                      CmdMBox_SM_SendCmdNormal()
+ ****************************************************************************
+ * DESCRIPTION: CmdMBox SM
+ * 
+ * INPUTS:  
+ * 
+ * RETURNS: None
+ ****************************************************************************/
+int             CmdMBox_SM_SendCmdNormal(CmdMBox_T* pCmdMBox, CmdMBox_SMEvents_e event)
+{
+    int rc = OK;
+    BOOLEAN breakWhile = FALSE;
+    
+    while(!breakWhile)
+{
+#if CMDMBOX_DEBUG_PRINT
+        WLAN_OS_REPORT(("CmdMBox_SM_SendCmdNormal: state = %s (%d) event = %s(%d) rc = %d\n",
+            StateString[pCmdMBox->SendCmdNormal_State],
+            pCmdMBox->SendCmdNormal_State,
+            EventString[event],
+            event,rc));
+#endif
+        switch(pCmdMBox->SendCmdNormal_State)
+        {
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_NORMAL_IDLE
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_NORMAL_IDLE:
+                switch(event)
+                {
+                    case CMDMBOX_EVENT_SEND_CMD:                                            
+                        pCmdMBox->SendCmdNormal_State = CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_BUS;
+                        /* ask for the bus */
+                        TNETWIF_Start (pCmdMBox->hTNETWIF,   HAL_CMD_MODULE_ID, 
+                            pCmdMBox, CmdMBox_BusReady);        
+                        rc = TNETWIF_PENDING;
+                        breakWhile = TRUE;
+                        break;
+                    case CMDMBOX_EVENT_CMD_CMPLT:
+                        /* stop timeout timer */
+                        os_timerStop(pCmdMBox->hOs, pCmdMBox->hTimer);
+
+                        /* call the CmdQueue CB */
+                        rc = CmdQueue_SendCmplt(pCmdMBox->hCmdQueue);                       
+                        breakWhile = TRUE;
+                        break;
+                    default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                            ("CmdMBox_SM_SendCmdNormal: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_SENDCMD_NORMAL_IDLE\n",event));     
+                            return NOK;
+                }
+                break;
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_BUS
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_BUS:
+                switch(event)
+                {
+                    case CMDMBOX_EVENT_BUS_READY:                       
+                        /* write the Cmd - subtract offset for the bus reserved place */
+            rc = TNETWIF_WriteMemOpt (pCmdMBox->hTNETWIF, 
+                                                  pCmdMBox->CmdMBox_FW_address, 
+                                                  PADWRITE (&pCmdMBox->HW_CmdMBox), 
+                                                  pCmdMBox->CmdLen,
+                                                  HAL_CMD_MODULE_ID, 
+                                                  CmdMBox_TxnCmplt, 
+                                                  pCmdMBox);
+            if(rc == TNETWIF_PENDING)
+                     {
+                            pCmdMBox->SendCmdNormal_State = CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_TXN_BUF;  
+                            breakWhile = TRUE;
+                     }
+                     else
+                     {
+                            pCmdMBox->SendCmdNormal_State = CMDMBOX_STATE_SENDCMD_NORMAL_WRITE_TRIG_v;                              
+                    }
+                     break;
+                        default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                                ("CmdMBox_SM_SendCmdNormal: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_BUS\n",event));     
+                            return NOK;
+                }
+                break;
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_TXN_BUF
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_TXN_BUF:
+                switch(event)
+                {
+                    case CMDMBOX_EVENT_TXN_CMPLT:                       
+                        pCmdMBox->SendCmdNormal_State = CMDMBOX_STATE_SENDCMD_NORMAL_WRITE_TRIG_v;                          
+                        break;
+                    default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                            ("CmdMBox_SM_SendCmdNormal: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_TXN_BUF\n",event));     
+                            return NOK;
+                }
+                break;
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_NORMAL_WRITE_TRIG_v
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_NORMAL_WRITE_TRIG_v:
+                /* start timeout timer */
+#ifdef DM_USE_WORKQUEUE
+                os_timerStart(pCmdMBox->hOs, pCmdMBox->hTimer,
+                      CMDMBOX_WAIT_TIMEOUT * 2, FALSE); /* Dm: Wait for 1000 ms */
+#else
+                os_timerStart(pCmdMBox->hOs, pCmdMBox->hTimer,
+                      CMDMBOX_WAIT_TIMEOUT, FALSE);
+#endif
+
+                /* write the FW trigger */
+                rc = TNETWIF_WriteRegOpt (pCmdMBox->hTNETWIF, 
+                                          ACX_REG_INTERRUPT_TRIG, 
+                                          INTR_TRIG_CMD,
+                                          HAL_CMD_MODULE_ID, 
+                                          CmdMBox_TxnCmplt, 
+                                          pCmdMBox);
+                if(rc == TNETWIF_PENDING)
+                {
+                    pCmdMBox->SendCmdNormal_State = CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_TXN_TRIG;
+                }
+                else
+                {
+                    pCmdMBox->SendCmdNormal_State = CMDMBOX_STATE_SENDCMD_NORMAL_IDLE;
+                    /* release the bus resource*/
+                    TNETWIF_Finish (pCmdMBox->hTNETWIF, HAL_CMD_MODULE_ID, NULL, NULL);
+                }
+                breakWhile = TRUE;
+                break;
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_TXN_TRIG
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_TXN_TRIG:
+                switch(event)
+                {
+                    case CMDMBOX_EVENT_TXN_CMPLT:                       
+                        pCmdMBox->SendCmdNormal_State = CMDMBOX_STATE_SENDCMD_NORMAL_IDLE;                          
+                        /* release the bus resource*/
+                        TNETWIF_Finish (pCmdMBox->hTNETWIF, HAL_CMD_MODULE_ID, NULL, NULL);
+            rc = OK;
+                        break;
+                    default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                            ("CmdMBox_SM_SendCmdNormal: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_SENDCMD_NORMAL_WAIT_TXN_TRIG\n",event));        
+                            return NOK;
+                }
+                breakWhile = TRUE;
+                break;
+            default:
+                WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                    ("CmdMBox_SM_SendCmdNormal: ** ERROR **  No such state (%d)\n",pCmdMBox->SendCmdNormal_State));     
+                    return NOK;
+        }
+    }
+#if CMDMBOX_DEBUG_PRINT
+        WLAN_OS_REPORT(("CmdMBox_SM_SendCmdNormal return = %d\n",rc));
+#endif
+    return rc;
+    
+}
+
+
+#ifdef USE_SYNC_API
+
+/****************************************************************************
+ *                      CmdMBox_SM_SendCmdBlocking()
+ ****************************************************************************
+ * DESCRIPTION: CmdMBox SM
+ * 
+ * INPUTS:  
+ * 
+ * RETURNS: None
+ ****************************************************************************/
+int             CmdMBox_SM_SendCmdBlocking(CmdMBox_T* pCmdMBox, CmdMBox_SMEvents_e event)
+{
+    int rc = OK;
+    BOOLEAN breakWhile = FALSE;
+    BOOLEAN CmdCmpltFlag = FALSE;
+
+    static UINT32 timeoutCounterExpire;
+    static UINT32 timeoutCounter;
+    
+    while(!breakWhile)
+    {
+#if CMDMBOX_DEBUG_PRINT
+        WLAN_OS_REPORT(("CmdMBox_SM_SendCmdBlocking: state = %s (%d) event = %s(%d) rc = %d\n",
+            StateString[pCmdMBox->SendCmdBlocking_State],
+            pCmdMBox->SendCmdBlocking_State,
+            EventString[event],
+            event,rc));
+#endif
+        switch(pCmdMBox->SendCmdBlocking_State)
+        {
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_BLOCKING_IDLE
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_BLOCKING_IDLE:
+                switch(event)
+                {
+                    case CMDMBOX_EVENT_SEND_CMD:                        
+
+                        pCmdMBox->SendCmdBlocking_State = CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_BUS;
+                       
+                        /* use the bus directly - it's O.K. since it's the init phase */
+                        event = CMDMBOX_EVENT_BUS_READY;
+
+                        break;
+                    default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                            ("CmdMBox_SM_SendCmdBlocking: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_SENDCMD_BLOCKING_IDLE\n",event));     
+                            return NOK;
+                }
+                break;
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_BUS
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_BUS:
+                switch(event)
+                {
+                    case CMDMBOX_EVENT_BUS_READY:  
+                        /* write the Cmd */
+                        rc = TNETWIF_WriteMemSync (pCmdMBox->hTNETWIF, 
+                                                   pCmdMBox->CmdMBox_FW_address, 
+                                                   PADWRITE (&pCmdMBox->HW_CmdMBox), 
+                                                   pCmdMBox->CmdLen);
+
+                        pCmdMBox->SendCmdBlocking_State = CMDMBOX_STATE_SENDCMD_BLOCKING_WRITE_TRIG_v;
+
+                        break;
+                    default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                            ("CmdMBox_SM_SendCmdBlocking: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_BUS\n",event));     
+                            return NOK;
+                }
+                break;
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_TXN_BUF
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_TXN_BUF:
+                switch(event)
+                {
+                    case CMDMBOX_EVENT_TXN_CMPLT:                       
+                        pCmdMBox->SendCmdBlocking_State = CMDMBOX_STATE_SENDCMD_BLOCKING_WRITE_TRIG_v;                          
+                        break;
+                    default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                            ("CmdMBox_SM_SendCmdBlocking: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_TXN_BUF\n",event));     
+                            return NOK;
+                }
+                break;
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_BLOCKING_WRITE_TRIG_v
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_BLOCKING_WRITE_TRIG_v:
+                /* init timeout counter */              
+                timeoutCounterExpire = (CMDMBOX_WAIT_TIMEOUT*CMDMBOX_US_TO_MS)/CMDMBOX_WAIT_CMPLT_STALL_TIME;
+                timeoutCounter = 0;
+
+                /* write the FW trigger */
+                if(pCmdMBox->useOpt) 
+                rc = TNETWIF_WriteRegOpt  (pCmdMBox->hTNETWIF, 
+                                               ACX_REG_INTERRUPT_TRIG, 
+                                               INTR_TRIG_CMD,
+                                               HAL_CMD_MODULE_ID, 
+                                               CmdMBox_TxnCmplt, 
+                                               pCmdMBox);
+                else
+                    rc = TNETWIF_WriteRegSync (pCmdMBox->hTNETWIF, 
+                                               ACX_REG_INTERRUPT_TRIG, 
+                                               INTR_TRIG_CMD);
+               
+                if(rc == TNETWIF_PENDING)
+                {
+                    pCmdMBox->SendCmdBlocking_State = CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_TXN_TRIG;
+                    breakWhile = TRUE;
+                }
+                else
+                {
+                    pCmdMBox->SendCmdBlocking_State = CMDMBOX_STATE_SENDCMD_BLOCKING_POLL_CMPLT_v;
+                }
+                break;
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_TXN_TRIG
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_TXN_TRIG:
+                switch(event)
+                {
+                    case CMDMBOX_EVENT_TXN_CMPLT:                       
+                        pCmdMBox->SendCmdBlocking_State = CMDMBOX_STATE_SENDCMD_BLOCKING_POLL_CMPLT_v;                          
+                        break;
+                    default:
+                        WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                            ("CmdMBox_SM_SendCmdBlocking: ** ERROR **  No such event (%d) for state CMDMBOX_STATE_SENDCMD_BLOCKING_WAIT_TXN_TRIG\n",event));        
+                            return NOK;
+                }
+                break;
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_BLOCKING_POLL_CMPLT_v
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_BLOCKING_POLL_CMPLT_v:                               
+                /* check CmdCmplt */
+                /* the following function is done in synchronize mode */
+                timeoutCounter++;
+                CmdCmpltFlag = CmdMbox_CheckAndAck(pCmdMBox->hTNETWIF, ACX_INTR_CMD_COMPLETE);
+                pCmdMBox->SendCmdBlocking_State = CMDMBOX_STATE_SENDCMD_BLOCKING_FINISH_v;
+                break;
+
+            /***************************************
+            CMDMBOX_STATE_SENDCMD_BLOCKING_FINISH_v
+            ***************************************/
+            case CMDMBOX_STATE_SENDCMD_BLOCKING_FINISH_v:                               
+                /* check CmdCmplt */
+                if(CmdCmpltFlag == FALSE)
+                {
+                    /* check timeout counter */
+                    if(timeoutCounter == timeoutCounterExpire)
+                        CmdMBox_TimeOut(pCmdMBox);
+                        
+                    pCmdMBox->SendCmdBlocking_State = CMDMBOX_STATE_SENDCMD_BLOCKING_POLL_CMPLT_v;
+                    os_StalluSec(pCmdMBox->hOs, CMDMBOX_WAIT_CMPLT_STALL_TIME);
+                }
+                else
+                {
+                    /* stop timeout timer */
+                    os_timerStop(pCmdMBox->hOs, pCmdMBox->hTimer);
+
+                    pCmdMBox->SendCmdBlocking_State = CMDMBOX_STATE_SENDCMD_BLOCKING_IDLE;
+                    
+                    /* call the CmdQueue CB */
+                    rc = CmdQueue_SendCmplt(pCmdMBox->hCmdQueue);
+                    breakWhile = TRUE;
+                }
+                break;
+            default:
+                WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+                    ("CmdMBox_SM_SendCmdBlocking: ** ERROR **  No such state (%d)\n",pCmdMBox->SendCmdBlocking_State));     
+                    return NOK;
+        }
+    }
+#if CMDMBOX_DEBUG_PRINT
+        WLAN_OS_REPORT(("CmdMBox_SM_SendCmdBlocking rc = %d\n",rc));
+#endif
+    return rc;
+}
+#endif /* USE_SYNC_API */
+/****************************************************************************
+ *                      CmdMBox_TimeOut()
+ ****************************************************************************
+ * DESCRIPTION: 
+ * 
+ * INPUTS:  
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: OK, ERROR
+ ****************************************************************************/
+void            CmdMBox_TimeOut(TI_HANDLE hCmdMBox)
+{
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+    
+    WLAN_REPORT_ERROR(pCmdMBox->hReport, CMD_MBOX_MODULE_LOG,
+            ("CmdMBox_TimeOut: Timeout occured in CmdMBox\n"));
+
+    /* call error CB */
+    CmdQueue_Error(pCmdMBox->hCmdQueue);
+    
+    return;
+}
+
+/****************************************************************************
+ *                      CmdMbox_CheckAndAck()
+ ****************************************************************************
+ * DESCRIPTION: Check if HostIfReg is On
+ *              This function is used on SDIO only.
+ * 
+ * INPUTS:  
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: OK, ERROR
+ ****************************************************************************/
+
+int CmdMbox_CheckAndAck (TI_HANDLE hTNETWIF, UINT32 Intr)
+{
+  #ifdef USE_SYNC_API
+
+    UINT32 Reg_IntrNoClear;
+
+    TNETWIF_ReadRegSync(hTNETWIF,ACX_REG_INTERRUPT_NO_CLEAR, &Reg_IntrNoClear);  
+    
+    if (IS_MASK_ON (Reg_IntrNoClear, Intr))
+    {
+        TNETWIF_WriteRegSync (hTNETWIF, ACX_REG_INTERRUPT_ACK, Intr);
+        return 1;
+    }
+
+  #endif /* USE_SYNC_API */
+
+    return 0;   
+}
+
+TI_STATUS CmdMBox_GetStatus(TI_HANDLE hCmdMBox)
+{
+    CmdMBox_T* pCmdMBox = (CmdMBox_T*)hCmdMBox;
+    TI_STATUS Status;
+    Status = (pCmdMBox->HW_CmdMBox.cmdStatus == CMD_STATUS_SUCCESS) ? OK : NOK;
+
+       switch (pCmdMBox->HW_CmdMBox.cmdStatus)
+    { 
+               case CMD_STATUS_SUCCESS: 
+               {
+            Status = OK;
+                       break;
+               }
+               case CMD_STATUS_REJECT_MEAS_SG_ACTIVE:
+               { 
+                       Status = SG_REJECT_MEAS_SG_ACTIVE;
+            break;
+               }
+               case CMD_MAILBOX_IDLE: 
+               case CMD_STATUS_UNKNOWN_CMD: 
+               case CMD_STATUS_UNKNOWN_IE: 
+               case CMD_STATUS_RX_BUSY: 
+               case CMD_STATUS_INVALID_PARAM: 
+               case CMD_STATUS_TEMPLATE_TOO_LARGE: 
+               case CMD_STATUS_OUT_OF_MEMORY: 
+               case CMD_STATUS_STA_TABLE_FULL: 
+               case CMD_STATUS_RADIO_ERROR: 
+               case CMD_STATUS_WRONG_NESTING: 
+        case CMD_STATUS_TIMEOUT: 
+               case CMD_STATUS_FW_RESET: 
+               default: 
+        { 
+            Status = NOK;
+                       break; 
+        }
+       } /* end of switch */
+
+    WLAN_REPORT_INFORMATION(pCmdMBox->hReport, HAL_HW_CTRL_MODULE_LOG,
+        ("%s - TI_STATUS = %s(%d) <= pCmdMBox->HW_CmdMBox.cmdStatus = %d\n", __FUNCTION__, 
+        (Status==OK)?"OK":"NOK",Status, pCmdMBox->HW_CmdMBox.cmdStatus));
+
+    return Status;
+}
+