Home | History | Annotate | Download | only in Connection_Managment
      1 /*
      2  * connInfra.c
      3  *
      4  * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  *  * Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  *  * Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in
     15  *    the documentation and/or other materials provided with the
     16  *    distribution.
     17  *  * Neither the name Texas Instruments nor the names of its
     18  *    contributors may be used to endorse or promote products derived
     19  *    from this software without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 /** \file connInfra.c
     35  *  \brief Infra connection implementation
     36  *
     37  *  \see connInfra.h
     38  */
     39 
     40 /***************************************************************************/
     41 /*                                                                         */
     42 /*      MODULE: connInfra.c                                                */
     43 /*    PURPOSE:  Infra connection implementation                            */
     44 /*                                                                         */
     45 /***************************************************************************/
     46 
     47 #define __FILE_ID__  FILE_ID_27
     48 #include "tidef.h"
     49 #include "report.h"
     50 #include "osApi.h"
     51 #include "conn.h"
     52 #include "connInfra.h"
     53 #include "timer.h"
     54 #include "fsm.h"
     55 #include "siteMgrApi.h"
     56 #include "sme.h"
     57 #include "rsnApi.h"
     58 #include "DataCtrl_Api.h"
     59 #include "paramOut.h"
     60 #include "siteHash.h"
     61 #include "smeSm.h"
     62 #include "PowerMgr_API.h"
     63 #include "measurementMgrApi.h"
     64 #include "TrafficMonitorAPI.h"
     65 #include "qosMngr_API.h"
     66 #include "EvHandler.h"
     67 #include "SwitchChannelApi.h"
     68 #include "ScanCncn.h"
     69 #include "currBss.h"
     70 #include "healthMonitor.h"
     71 #include "regulatoryDomainApi.h"
     72 #include "txCtrl.h"
     73 #include "TWDriver.h"
     74 #include "SoftGeminiApi.h"
     75 #include "RxQueue_api.h"
     76 
     77 #ifdef XCC_MODULE_INCLUDED
     78 #include "XCCMngr.h"
     79 #include "XCCTSMngr.h"
     80 #endif
     81 
     82 #define DISCONNECT_TIMEOUT_MSEC      800
     83 
     84 /* Local functions prototypes */
     85 
     86 static TI_STATUS actionUnexpected(void *pData);
     87 
     88 static TI_STATUS actionNop(void *pData);
     89 
     90 static TI_STATUS connInfra_ScrWait(void *pData);
     91 
     92 static TI_STATUS Idle_to_Idle(void *pData);
     93 
     94 static TI_STATUS ScrWait_to_idle(void *pData);
     95 
     96 static TI_STATUS ScrWait_to_JoinWait(void *pData);
     97 
     98 static TI_STATUS JoinWait_to_mlmeWait(void *pData);
     99 
    100 static TI_STATUS JoinWait_to_WaitDisconnect(void *pData);
    101 
    102 static TI_STATUS mlmeWait_to_WaitDisconnect(void *pData);
    103 
    104 static TI_STATUS mlmeWait_to_rsnWait(void *pData);
    105 
    106 static TI_STATUS rsnWait_to_disconnect(void *pData);
    107 
    108 static TI_STATUS rsnWait_to_configHW(void *pData);
    109 
    110 static TI_STATUS configHW_to_connected(void *pData);
    111 
    112 static TI_STATUS configHW_to_disconnect(void *pData);
    113 
    114 static TI_STATUS connInfra_ScrWaitDisconn_to_disconnect(void *pData);
    115 
    116 static TI_STATUS connect_to_ScrWait(void *pData);
    117 
    118 static TI_STATUS prepare_send_disconnect(void *pData);
    119 
    120 static TI_STATUS connInfra_WaitDisconnectToIdle (void *pData);
    121 
    122 
    123 static TI_STATUS stopModules( conn_t *pConn, TI_BOOL bDisconnect );
    124 
    125 void InfraConnSM_ScrCB( TI_HANDLE hConn, EScrClientRequestStatus requestStatus,
    126                         EScrResourceId eResource, EScePendReason pendReason );
    127 
    128 int conn_ConfigHwFinishCb(TI_HANDLE pData);
    129 
    130 /********************************************/
    131 /*      Functions Implementations           */
    132 /********************************************/
    133 
    134 
    135 /***********************************************************************
    136  *                        conn_infraConfig
    137  ***********************************************************************
    138 DESCRIPTION: Infra Connection configuration function, called by the conection set param function
    139                 in the selection phase. Configures the connection state machine to Infra connection mode
    140 
    141 INPUT:      hConn   -   Connection handle.
    142 
    143 OUTPUT:
    144 
    145 RETURN:     TI_OK on success, TI_NOK otherwise
    146 
    147 ************************************************************************/
    148 TI_STATUS conn_infraConfig(conn_t *pConn)
    149 {
    150     static fsm_actionCell_t    smMatrix[CONN_INFRA_NUM_STATES][CONN_INFRA_NUM_EVENTS] =
    151     {
    152         /* next state and actions for IDLE state */
    153         {   {STATE_CONN_INFRA_SCR_WAIT_CONN, connInfra_ScrWait},        /* "EVENT_CONNECT"  */
    154             {STATE_CONN_INFRA_IDLE, actionNop       },                  /* "EVENT_SCR_SUCC"*/
    155             {STATE_CONN_INFRA_IDLE, actionNop       },                  /* "EVENT_JOIN_CMD_CMPLT */
    156             {STATE_CONN_INFRA_IDLE, Idle_to_Idle    },                  /* "EVENT_DISCONNECT"       */
    157             {STATE_CONN_INFRA_IDLE, actionUnexpected},                  /* "EVENT_MLME_SUCC"*/
    158             {STATE_CONN_INFRA_IDLE, actionUnexpected},                  /* "EVENT_RSN_SUCC" */
    159             {STATE_CONN_INFRA_IDLE, actionNop},                         /* "EVENT_CONFIG_HW" */
    160             {STATE_CONN_INFRA_IDLE, actionUnexpected}                   /* "EVENT_DISCONN_COMPLETE" */
    161         },
    162 
    163         /* next state and actions for SCR_WAIT_CONN state */
    164         {   {STATE_CONN_INFRA_SCR_WAIT_CONN     , actionUnexpected},    /* "EVENT_CONNECT"  */
    165             {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, ScrWait_to_JoinWait},    /* "EVENT_SCR_SUCC"*/
    166             {STATE_CONN_INFRA_SCR_WAIT_CONN     , actionUnexpected},    /* "EVENT_JOIN_CMD_CMPLT */
    167             {STATE_CONN_INFRA_IDLE,     ScrWait_to_idle},               /* "EVENT_DISCONNECT"       */
    168             {STATE_CONN_INFRA_SCR_WAIT_CONN     , actionUnexpected},    /* "EVENT_MLME_SUCC"*/
    169             {STATE_CONN_INFRA_SCR_WAIT_CONN     , actionUnexpected},    /* "EVENT_RSN_SUCC" */
    170             {STATE_CONN_INFRA_SCR_WAIT_CONN     , actionNop},           /* "EVENT_CONFIG_HW "*/
    171             {STATE_CONN_INFRA_SCR_WAIT_CONN     , actionNop}            /* "EVENT_DISCONN_COMPLETE" */
    172         },
    173 
    174         /* next state and actions for WAIT_JOIN_CMPLT */
    175         {   {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected},       /* "EVENT_CONNECT"    */
    176             {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected},       /* "EVENT_SCR_SUCC"*/
    177             {STATE_CONN_INFRA_MLME_WAIT,       JoinWait_to_mlmeWait},   /* "EVENT_JOIN_CMD_CMPLT"   */
    178             {STATE_CONN_INFRA_WAIT_DISCONNECT, JoinWait_to_WaitDisconnect},/* "EVENT_DISCONNECT"       */
    179             {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected},       /* "EVENT_MLME_SUCC"*/
    180             {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected},       /* "EVENT_RSN_SUCC" */
    181             {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionNop},              /* "EVENT_CONFIG_HW"        */
    182             {STATE_CONN_INFRA_WAIT_JOIN_CMPLT, actionUnexpected}        /* "EVENT_DISCONN_COMPLETE" */
    183 
    184         },
    185 
    186         /* next state and actions for MLME_WAIT state */
    187         {   {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected},             /* "EVENT_CONNECT"  */
    188             {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected},             /* "EVENT_SCR_SUCC" */
    189             {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected},             /* "EVENT_JOIN_CMD_CMPLT"*/
    190             {STATE_CONN_INFRA_WAIT_DISCONNECT, mlmeWait_to_WaitDisconnect}, /* "EVENT_DISCONNECT"       */
    191             {STATE_CONN_INFRA_RSN_WAIT,  mlmeWait_to_rsnWait},          /* "EVENT_MLME_SUCC"*/
    192             {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected},             /* "EVENT_RSN_SUCC" */
    193             {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected},             /* "EVENT_CONFIG_HW" */
    194             {STATE_CONN_INFRA_MLME_WAIT, actionUnexpected}              /* "EVENT_DISCONN_COMPLETE" */
    195         },
    196 
    197         /* next state and actions for RSN_WAIT state */
    198         {   {STATE_CONN_INFRA_RSN_WAIT,     actionUnexpected},          /* "EVENT_CONNECT"  */
    199             {STATE_CONN_INFRA_RSN_WAIT,     actionUnexpected},          /* "EVENT_SCR_SUCC" */
    200             {STATE_CONN_INFRA_RSN_WAIT,     actionUnexpected},          /* "EVENT_JOIN_CMD_CMPLT"*/
    201             {STATE_CONN_INFRA_WAIT_DISCONNECT,    rsnWait_to_disconnect},   /* "EVENT_DISCONNECT" */
    202             {STATE_CONN_INFRA_RSN_WAIT,     actionUnexpected},          /* "EVENT_MLME_SUCC"*/
    203             {STATE_CONN_INFRA_CONFIG_HW,    rsnWait_to_configHW},       /* "EVENT_RSN_SUCC" */
    204             {STATE_CONN_INFRA_RSN_WAIT,     actionUnexpected},          /* "EVENT_CONFIG_HW"        */
    205             {STATE_CONN_INFRA_RSN_WAIT,     actionUnexpected}           /* "EVENT_DISCONN_COMPLETE" */
    206         },
    207 
    208         /* next state and actions for CONFIG_HW state */
    209         {   {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected},             /* "EVENT_CONNECT"  */
    210             {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected},             /* "EVENT_SCR_SUCC" */
    211             {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected},             /* "EVENT_JOIN_CMD_CMPLT"*/
    212             {STATE_CONN_INFRA_WAIT_DISCONNECT, configHW_to_disconnect},     /* "EVENT_DISCONNECT"       */
    213             {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected},             /* "EVENT_MLME_SUCC"*/
    214             {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected},             /* "EVENT_RSN_SUCC" */
    215             {STATE_CONN_INFRA_CONNECTED, configHW_to_connected},        /* "EVENT_CONFIG_HW"        */
    216             {STATE_CONN_INFRA_CONFIG_HW, actionUnexpected}              /* "EVENT_DISCONN_COMPLETE" */
    217         },
    218 
    219         /* next state and actions for CONNECTED state */
    220         {   {STATE_CONN_INFRA_SCR_WAIT_CONN, connect_to_ScrWait},   /* "EVENT_CONNECT"  */
    221             {STATE_CONN_INFRA_CONNECTED, actionUnexpected},         /* "EVENT_SCR_SUCC"*/
    222             {STATE_CONN_INFRA_CONNECTED, actionUnexpected},         /* "EVENT_JOIN_CMD_CMPLT" */
    223             {STATE_CONN_INFRA_SCR_WAIT_DISCONN, connInfra_ScrWait}, /* "EVENT_DISCONNECT"       */
    224             {STATE_CONN_INFRA_CONNECTED, actionUnexpected},         /* "EVENT_MLME_SUCC"*/
    225             {STATE_CONN_INFRA_CONNECTED, actionUnexpected},         /* "EVENT_RSN_SUCC" */
    226             {STATE_CONN_INFRA_CONNECTED, actionUnexpected},         /* "STATE_CONN_INFRA_CONFIG_HW" */
    227             {STATE_CONN_INFRA_CONNECTED, actionUnexpected}          /* "EVENT_DISCONN_COMPLETE" */
    228         },
    229 
    230         /* next state and actions for SCR_WAIT_DISCONN state */
    231         {   {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected},     /* "EVENT_CONNECT"  */
    232             {STATE_CONN_INFRA_WAIT_DISCONNECT       , connInfra_ScrWaitDisconn_to_disconnect},  /* "EVENT_SCR_SUCC"*/
    233             {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected},     /* "EVENT_JOIN_CMD_CMPLT */
    234             {STATE_CONN_INFRA_SCR_WAIT_DISCONN, ScrWait_to_idle},      /* "EVENT_DISCONNECT"       */
    235             {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected},     /* "EVENT_MLME_SUCC"*/
    236             {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionUnexpected},     /* "EVENT_RSN_SUCC" */
    237             {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionNop},            /* "EVENT_CONFIG_HW "*/
    238             {STATE_CONN_INFRA_SCR_WAIT_DISCONN, actionNop}             /* "EVENT_DISCONN_COMPLETE" */
    239         },
    240 
    241         /* next state and actions for STATE_CONN_INFRA_WAIT_DISCONNECT state */
    242         {   {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected},               /* "EVENT_CONNECT"  */
    243             {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected},               /* "STATE_CONN_INFRA_SCR_WAIT_CONN"*/
    244             {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected},               /* "EVENT_JOIN_CMD_CMPLT" */
    245             {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected},               /* "EVENT_DISCONNECT" */
    246             {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected},               /* "EVENT_MLME_SUCC"*/
    247             {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected},               /* "EVENT_RSN_SUCC" */
    248             {STATE_CONN_INFRA_WAIT_DISCONNECT, actionUnexpected},               /* "STATE_CONN_INFRA_CONFIG_HW"  */
    249             {STATE_CONN_INFRA_IDLE           , connInfra_WaitDisconnectToIdle}  /* "EVENT_DISCONN_COMPLETE" */
    250         }
    251 
    252     };
    253 
    254     scr_registerClientCB( pConn->hScr, SCR_CID_CONNECT, InfraConnSM_ScrCB, pConn );
    255 
    256     return fsm_Config(pConn->infra_pFsm, (fsm_Matrix_t)smMatrix, CONN_INFRA_NUM_STATES, CONN_INFRA_NUM_EVENTS, conn_infraSMEvent, pConn->hOs);
    257 }
    258 
    259 /***********************************************************************
    260  *                        conn_infraSMEvent
    261  ***********************************************************************
    262 DESCRIPTION: Infra Connection SM event processing function, called by the connection API
    263                 Perform the following:
    264                 -   Print the state movement as a result from the event
    265                 -   Calls the generic state machine event processing function which preform the following:
    266                     -   Calls the correspoding callback function
    267                     -   Move to next state
    268 
    269 INPUT:      currentState    -   Pointer to the connection current state.
    270             event   -   Received event
    271             pConn   -   Connection handle
    272 
    273 OUTPUT:
    274 
    275 RETURN:     TI_OK on success, TI_NOK otherwise
    276 
    277 ************************************************************************/
    278 TI_STATUS conn_infraSMEvent(TI_UINT8 *currentState, TI_UINT8 event, TI_HANDLE hConn)
    279 {
    280    conn_t *pConn = (conn_t *)hConn;
    281     TI_STATUS       status;
    282     TI_UINT8       nextState;
    283 
    284     status = fsm_GetNextState(pConn->infra_pFsm, *currentState, event, &nextState);
    285     if (status != TI_OK)
    286     {
    287         TRACE0(pConn->hReport, REPORT_SEVERITY_SM, "State machine error, failed getting next state\n");
    288         return(TI_NOK);
    289     }
    290 
    291 	TRACE3( pConn->hReport, REPORT_SEVERITY_INFORMATION, "conn_ibssSMEvent: <currentState = %d, event = %d> --> nextState = %d\n", *currentState, event, nextState);
    292 
    293     status = fsm_Event(pConn->infra_pFsm, currentState, event, (void *)pConn);
    294 
    295     return status;
    296 }
    297 
    298 /************************************************************************************************************/
    299 /*      In the following section are listed the callback function used by the Infra connection state machine    */
    300 /************************************************************************************************************/
    301 
    302 /* JOIN, SET_DATA_PORT_NOTIFY, START_MLME */
    303 static TI_STATUS ScrWait_to_JoinWait(void *pData)
    304 {
    305     TI_STATUS status;
    306     conn_t *pConn = (conn_t *)pData;
    307 
    308     status = siteMgr_join(((conn_t *)pData)->hSiteMgr );
    309     /* If the Join command was failed we report the SME that connection failure so it could exit connecting state */
    310     if (status != TI_OK)
    311     {
    312        TRACE0(pConn->hReport, REPORT_SEVERITY_ERROR, "Join command has failed!\n");
    313     }
    314     return status;
    315 }
    316 
    317 
    318 static TI_STATUS JoinWait_to_mlmeWait(void *pData)
    319 {
    320     TI_STATUS status;
    321     paramInfo_t *pParam;
    322     conn_t *pConn = (conn_t *)pData;
    323 
    324     pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
    325     if (!pParam)
    326         return TI_NOK;
    327 
    328     /* Set the BA session policies to the FW */
    329     qosMngr_SetBaPolicies(pConn->hQosMngr);
    330 
    331     pParam->paramType = SITE_MGR_CURRENT_CHANNEL_PARAM;
    332     siteMgr_getParam(pConn->hSiteMgr, pParam);
    333 
    334     pParam->paramType = REGULATORY_DOMAIN_TX_POWER_AFTER_SELECTION_PARAM;
    335     pParam->content.channel = pParam->content.siteMgrCurrentChannel;
    336     regulatoryDomain_setParam(pConn->hRegulatoryDomain, pParam);
    337 
    338     pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
    339     pParam->content.rxDataPortStatus = OPEN_NOTIFY;
    340     status = rxData_setParam(pConn->hRxData, pParam);
    341     if (status != TI_OK)
    342     {
    343         TRACE1( pConn->hReport, REPORT_SEVERITY_FATAL_ERROR, "JoinWait_to_mlmeWait: rxData_setParam return 0x%x.\n", status);
    344         os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
    345         return status;
    346     }
    347 
    348     /* Update TxMgmtQueue SM to open Tx path only for Mgmt packets. */
    349     txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_MGMT);
    350 
    351     /*
    352      * Set the reassociation flag in the association logic.
    353      */
    354     pParam->paramType = MLME_RE_ASSOC_PARAM;
    355 
    356     if( pConn->connType == CONN_TYPE_ROAM )
    357         pParam->content.mlmeReAssoc = TI_TRUE;
    358     else
    359         pParam->content.mlmeReAssoc = TI_FALSE;
    360 
    361     status = mlme_setParam(pConn->hMlmeSm, pParam);
    362 
    363     if (status != TI_OK)
    364     {
    365         TRACE1( pConn->hReport, REPORT_SEVERITY_FATAL_ERROR, "JoinWait_to_mlmeWait: mlme_setParam return 0x%x.\n", status);
    366     }
    367     os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
    368     return mlme_start(pConn->hMlmeSm);
    369 }
    370 
    371 
    372 /* STOP_MLME, SET_DATA_PORT_CLOSE, DIS_JOIN */
    373 static TI_STATUS mlmeWait_to_WaitDisconnect(void *pData)
    374 {
    375     TI_STATUS   status;
    376     paramInfo_t *pParam;
    377     conn_t      *pConn = (conn_t *)pData;
    378 
    379     status = mlme_stop( pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP );
    380     if (status != TI_OK)
    381         return status;
    382 
    383     pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
    384     if (!pParam)
    385         return TI_NOK;
    386 
    387     pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
    388     pParam->content.rxDataPortStatus = CLOSE;
    389     rxData_setParam(pConn->hRxData, pParam);
    390 
    391     /* Update TxMgmtQueue SM to close Tx path. */
    392     txMgmtQ_SetConnState (pConn->hTxMgmtQ, TX_CONN_STATE_CLOSE);
    393 
    394     /* Start the disconnect complete time out timer.
    395        Disconect Complete event, which stops the timer. */
    396     tmr_StartTimer (pConn->hConnTimer, conn_timeout, (TI_HANDLE)pConn, DISCONNECT_TIMEOUT_MSEC, TI_FALSE);
    397 
    398     /* FW will send the disconn frame according to disConnType */
    399     TWD_CmdFwDisconnect (pConn->hTWD, pConn->disConnType, pConn->disConnReasonToAP);
    400 
    401 #ifdef XCC_MODULE_INCLUDED
    402     XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_DISASSOC);
    403 #endif
    404     os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
    405     return TI_OK;
    406 }
    407 
    408 /* This function is called from the WAIT_FOR_JOIN_CB_CMPLT state (before mlme_start)
    409   - all we need to do is call siteMgr_disJoin */
    410 static TI_STATUS JoinWait_to_WaitDisconnect(void *pData)
    411 {
    412     conn_t *pConn = (conn_t *)pData;
    413 
    414     /* Start the disconnect complete time out timer.
    415        Disconect Complete event, which stops the timer. */
    416     tmr_StartTimer (pConn->hConnTimer, conn_timeout, (TI_HANDLE)pConn, DISCONNECT_TIMEOUT_MSEC, TI_FALSE);
    417 
    418     /* FW will send the disconn frame according to disConnType */
    419     TWD_CmdFwDisconnect (pConn->hTWD, pConn->disConnType, pConn->disConnReasonToAP);
    420 
    421    return TI_OK;
    422 }
    423 
    424 /* SET_DATA_PORT_EAPOL, START_RSN */
    425 static TI_STATUS mlmeWait_to_rsnWait(void *pData)
    426 {
    427     TI_STATUS status;
    428     paramInfo_t *pParam;
    429     conn_t *pConn = (conn_t *)pData;
    430 
    431     pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
    432     if (!pParam)
    433         return TI_NOK;
    434 
    435     pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
    436     pParam->content.rxDataPortStatus = OPEN_EAPOL;
    437     status = rxData_setParam(pConn->hRxData, pParam);
    438     os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
    439     if (status != TI_OK)
    440         return status;
    441     /* Update TxMgmtQueue SM to enable EAPOL packets. */
    442     txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_EAPOL);
    443 
    444     /*
    445      *  Notify that the driver is associated to the supplicant\IP stack.
    446      */
    447     EvHandlerSendEvent(pConn->hEvHandler, IPC_EVENT_ASSOCIATED, NULL,0);
    448     status = rsn_start(pConn->hRsn);
    449     return status;
    450 }
    451 
    452 
    453 
    454 /* STOP_RSN, SET_DATA_PORT_CLOSE, STOP_MLME, DIS_JOIN */
    455 static TI_STATUS rsnWait_to_disconnect(void *pData)
    456 {
    457     TI_STATUS status;
    458     paramInfo_t *pParam;
    459     conn_t *pConn = (conn_t *)pData;
    460 
    461     status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys);
    462     if (status != TI_OK)
    463         return status;
    464 
    465     pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
    466     if (!pParam)
    467         return TI_NOK;
    468 
    469     pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
    470     pParam->content.rxDataPortStatus = CLOSE;
    471     status = rxData_setParam(pConn->hRxData, pParam);
    472     os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
    473     if (status != TI_OK)
    474         return status;
    475 
    476     /* Update TxMgmtQueue SM to close Tx path for all except Mgmt packets. */
    477     txMgmtQ_SetConnState (pConn->hTxMgmtQ, TX_CONN_STATE_MGMT);
    478 
    479     status = mlme_stop( pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP );
    480 
    481     if (status != TI_OK)
    482         return status;
    483 
    484     /* send disconnect command to firmware */
    485     prepare_send_disconnect(pData);
    486 
    487     return TI_OK;
    488 }
    489 
    490 
    491 /* STOP_RSN, SET_DATA_PORT_CLOSE, STOP_MLME, DIS_JOIN */
    492 static TI_STATUS configHW_to_disconnect(void *pData)
    493 {
    494     TI_STATUS status;
    495     paramInfo_t *pParam;
    496     conn_t *pConn = (conn_t *)pData;
    497 
    498     status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys );
    499     if (status != TI_OK)
    500         return status;
    501 
    502     pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
    503     if (!pParam)
    504         return TI_NOK;
    505 
    506     pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
    507     pParam->content.rxDataPortStatus = CLOSE;
    508     status = rxData_setParam(pConn->hRxData, pParam);
    509     if (status == TI_OK) {
    510         /* Update TxMgmtQueue SM to close Tx path for all except Mgmt packets. */
    511         txMgmtQ_SetConnState(pConn->hTxMgmtQ, TX_CONN_STATE_MGMT);
    512 
    513         status = mlme_stop(pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP);
    514         if (status == TI_OK) {
    515             pParam->paramType = REGULATORY_DOMAIN_DISCONNECT_PARAM;
    516             regulatoryDomain_setParam(pConn->hRegulatoryDomain, pParam);
    517 
    518             /* Must be called AFTER mlme_stop. since De-Auth packet should be sent with the
    519                 supported rates, and stopModules clears all rates. */
    520             stopModules(pConn, TI_TRUE);
    521 
    522             /* send disconnect command to firmware */
    523             prepare_send_disconnect(pData);
    524         }
    525     }
    526     os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
    527     return status;
    528 }
    529 
    530 static TI_STATUS connInfra_ScrWaitDisconn_to_disconnect(void *pData)
    531 {
    532     TI_STATUS status;
    533     paramInfo_t *pParam;
    534     conn_t *pConn = (conn_t *)pData;
    535 
    536     status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys);
    537     if (status != TI_OK)
    538         return status;
    539 
    540     pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
    541     if (!pParam)
    542         return TI_NOK;
    543 
    544     pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
    545     pParam->content.rxDataPortStatus = CLOSE;
    546     status = rxData_setParam(pConn->hRxData, pParam);
    547     if (status == TI_OK) {
    548         /* Update TxMgmtQueue SM to close Tx path for all except Mgmt packets. */
    549         txMgmtQ_SetConnState(pConn->hTxMgmtQ, TX_CONN_STATE_MGMT);
    550 
    551         pParam->paramType = REGULATORY_DOMAIN_DISCONNECT_PARAM;
    552         regulatoryDomain_setParam(pConn->hRegulatoryDomain, pParam);
    553 
    554         status = mlme_stop(pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP);
    555         if (status == TI_OK) {
    556             /* Must be called AFTER mlme_stop. since De-Auth packet should be sent with the
    557                 supported rates, and stopModules clears all rates. */
    558             stopModules(pConn, TI_TRUE);
    559 
    560             /* send disconnect command to firmware */
    561             prepare_send_disconnect(pData);
    562         }
    563     }
    564     os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
    565     return status;
    566 
    567 }
    568 
    569 
    570 static TI_STATUS rsnWait_to_configHW(void *pData)
    571 {
    572     conn_t *pConn=(conn_t *)pData;
    573     TI_STATUS status;
    574     paramInfo_t *pParam;
    575 
    576     pParam = (paramInfo_t *)os_memoryAlloc(pConn->hOs, sizeof(paramInfo_t));
    577     if (!pParam)
    578         return TI_NOK;
    579 
    580     /* Open the RX to DATA */
    581     pParam->paramType = RX_DATA_PORT_STATUS_PARAM;
    582     pParam->content.rxDataPortStatus = OPEN;
    583     status = rxData_setParam(pConn->hRxData, pParam);
    584     os_memoryFree(pConn->hOs, pParam, sizeof(paramInfo_t));
    585     if (status != TI_OK)
    586          return status;
    587 
    588     status = qosMngr_connect(pConn->hQosMngr);
    589     if (status != TI_OK)
    590     {
    591          TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR, "Infra Conn status=%d, have to return (%d)\n",status,__LINE__);
    592          return status;
    593     }
    594 
    595     status = measurementMgr_connected(pConn->hMeasurementMgr);
    596     if (status != TI_OK)
    597     {
    598          TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR, "Infra Conn status=%d, have to return (%d)\n",status,__LINE__);
    599          return status;
    600     }
    601 
    602     status = TrafficMonitor_Start(pConn->hTrafficMonitor);
    603     if (status != TI_OK)
    604     {
    605          TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR, "Infra Conn status=%d, have to return (%d)\n",status,__LINE__);
    606          return status;
    607     }
    608 
    609     healthMonitor_setState(pConn->hHealthMonitor, HEALTH_MONITOR_STATE_CONNECTED);
    610 
    611     switchChannel_start(pConn->hSwitchChannel);
    612 
    613     scanCncn_SwitchToConnected (pConn->hScanCncn);
    614 
    615     PowerMgr_startPS(pConn->hPwrMngr);
    616 
    617     TRACE1(pConn->hReport, REPORT_SEVERITY_INFORMATION, "rsnWait_to_configHW: setStaStatus %d\n",STA_STATE_CONNECTED);
    618     TWD_CmdSetStaState(pConn->hTWD, STA_STATE_CONNECTED, conn_ConfigHwFinishCb, pData);
    619 
    620     return TI_OK;
    621 }
    622 
    623 /* last command of rsnWait_to_configHW callback */
    624 int conn_ConfigHwFinishCb(TI_HANDLE pData)
    625 {
    626     conn_t *pConn = (conn_t *)pData;
    627 
    628     TRACE0(pConn->hReport, REPORT_SEVERITY_INFORMATION, "conn_MboxFlushFinishCb: called \n");
    629     return conn_infraSMEvent(&pConn->state, CONN_INFRA_HW_CONFIGURED, pConn);
    630 }
    631 
    632 static TI_STATUS configHW_to_connected(void *pData)
    633 {
    634     conn_t          *pConn=(conn_t *)pData;
    635     EScrResourceId  uResourceIndex;
    636 
    637     /* Update TxMgmtQueue SM to open Tx path to all packets. */
    638     txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_OPEN);
    639 
    640 #ifdef XCC_MODULE_INCLUDED
    641     XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_ASSOC_OK);
    642 #endif
    643 
    644     /* Start keep alive process */
    645     siteMgr_start(pConn->hSiteMgr);
    646 
    647     /* free both SCR resources */
    648     for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL;
    649          uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES;
    650          uResourceIndex++)
    651     {
    652         scr_clientComplete(pConn->hScr, SCR_CID_CONNECT, uResourceIndex );
    653         pConn->scrRequested[ uResourceIndex ] = TI_FALSE;
    654     }
    655 
    656     /* Update current BSS connection type and mode */
    657     currBSS_updateConnectedState(pConn->hCurrBss, TI_TRUE, BSS_INFRASTRUCTURE);
    658 
    659     pConn->pConnStatusCB( pConn->connStatCbObj, STATUS_SUCCESSFUL, 0);
    660 
    661     SoftGemini_SetPSmode(pConn->hSoftGemini);
    662 #ifdef REPORT_LOG
    663     TRACE0(pConn->hReport, REPORT_SEVERITY_CONSOLE, "************ NEW CONNECTION ************\n");
    664     WLAN_OS_REPORT(("************ NEW CONNECTION ************\n"));
    665     siteMgr_printPrimarySiteDesc(pConn->hSiteMgr);
    666     TRACE0(pConn->hReport, REPORT_SEVERITY_CONSOLE, "****************************************\n");
    667     WLAN_OS_REPORT(("****************************************\n"));
    668 #else
    669     os_printf("%s: *** NEW CONNECTION ***\n", __func__);
    670 #endif
    671 
    672     return TI_OK;
    673 }
    674 
    675 
    676 static TI_STATUS actionUnexpected(void *pData)
    677 {
    678 #ifdef TI_DBG
    679     conn_t *pConn = (conn_t *)pData;
    680 
    681     TRACE0(pConn->hReport, REPORT_SEVERITY_SM, "State machine error, unexpected Event\n\n");
    682 #endif /*TI_DBG*/
    683 
    684     return TI_OK;
    685 }
    686 
    687 static TI_STATUS actionNop(void *pData)
    688 {
    689     return TI_OK;
    690 }
    691 
    692 
    693 static TI_STATUS connInfra_ScrWait(void *pData)
    694 {
    695     conn_t *pConn = (conn_t *)pData;
    696     EScrClientRequestStatus scrReplyStatus[ SCR_RESOURCE_NUM_OF_RESOURCES ];
    697     EScePendReason          scrPendReason[ SCR_RESOURCE_NUM_OF_RESOURCES ];
    698     EScrResourceId          uResourceIndex;
    699 
    700     TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Connnect SM: Requesting SCR.\n");
    701 
    702     /* request the SCR for both resources, and act according to return status */
    703     for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL;
    704          uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES;
    705          uResourceIndex++)
    706     {
    707         scrReplyStatus[ uResourceIndex ] = scr_clientRequest( pConn->hScr, SCR_CID_CONNECT,
    708                                                               uResourceIndex,
    709                                                               &(scrPendReason[ uResourceIndex ]));
    710         pConn->scrRequested[ uResourceIndex ] = TI_TRUE;
    711 
    712         /* sanity check */
    713         if ((scrReplyStatus[ uResourceIndex ] > SCR_CRS_PEND) ||
    714             (scrReplyStatus[ uResourceIndex ] < SCR_CRS_RUN))
    715         {
    716             TRACE2(pConn->hReport, REPORT_SEVERITY_ERROR , "Idle_to_ScrWait: SCR for resource %d returned status %d\n", uResourceIndex, scrReplyStatus[ uResourceIndex ]);
    717             return TI_NOK;
    718         }
    719     }
    720 
    721     /* analyze SCR results: */
    722     /* both returned run - continue to next stage */
    723     if ((SCR_CRS_RUN == scrReplyStatus[ SCR_RESOURCE_SERVING_CHANNEL ]) &&
    724         (SCR_CRS_RUN == scrReplyStatus[ SCR_RESOURCE_PERIODIC_SCAN ]))
    725     {
    726         /* send an SCR SUCCESS event to the SM */
    727         TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: SCR acquired.\n");
    728         conn_infraSMEvent(&pConn->state, CONN_INFRA_SCR_SUCC, (TI_HANDLE) pConn);
    729     }
    730     else
    731     {
    732         /* mark which resource is pending (or both) */
    733         for (uResourceIndex = SCR_RESOURCE_PERIODIC_SCAN;
    734              uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES;
    735              uResourceIndex++)
    736         {
    737             if (SCR_CRS_PEND == scrReplyStatus[ uResourceIndex ])
    738             {
    739                 TRACE2( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: SCR pending for resource %d with pend reason: %d, stay in wait SCR state.\n", uResourceIndex, scrPendReason);
    740                 pConn->bScrAcquired[ uResourceIndex ] = TI_FALSE;
    741             }
    742             else
    743             {
    744                 pConn->bScrAcquired[ uResourceIndex ] = TI_TRUE;
    745             }
    746         }
    747     }
    748     return TI_OK;
    749 }
    750 
    751 
    752 
    753 void InfraConnSM_ScrCB( TI_HANDLE hConn, EScrClientRequestStatus requestStatus,
    754                         EScrResourceId eResource, EScePendReason pendReason )
    755 {
    756     conn_t *pConn = (conn_t *)hConn;
    757 
    758     TRACE2( pConn->hReport, REPORT_SEVERITY_INFORMATION, "InfraConnSM_ScrCB called by SCR for resource %d. Status is: %d.\n", eResource, requestStatus);
    759 
    760     /* act according to the request staus */
    761     switch ( requestStatus )
    762     {
    763     case SCR_CRS_RUN:
    764         TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: SCR acquired.\n");
    765         /* mark that the SCR was acquired for this resource */
    766         pConn->bScrAcquired[ eResource ] = TI_TRUE;
    767 
    768         /* if both resources had now been acquired */
    769         if ((TI_TRUE == pConn->bScrAcquired[ SCR_RESOURCE_SERVING_CHANNEL ]) &&
    770             (TI_TRUE == pConn->bScrAcquired[ SCR_RESOURCE_PERIODIC_SCAN ]))
    771         {
    772             /* send an SCR SUCCESS event to the SM */
    773             conn_infraSMEvent(&pConn->state, CONN_INFRA_SCR_SUCC, (TI_HANDLE) pConn);
    774         }
    775         break;
    776 
    777     case SCR_CRS_FW_RESET:
    778         /* Ignore FW reset, the MLME SM will handle re-try of the conn */
    779         TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Conn: Recovery occured.\n");
    780         break;
    781 
    782     default:
    783         TRACE3( pConn->hReport, REPORT_SEVERITY_ERROR, "Illegal SCR request status:%d, pend reason:%d, resource: %d.\n", requestStatus, pendReason, eResource);
    784         break;
    785     }
    786 }
    787 
    788 
    789 
    790 static TI_STATUS ScrWait_to_idle(void *pData)
    791 {
    792     conn_t          *pConn = (conn_t *)pData;
    793     EScrResourceId  uResourceIndex;
    794 
    795     TRACE0( pConn->hReport, REPORT_SEVERITY_INFORMATION, "Infra Connnect SM: Stop event while in SCR wait, moving to IDLE.\n");
    796 
    797     /* free both SCR resources */
    798     for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL;
    799          uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES;
    800          uResourceIndex++)
    801     {
    802         scr_clientComplete(pConn->hScr, SCR_CID_CONNECT, uResourceIndex );
    803         pConn->scrRequested[ uResourceIndex ] = TI_FALSE;
    804     }
    805 
    806     /*
    807      * Call the connection lost callback set by the SME or AP_CONN.
    808      */
    809     pConn->pConnStatusCB( pConn->connStatCbObj, pConn->smContext.disAssocEventReason, pConn->smContext.disAssocEventStatusCode);
    810 
    811     return TI_OK;
    812 }
    813 
    814 
    815 static TI_STATUS stopModules( conn_t *pConn, TI_BOOL bDisconnect )
    816 {
    817 
    818     measurementMgr_disconnected(pConn->hMeasurementMgr);
    819 
    820     rxData_stop(pConn->hRxData);
    821 
    822     ctrlData_stop(pConn->hCtrlData);
    823 
    824     TrafficMonitor_Stop(pConn->hTrafficMonitor);
    825 
    826     switchChannel_stop(pConn->hSwitchChannel);
    827 
    828     healthMonitor_setState(pConn->hHealthMonitor, HEALTH_MONITOR_STATE_DISCONNECTED);
    829 
    830     siteMgr_stop(pConn->hSiteMgr);
    831 
    832     /* stopping power save */
    833     PowerMgr_stopPS(pConn->hPwrMngr, bDisconnect);
    834 
    835     scanCncn_SwitchToNotConnected (pConn->hScanCncn);
    836 
    837     /* Set Current BSS Module to stop triggerring roaming events */
    838     currBSS_updateConnectedState(pConn->hCurrBss, TI_FALSE, BSS_INFRASTRUCTURE);
    839 
    840     SoftGemini_unSetPSmode(pConn->hSoftGemini);
    841 
    842     return TI_OK;
    843 }
    844 
    845 
    846 static TI_STATUS prepare_send_disconnect(void *pData)
    847 {
    848     conn_t          *pConn = (conn_t *)pData;
    849 
    850     txCtrlParams_setEapolEncryptionStatus(pConn->hTxCtrl, DEF_EAPOL_ENCRYPTION_STATUS);
    851     qosMngr_disconnect (pConn->hQosMngr, TI_TRUE);
    852 
    853 #ifdef XCC_MODULE_INCLUDED
    854     measurementMgr_disableTsMetrics(pConn->hMeasurementMgr, MAX_NUM_OF_AC);
    855 #endif
    856 
    857     /* Start the disconnect complete time out timer.
    858        Disconect Complete event, which stops the timer. */
    859     tmr_StartTimer (pConn->hConnTimer, conn_timeout, (TI_HANDLE)pConn, DISCONNECT_TIMEOUT_MSEC, TI_FALSE);
    860 
    861     /* FW will send the disconn frame according to disConnType */
    862     TWD_CmdFwDisconnect (pConn->hTWD, pConn->disConnType, pConn->disConnReasonToAP);
    863 
    864 #ifdef XCC_MODULE_INCLUDED
    865     XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_DISASSOC);
    866 #endif
    867 
    868     return TI_OK;
    869 }
    870 
    871 static TI_STATUS connInfra_WaitDisconnectToIdle(void *pData)
    872 {
    873     conn_t          *pConn = (conn_t *)pData;
    874     EScrResourceId  uResourceIndex;
    875 
    876     /* close all BA sessions */
    877     TWD_CloseAllBaSessions(pConn->hTWD);
    878 
    879     /* Stop the disconnect timeout timer. */
    880     tmr_StopTimer (pConn->hConnTimer);
    881 
    882     /*
    883      * In case of connection failuer we might get here without freeing the SCR.
    884      */
    885     for (uResourceIndex = SCR_RESOURCE_SERVING_CHANNEL;
    886          uResourceIndex < SCR_RESOURCE_NUM_OF_RESOURCES;
    887          uResourceIndex++)
    888     {
    889         if (pConn->scrRequested[ uResourceIndex ] == TI_TRUE)
    890         {
    891             scr_clientComplete(pConn->hScr, SCR_CID_CONNECT, uResourceIndex );
    892             pConn->scrRequested[ uResourceIndex ] = TI_FALSE;
    893         }
    894     }
    895 
    896     /*
    897      * Call the connection lost callback set by the SME or AP_CONN.
    898      */
    899     pConn->pConnStatusCB( pConn->connStatCbObj, pConn->smContext.disAssocEventReason, pConn->smContext.disAssocEventStatusCode);
    900 
    901     return TI_OK;
    902 }
    903 
    904 static TI_STATUS connect_to_ScrWait(void *pData)
    905 {
    906     TI_STATUS   status;
    907     paramInfo_t param;
    908     conn_t      *pConn = (conn_t *)pData;
    909 
    910     /*
    911      * This function performs roaming by two steps:
    912      * First - close the current connection without notify the SME.
    913      * Second - start new connection in reassociation mode.
    914      */
    915 
    916     /* close all BA sessions */
    917     TWD_CloseAllBaSessions(pConn->hTWD);
    918 
    919     status = rsn_stop(pConn->hRsn, pConn->disConEraseKeys);
    920     if (status != TI_OK)
    921         return status;
    922 
    923     param.paramType = RX_DATA_PORT_STATUS_PARAM;
    924     param.content.rxDataPortStatus = CLOSE;
    925     status = rxData_setParam(pConn->hRxData, &param);
    926     if (status != TI_OK)
    927         return status;
    928 
    929     /* Update TxMgmtQueue SM to close Tx path. */
    930     txMgmtQ_SetConnState (((conn_t *)pData)->hTxMgmtQ, TX_CONN_STATE_CLOSE);
    931 
    932     status = mlme_stop(pConn->hMlmeSm, DISCONNECT_IMMEDIATE, pConn->disConnReasonToAP);
    933     if (status != TI_OK)
    934         return status;
    935 
    936     param.paramType = REGULATORY_DOMAIN_DISCONNECT_PARAM;
    937     regulatoryDomain_setParam(pConn->hRegulatoryDomain, &param);
    938 
    939 #ifdef XCC_MODULE_INCLUDED
    940     XCCMngr_updateIappInformation(pConn->hXCCMngr, XCC_DISASSOC);
    941 #endif
    942     /* Must be called AFTER mlme_stop. since De-Auth packet should be sent with the
    943         supported rates, and stopModules clears all rates. */
    944     stopModules(pConn, TI_FALSE);
    945 
    946     txCtrlParams_setEapolEncryptionStatus(pConn->hTxCtrl, DEF_EAPOL_ENCRYPTION_STATUS);
    947     qosMngr_disconnect (pConn->hQosMngr, TI_FALSE);
    948 
    949     /*
    950      * Start new connection.
    951      */
    952     connInfra_ScrWait(pConn);
    953 
    954     return TI_OK;
    955 }
    956 
    957 static TI_STATUS Idle_to_Idle(void *pData)
    958 {
    959     conn_t *pConn = (conn_t *)pData;
    960 
    961     /*
    962      * In case we are in IDLE and getting DISCONNECT event, we need to inform
    963      * the SME\AP_connection that we are disconnected.
    964      * Call the connection lost callback set by the SME or AP_CONN.
    965      */
    966     pConn->pConnStatusCB( pConn->connStatCbObj, pConn->smContext.disAssocEventReason, pConn->smContext.disAssocEventStatusCode);
    967 
    968     return TI_OK;
    969 }
    970 
    971 /***********************************************************************
    972                 connInfra_JoinCmpltNotification
    973  ***********************************************************************
    974 DESCRIPTION: Call back upon receving Join Event Complete.
    975 
    976 INPUT:      hSiteMgr    -   site mgr handle.
    977 
    978 OUTPUT:
    979 
    980 RETURN:
    981 ************************************************************************/
    982 TI_STATUS connInfra_JoinCmpltNotification(TI_HANDLE hconn)
    983 {
    984     conn_t *pConn = (conn_t *)hconn;
    985 
    986     TRACE0(pConn->hReport, REPORT_SEVERITY_INFORMATION, "connInfra_JoinCmpltNotification: has been called\n");
    987 
    988    if (pConn->currentConnType == CONNECTION_INFRA ) {
    989        conn_infraSMEvent(&pConn->state, CONN_INFRA_JOIN_CMD_CMPLT, pConn);
    990    }
    991 
    992    return TI_OK;
    993 }
    994 
    995 void connInfra_DisconnectComplete (conn_t *pConn, TI_UINT8  *data, TI_UINT8   dataLength)
    996 {
    997     /* send an DISCONNECT COMPLETE event to the SM */
    998     conn_infraSMEvent(&pConn->state, CONN_INFRA_DISCONN_COMPLETE, (TI_HANDLE) pConn);
    999 }
   1000