164064216a8433360745f69edddce19a606659163The Android Open Source Project/****************************************************************************
264064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
364064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
464064216a8433360745f69edddce19a606659163The Android Open Source Project**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
564064216a8433360745f69edddce19a606659163The Android Open Source Project**| All rights reserved.                                                  |**
664064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
764064216a8433360745f69edddce19a606659163The Android Open Source Project**| Redistribution and use in source and binary forms, with or without    |**
864064216a8433360745f69edddce19a606659163The Android Open Source Project**| modification, are permitted provided that the following conditions    |**
964064216a8433360745f69edddce19a606659163The Android Open Source Project**| are met:                                                              |**
1064064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1164064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions of source code must retain the above copyright     |**
1264064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer.      |**
1364064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions in binary form must reproduce the above copyright  |**
1464064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer in    |**
1564064216a8433360745f69edddce19a606659163The Android Open Source Project**|    the documentation and/or other materials provided with the         |**
1664064216a8433360745f69edddce19a606659163The Android Open Source Project**|    distribution.                                                      |**
1764064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Neither the name Texas Instruments nor the names of its            |**
1864064216a8433360745f69edddce19a606659163The Android Open Source Project**|    contributors may be used to endorse or promote products derived    |**
1964064216a8433360745f69edddce19a606659163The Android Open Source Project**|    from this software without specific prior written permission.      |**
2064064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
2164064216a8433360745f69edddce19a606659163The Android Open Source Project**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
2264064216a8433360745f69edddce19a606659163The Android Open Source Project**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
2364064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
2464064216a8433360745f69edddce19a606659163The Android Open Source Project**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
2564064216a8433360745f69edddce19a606659163The Android Open Source Project**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
2664064216a8433360745f69edddce19a606659163The Android Open Source Project**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
2764064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
2864064216a8433360745f69edddce19a606659163The Android Open Source Project**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
2964064216a8433360745f69edddce19a606659163The Android Open Source Project**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
3064064216a8433360745f69edddce19a606659163The Android Open Source Project**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
3164064216a8433360745f69edddce19a606659163The Android Open Source Project**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
3264064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
3364064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
3464064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************/
3564064216a8433360745f69edddce19a606659163The Android Open Source Project
3664064216a8433360745f69edddce19a606659163The Android Open Source Project
3764064216a8433360745f69edddce19a606659163The Android Open Source Project/*******************************************************************************/
3864064216a8433360745f69edddce19a606659163The Android Open Source Project/*                                                                             */
3964064216a8433360745f69edddce19a606659163The Android Open Source Project/*  MODULE:  recoveryMgr.c                                                     */
4064064216a8433360745f69edddce19a606659163The Android Open Source Project/*  PURPOSE: The responsibility of RecoveryMgr module is to provide main API   */
4164064216a8433360745f69edddce19a606659163The Android Open Source Project/*           to HelthMonitor that invokes the recovery process if failure is   */
4264064216a8433360745f69edddce19a606659163The Android Open Source Project/*           detected. It performs disable/enable inputs from outside, calls   */
4364064216a8433360745f69edddce19a606659163The Android Open Source Project/*           restart of TWD and informs STAD modules that recovery has been    */
4464064216a8433360745f69edddce19a606659163The Android Open Source Project/*           performed.                                                        */
4564064216a8433360745f69edddce19a606659163The Android Open Source Project/*                                                                             */
4664064216a8433360745f69edddce19a606659163The Android Open Source Project/*******************************************************************************/
4764064216a8433360745f69edddce19a606659163The Android Open Source Project
4864064216a8433360745f69edddce19a606659163The Android Open Source Project#include "paramOut.h"
4964064216a8433360745f69edddce19a606659163The Android Open Source Project#include "osApi.h"
5064064216a8433360745f69edddce19a606659163The Android Open Source Project#include "DataCtrl_Api.h"
5164064216a8433360745f69edddce19a606659163The Android Open Source Project#include "report.h"
5264064216a8433360745f69edddce19a606659163The Android Open Source Project#include "recoveryMgr.h"
5364064216a8433360745f69edddce19a606659163The Android Open Source Project#include "recoveryMgr_API.h"
5464064216a8433360745f69edddce19a606659163The Android Open Source Project#include "TNETW_Driver_api.h"
5564064216a8433360745f69edddce19a606659163The Android Open Source Project
5664064216a8433360745f69edddce19a606659163The Android Open Source Project#include "healthMonitor.h"
5764064216a8433360745f69edddce19a606659163The Android Open Source Project#include "PowerMgr_API.h"
5864064216a8433360745f69edddce19a606659163The Android Open Source Project#include "siteMgrApi.h"
5964064216a8433360745f69edddce19a606659163The Android Open Source Project#include "currBss.h"
6064064216a8433360745f69edddce19a606659163The Android Open Source Project#include "whalCtrl.h"
6164064216a8433360745f69edddce19a606659163The Android Open Source Project
6264064216a8433360745f69edddce19a606659163The Android Open Source Project#include "TNETW_Driver.h"
6364064216a8433360745f69edddce19a606659163The Android Open Source Project#include "TNETWIF.h"
6464064216a8433360745f69edddce19a606659163The Android Open Source Project#include "SoftGeminiApi.h"
6564064216a8433360745f69edddce19a606659163The Android Open Source Project
6664064216a8433360745f69edddce19a606659163The Android Open Source Project/* static function */
6764064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef USE_RECOVERY
6864064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic void recoveryMgr_SM(TI_HANDLE hRecoveryMgr);
6964064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic TI_STATUS recoveryMgr_notifyStadAboutRecovery(TI_HANDLE hRecoveryMgr);
7064064216a8433360745f69edddce19a606659163The Android Open Source Project#endif /* USE_RECOVERY */
7164064216a8433360745f69edddce19a606659163The Android Open Source Project
7264064216a8433360745f69edddce19a606659163The Android Open Source Project/*******************************************************************************
7364064216a8433360745f69edddce19a606659163The Android Open Source Project*                       PUBLIC  FUNCTIONS  IMPLEMENTATION                      *
7464064216a8433360745f69edddce19a606659163The Android Open Source Project********************************************************************************/
7564064216a8433360745f69edddce19a606659163The Android Open Source Project
7664064216a8433360745f69edddce19a606659163The Android Open Source Project/*************************************************************************
7764064216a8433360745f69edddce19a606659163The Android Open Source Project*                        recoveryMgr_create                              *
7864064216a8433360745f69edddce19a606659163The Android Open Source Project**************************************************************************
7964064216a8433360745f69edddce19a606659163The Android Open Source Project* DESCRIPTION:  This function initializes the RecoveryMgr module.
8064064216a8433360745f69edddce19a606659163The Android Open Source Project*
8164064216a8433360745f69edddce19a606659163The Android Open Source Project* INPUT:        hOs - handle to Os Abstraction Layer
8264064216a8433360745f69edddce19a606659163The Android Open Source Project*
8364064216a8433360745f69edddce19a606659163The Android Open Source Project* RETURN:       Handle to the allocated RecoveryMgr module
8464064216a8433360745f69edddce19a606659163The Android Open Source Project*************************************************************************/
8564064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_HANDLE recoveryMgr_create(TI_HANDLE hOs)
8664064216a8433360745f69edddce19a606659163The Android Open Source Project{
8764064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef USE_RECOVERY
8864064216a8433360745f69edddce19a606659163The Android Open Source Project    recoverMgr_t *hRecoveryMgr;
8964064216a8433360745f69edddce19a606659163The Android Open Source Project
9064064216a8433360745f69edddce19a606659163The Android Open Source Project    /* allocate RecoverMgr module */
9164064216a8433360745f69edddce19a606659163The Android Open Source Project    hRecoveryMgr = os_memoryAlloc(hOs, (sizeof(recoverMgr_t)));
9264064216a8433360745f69edddce19a606659163The Android Open Source Project
9364064216a8433360745f69edddce19a606659163The Android Open Source Project    if(!hRecoveryMgr)
9464064216a8433360745f69edddce19a606659163The Android Open Source Project    {
9564064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_OS_REPORT(("Error allocating the RecoverMgr Module\n"));
9664064216a8433360745f69edddce19a606659163The Android Open Source Project        return NULL;
9764064216a8433360745f69edddce19a606659163The Android Open Source Project    }
9864064216a8433360745f69edddce19a606659163The Android Open Source Project
9964064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Reset RecoverMgr module */
10064064216a8433360745f69edddce19a606659163The Android Open Source Project    os_memoryZero(hOs, hRecoveryMgr, (sizeof(recoverMgr_t)));
10164064216a8433360745f69edddce19a606659163The Android Open Source Project
10264064216a8433360745f69edddce19a606659163The Android Open Source Project    hRecoveryMgr->hOs = hOs;
10364064216a8433360745f69edddce19a606659163The Android Open Source Project
10464064216a8433360745f69edddce19a606659163The Android Open Source Project    return(hRecoveryMgr);
10564064216a8433360745f69edddce19a606659163The Android Open Source Project#else
10664064216a8433360745f69edddce19a606659163The Android Open Source Project    return NULL;
10764064216a8433360745f69edddce19a606659163The Android Open Source Project#endif /* USE_RECOVERY */
10864064216a8433360745f69edddce19a606659163The Android Open Source Project} /* recoveryMgr_create */
10964064216a8433360745f69edddce19a606659163The Android Open Source Project
11064064216a8433360745f69edddce19a606659163The Android Open Source Project
11164064216a8433360745f69edddce19a606659163The Android Open Source Project
11264064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************
11364064216a8433360745f69edddce19a606659163The Android Open Source Project*                           recoveryMgr_config                             *
11464064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************
11564064216a8433360745f69edddce19a606659163The Android Open Source Project* DESCRIPTION:  This function configures the recoveryMgr module
11664064216a8433360745f69edddce19a606659163The Android Open Source Project*
11764064216a8433360745f69edddce19a606659163The Android Open Source Project* RETURNS:      OK - Configuration successful
11864064216a8433360745f69edddce19a606659163The Android Open Source Project*               NOK - Configuration unsuccessful
11964064216a8433360745f69edddce19a606659163The Android Open Source Project***************************************************************************/
12064064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS recoveryMgr_config(TI_HANDLE hRecoveryMgr,
12164064216a8433360745f69edddce19a606659163The Android Open Source Project                             TI_HANDLE hReport,
12264064216a8433360745f69edddce19a606659163The Android Open Source Project                             TI_HANDLE hTxData,
12364064216a8433360745f69edddce19a606659163The Android Open Source Project                             TI_HANDLE hTnetwDrv,
12464064216a8433360745f69edddce19a606659163The Android Open Source Project                             TI_HANDLE hScr,
12564064216a8433360745f69edddce19a606659163The Android Open Source Project                             TI_HANDLE hCurrBss,
12664064216a8433360745f69edddce19a606659163The Android Open Source Project                             TI_HANDLE hPowerMgr,
12764064216a8433360745f69edddce19a606659163The Android Open Source Project                             TI_HANDLE hHealthMonitor,
12864064216a8433360745f69edddce19a606659163The Android Open Source Project							 TI_HANDLE hSoftGemini)
12964064216a8433360745f69edddce19a606659163The Android Open Source Project{
13064064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef USE_RECOVERY
13164064216a8433360745f69edddce19a606659163The Android Open Source Project    recoverMgr_t *pRecoverMgr = (recoverMgr_t *)hRecoveryMgr;
13264064216a8433360745f69edddce19a606659163The Android Open Source Project
13364064216a8433360745f69edddce19a606659163The Android Open Source Project    /* configure modules handles */
13464064216a8433360745f69edddce19a606659163The Android Open Source Project    pRecoverMgr->hReport = hReport;
13564064216a8433360745f69edddce19a606659163The Android Open Source Project    pRecoverMgr->hTxData = hTxData;
13664064216a8433360745f69edddce19a606659163The Android Open Source Project    pRecoverMgr->hTnetwDrv = hTnetwDrv;
13764064216a8433360745f69edddce19a606659163The Android Open Source Project    pRecoverMgr->hScr = hScr;
13864064216a8433360745f69edddce19a606659163The Android Open Source Project    pRecoverMgr->hCurrBss = hCurrBss;
13964064216a8433360745f69edddce19a606659163The Android Open Source Project    pRecoverMgr->hPowerMgr = hPowerMgr;
14064064216a8433360745f69edddce19a606659163The Android Open Source Project
14164064216a8433360745f69edddce19a606659163The Android Open Source Project    pRecoverMgr->hHealthMonitor = hHealthMonitor;
14264064216a8433360745f69edddce19a606659163The Android Open Source Project	pRecoverMgr->hSoftGemini = hSoftGemini;
14364064216a8433360745f69edddce19a606659163The Android Open Source Project
14464064216a8433360745f69edddce19a606659163The Android Open Source Project    pRecoverMgr->fRecoveryInProcess = FALSE;
14564064216a8433360745f69edddce19a606659163The Android Open Source Project    pRecoverMgr->smState = REC_MGR_STATE_IDLE;
14664064216a8433360745f69edddce19a606659163The Android Open Source Project
14764064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INIT(pRecoverMgr->hReport, RECOVERY_MGR_MODULE_LOG,
14864064216a8433360745f69edddce19a606659163The Android Open Source Project        (".....RecoveryMgr configured successfully\n"));
14964064216a8433360745f69edddce19a606659163The Android Open Source Project#endif /* USE_RECOVERY */
15064064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
15164064216a8433360745f69edddce19a606659163The Android Open Source Project} /* recoveryMgr_config */
15264064216a8433360745f69edddce19a606659163The Android Open Source Project
15364064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************
15464064216a8433360745f69edddce19a606659163The Android Open Source Project*                           recoveryMgr_destroy                            *
15564064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************
15664064216a8433360745f69edddce19a606659163The Android Open Source Project* DESCRIPTION:  This function unload the RecoverMgr module. It frees
15764064216a8433360745f69edddce19a606659163The Android Open Source Project*               the RecoveryMgr module
15864064216a8433360745f69edddce19a606659163The Android Open Source Project*
15964064216a8433360745f69edddce19a606659163The Android Open Source Project* INPUTS:       hRecoveryMgr - the object
16064064216a8433360745f69edddce19a606659163The Android Open Source Project*
16164064216a8433360745f69edddce19a606659163The Android Open Source Project* OUTPUT:
16264064216a8433360745f69edddce19a606659163The Android Open Source Project*
16364064216a8433360745f69edddce19a606659163The Android Open Source Project* RETURNS:      OK - Unload succesfull
16464064216a8433360745f69edddce19a606659163The Android Open Source Project*               NOK - Unload unsuccesfull
16564064216a8433360745f69edddce19a606659163The Android Open Source Project***************************************************************************/
16664064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS recoveryMgr_destroy(TI_HANDLE hRecoveryMgr)
16764064216a8433360745f69edddce19a606659163The Android Open Source Project{
16864064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef USE_RECOVERY
16964064216a8433360745f69edddce19a606659163The Android Open Source Project    recoverMgr_t *pRecoverMgr = (recoverMgr_t *)hRecoveryMgr;
17064064216a8433360745f69edddce19a606659163The Android Open Source Project
17164064216a8433360745f69edddce19a606659163The Android Open Source Project    /* free RecoverMgr Module */
17264064216a8433360745f69edddce19a606659163The Android Open Source Project    os_memoryFree(pRecoverMgr->hOs, pRecoverMgr, sizeof(recoverMgr_t));
17364064216a8433360745f69edddce19a606659163The Android Open Source Project#endif /* USE_RECOVERY */
17464064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
17564064216a8433360745f69edddce19a606659163The Android Open Source Project}
17664064216a8433360745f69edddce19a606659163The Android Open Source Project
17764064216a8433360745f69edddce19a606659163The Android Open Source Project
17864064216a8433360745f69edddce19a606659163The Android Open Source Project/**********************************************************************************************
17964064216a8433360745f69edddce19a606659163The Android Open Source Project *                  recoveryMgr_SM()
18064064216a8433360745f69edddce19a606659163The Android Open Source Project **********************************************************************************************
18164064216a8433360745f69edddce19a606659163The Android Open Source Project * DESCRIPTION:
18264064216a8433360745f69edddce19a606659163The Android Open Source Project   ============
18364064216a8433360745f69edddce19a606659163The Android Open Source Project    This is the recoveryMgr state machine.
18464064216a8433360745f69edddce19a606659163The Android Open Source Project    The inceptive event for RecoveryMgr SM is invoking the recovery process by HelthMonitor.
18564064216a8433360745f69edddce19a606659163The Android Open Source Project    After disabling Outside Inputs and starting TWD Restart, RecoveryMgr SM waits end of TWD Restart,
18664064216a8433360745f69edddce19a606659163The Android Open Source Project    then informs STAD about recovery and enables Outside Inputs.
18764064216a8433360745f69edddce19a606659163The Android Open Source Project    The SM supports both Sync and Async accesses to the HW.
18864064216a8433360745f69edddce19a606659163The Android Open Source Project    It loops and progresses from state to state as long as the HW is accessed synchronously.
18964064216a8433360745f69edddce19a606659163The Android Open Source Project    Once the access is Asynchronous (TNETWIF_PENDING), it exits and is called later
19064064216a8433360745f69edddce19a606659163The Android Open Source Project      by the TNETWIF when the HW is ready.
19164064216a8433360745f69edddce19a606659163The Android Open Source Project    That's why it uses unspecified-mode accesses (e.g. TNETWIF_ReadMemOpt) which
19264064216a8433360745f69edddce19a606659163The Android Open Source Project      selects either Sync or Async automatically according to the platform and length.
19364064216a8433360745f69edddce19a606659163The Android Open Source Project    Yet, the short transactions (EOB and Interrupt-Request 32 bit writes) are done using Sync
19464064216a8433360745f69edddce19a606659163The Android Open Source Project      access to simplify the SM
19564064216a8433360745f69edddce19a606659163The Android Open Source Project    NOTE: MCS projects may require full Sync/Async support, so the Sync accesses may need to be modified.
19664064216a8433360745f69edddce19a606659163The Android Open Source Project
19764064216a8433360745f69edddce19a606659163The Android Open Source Project    NOTE:  The recoveryMgr-SM detailed description is provided in "CE-2.0 Recovery LLD.doc".
19864064216a8433360745f69edddce19a606659163The Android Open Source Project
19964064216a8433360745f69edddce19a606659163The Android Open Source Project **********************************************************************************************/
20064064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef USE_RECOVERY
20164064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic void recoveryMgr_SM(TI_HANDLE hRecoveryMgr)
20264064216a8433360745f69edddce19a606659163The Android Open Source Project{
20364064216a8433360745f69edddce19a606659163The Android Open Source Project    recoverMgr_t        *pRecoverMgr = (recoverMgr_t *)hRecoveryMgr;
20464064216a8433360745f69edddce19a606659163The Android Open Source Project    healthMonitor_t     *pHealthMonitor = (healthMonitor_t *)pRecoverMgr->hHealthMonitor;
20564064216a8433360745f69edddce19a606659163The Android Open Source Project
20664064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef TI_DBG
20764064216a8433360745f69edddce19a606659163The Android Open Source Project    if (hRecoveryMgr == NULL)
20864064216a8433360745f69edddce19a606659163The Android Open Source Project    {
20964064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR(pRecoverMgr->hReport, RECOVERY_MGR_MODULE_LOG,
21064064216a8433360745f69edddce19a606659163The Android Open Source Project                          ("recoveryMgr_SM(): ****  Called with NULL handle!!  ****\n"));
21164064216a8433360745f69edddce19a606659163The Android Open Source Project        return;
21264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
21364064216a8433360745f69edddce19a606659163The Android Open Source Project#endif /* TI_DBG */
21464064216a8433360745f69edddce19a606659163The Android Open Source Project
21564064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION(pRecoverMgr->hReport, RECOVERY_MGR_MODULE_LOG,
21664064216a8433360745f69edddce19a606659163The Android Open Source Project                            ("recoveryMgr_SM(): smState=%d\n", pRecoverMgr->smState));
21764064216a8433360745f69edddce19a606659163The Android Open Source Project
21864064216a8433360745f69edddce19a606659163The Android Open Source Project    /*
21964064216a8433360745f69edddce19a606659163The Android Open Source Project     * Loop through the states sequence as long as the process is synchronous.
22064064216a8433360745f69edddce19a606659163The Android Open Source Project     * Exit when finished or if an Asynchronous process is required. In this case
22164064216a8433360745f69edddce19a606659163The Android Open Source Project     *   the SM process will be resumed later (called back by TNETWIF).
22264064216a8433360745f69edddce19a606659163The Android Open Source Project     */
22364064216a8433360745f69edddce19a606659163The Android Open Source Project    switch (pRecoverMgr->smState)
22464064216a8433360745f69edddce19a606659163The Android Open Source Project    {
22564064216a8433360745f69edddce19a606659163The Android Open Source Project
22664064216a8433360745f69edddce19a606659163The Android Open Source Project        case REC_MGR_STATE_IDLE:
22764064216a8433360745f69edddce19a606659163The Android Open Source Project            WLAN_REPORT_INFORMATION(pRecoverMgr->hReport, RECOVERY_MGR_MODULE_LOG,
22864064216a8433360745f69edddce19a606659163The Android Open Source Project                                    (".....REC_MGR_STATE_IDLE\n"));
22964064216a8433360745f69edddce19a606659163The Android Open Source Project
23064064216a8433360745f69edddce19a606659163The Android Open Source Project            healthMonitor_suspendPeriodicTest(pRecoverMgr->hHealthMonitor);
23164064216a8433360745f69edddce19a606659163The Android Open Source Project
23264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* disabling Outside Inputs and starting TWD Restart */
23364064216a8433360745f69edddce19a606659163The Android Open Source Project            pRecoverMgr->fDisableInputsFromOs = TRUE;
23464064216a8433360745f69edddce19a606659163The Android Open Source Project
23564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* suspend TX */
23664064216a8433360745f69edddce19a606659163The Android Open Source Project            txData_stop(pHealthMonitor->hTxData);
23764064216a8433360745f69edddce19a606659163The Android Open Source Project
23864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* Disabling the IRQ line so the recovery will be an atomic action */
23964064216a8433360745f69edddce19a606659163The Android Open Source Project            os_disableIrq (pRecoverMgr->hOs);
24064064216a8433360745f69edddce19a606659163The Android Open Source Project
24164064216a8433360745f69edddce19a606659163The Android Open Source Project            pRecoverMgr->smState = REC_MGR_STATE_WAIT_TWD_RESTART;
24264064216a8433360745f69edddce19a606659163The Android Open Source Project
24364064216a8433360745f69edddce19a606659163The Android Open Source Project            TnetwDrv_StartRecovery(pRecoverMgr->hTnetwDrv,
24464064216a8433360745f69edddce19a606659163The Android Open Source Project                                   (void*)recoveryMgr_endOfRecovery,
24564064216a8433360745f69edddce19a606659163The Android Open Source Project                                   hRecoveryMgr);
24664064216a8433360745f69edddce19a606659163The Android Open Source Project
24764064216a8433360745f69edddce19a606659163The Android Open Source Project            return;
24864064216a8433360745f69edddce19a606659163The Android Open Source Project
24964064216a8433360745f69edddce19a606659163The Android Open Source Project        case REC_MGR_STATE_WAIT_TWD_RESTART:
25064064216a8433360745f69edddce19a606659163The Android Open Source Project            WLAN_REPORT_INFORMATION(pRecoverMgr->hReport, RECOVERY_MGR_MODULE_LOG,
25164064216a8433360745f69edddce19a606659163The Android Open Source Project                        (".....REC_MGR_STATE_WAIT_TWD_RESTART\n"));
25264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* informs STAD about recovery */
25364064216a8433360745f69edddce19a606659163The Android Open Source Project            recoveryMgr_notifyStadAboutRecovery(hRecoveryMgr);
25464064216a8433360745f69edddce19a606659163The Android Open Source Project
25564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* TX resume */
25664064216a8433360745f69edddce19a606659163The Android Open Source Project            txData_startAfterRecovery(pHealthMonitor->hTxData);
25764064216a8433360745f69edddce19a606659163The Android Open Source Project
25864064216a8433360745f69edddce19a606659163The Android Open Source Project            pRecoverMgr->fDisableInputsFromOs = FALSE;
25964064216a8433360745f69edddce19a606659163The Android Open Source Project
26064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* call inside CmdMBox_SetModeNormal */
26164064216a8433360745f69edddce19a606659163The Android Open Source Project            whalCtrl_exitFromInitMode(((healthMonitor_t *)pRecoverMgr->hHealthMonitor)->hHalCtrl);
26264064216a8433360745f69edddce19a606659163The Android Open Source Project
26364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send the min power level to the FW */
26464064216a8433360745f69edddce19a606659163The Android Open Source Project            MacServices_powerAutho_ExitFromInit(((TnetwDrv_t *)pRecoverMgr->hTnetwDrv)->hMacServices);
26564064216a8433360745f69edddce19a606659163The Android Open Source Project
26664064216a8433360745f69edddce19a606659163The Android Open Source Project			/* Soft Gemini Section */
26764064216a8433360745f69edddce19a606659163The Android Open Source Project			SoftGemini_handleRecovery(pRecoverMgr->hSoftGemini);
26864064216a8433360745f69edddce19a606659163The Android Open Source Project
26964064216a8433360745f69edddce19a606659163The Android Open Source Project            WLAN_OS_REPORT((".....recoveryMgr: End Of Recovery\n"));
27064064216a8433360745f69edddce19a606659163The Android Open Source Project
27164064216a8433360745f69edddce19a606659163The Android Open Source Project            healthMonitor_resumePeriodicTest(pRecoverMgr->hHealthMonitor);
27264064216a8433360745f69edddce19a606659163The Android Open Source Project
27364064216a8433360745f69edddce19a606659163The Android Open Source Project            pRecoverMgr->fRecoveryInProcess = FALSE;
27464064216a8433360745f69edddce19a606659163The Android Open Source Project
27564064216a8433360745f69edddce19a606659163The Android Open Source Project            pRecoverMgr->smState = REC_MGR_STATE_IDLE;
27664064216a8433360745f69edddce19a606659163The Android Open Source Project            return; /* recovery process ended */
27764064216a8433360745f69edddce19a606659163The Android Open Source Project
27864064216a8433360745f69edddce19a606659163The Android Open Source Project        default:
27964064216a8433360745f69edddce19a606659163The Android Open Source Project                WLAN_REPORT_ERROR(pRecoverMgr->hReport, RECOVERY_MGR_MODULE_LOG,
28064064216a8433360745f69edddce19a606659163The Android Open Source Project                    ("recoveryMgr_SM(): Unexpected state, smState=%d\n", pRecoverMgr->smState));
28164064216a8433360745f69edddce19a606659163The Android Open Source Project            return;
28264064216a8433360745f69edddce19a606659163The Android Open Source Project
28364064216a8433360745f69edddce19a606659163The Android Open Source Project    }  /* switch (pRecoverMgr->smState) */
28464064216a8433360745f69edddce19a606659163The Android Open Source Project} /* recoveryMgr_SM */
28564064216a8433360745f69edddce19a606659163The Android Open Source Project#endif /* USE_RECOVERY */
28664064216a8433360745f69edddce19a606659163The Android Open Source Project
28764064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************
28864064216a8433360745f69edddce19a606659163The Android Open Source Project*                           recoveryMgr_recoveryProcess                    *
28964064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************
29064064216a8433360745f69edddce19a606659163The Android Open Source Project* DESCRIPTION:  Main interface that called if the WLAN driver detects error
29164064216a8433360745f69edddce19a606659163The Android Open Source Project*               during the Monitoring process.
29264064216a8433360745f69edddce19a606659163The Android Open Source Project*
29364064216a8433360745f69edddce19a606659163The Android Open Source Project* INPUTS:       hRecoveryMgr - the object
29464064216a8433360745f69edddce19a606659163The Android Open Source Project*
29564064216a8433360745f69edddce19a606659163The Android Open Source Project* OUTPUT:
29664064216a8433360745f69edddce19a606659163The Android Open Source Project*
29764064216a8433360745f69edddce19a606659163The Android Open Source Project* RETURNS:      OK - Recovery Process started
29864064216a8433360745f69edddce19a606659163The Android Open Source Project*               NOK - Recovery cannot started because it's in process already
29964064216a8433360745f69edddce19a606659163The Android Open Source Project***************************************************************************/
30064064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS recoveryMgr_recoveryProcess(TI_HANDLE hRecoveryMgr)
30164064216a8433360745f69edddce19a606659163The Android Open Source Project{
30264064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef USE_RECOVERY
30364064216a8433360745f69edddce19a606659163The Android Open Source Project    recoverMgr_t *pRecoverMgr = (recoverMgr_t *)hRecoveryMgr;
30464064216a8433360745f69edddce19a606659163The Android Open Source Project    healthMonitor_t     *pHealthMonitor = (healthMonitor_t *)pRecoverMgr->hHealthMonitor;
30564064216a8433360745f69edddce19a606659163The Android Open Source Project    WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)pHealthMonitor->hHalCtrl;
30664064216a8433360745f69edddce19a606659163The Android Open Source Project    WlanParams_T *pWlanParams = whal_ParamsGetWlanParams(pWhalCtrl->pWhalParams);
30764064216a8433360745f69edddce19a606659163The Android Open Source Project
30864064216a8433360745f69edddce19a606659163The Android Open Source Project    if(!pWlanParams->RecoveryEnable)
30964064216a8433360745f69edddce19a606659163The Android Open Source Project    {
31064064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_OS_REPORT(("recoveryMgr_recoveryProcess: Recovery is disabled in tiwlan.ini, abort recovery process\n"));
31164064216a8433360745f69edddce19a606659163The Android Open Source Project        return OK;
31264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
31364064216a8433360745f69edddce19a606659163The Android Open Source Project    else
31464064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_OS_REPORT((".....recoveryMgr_recoveryProcess\n"));
31564064216a8433360745f69edddce19a606659163The Android Open Source Project
31664064216a8433360745f69edddce19a606659163The Android Open Source Project    if(pRecoverMgr->fRecoveryInProcess == FALSE)
31764064216a8433360745f69edddce19a606659163The Android Open Source Project    {
31864064216a8433360745f69edddce19a606659163The Android Open Source Project        pHealthMonitor->numOfRecoveryPerformed++;
31964064216a8433360745f69edddce19a606659163The Android Open Source Project        pRecoverMgr->fRecoveryInProcess = TRUE;
32064064216a8433360745f69edddce19a606659163The Android Open Source Project        recoveryMgr_SM(hRecoveryMgr);
32164064216a8433360745f69edddce19a606659163The Android Open Source Project        return OK;
32264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
32364064216a8433360745f69edddce19a606659163The Android Open Source Project    else
32464064216a8433360745f69edddce19a606659163The Android Open Source Project    {
32564064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR(pRecoverMgr->hReport, RECOVERY_MGR_MODULE_LOG,
32664064216a8433360745f69edddce19a606659163The Android Open Source Project            ("recoveryProcess(): ****  Recovery in process already!!  ****\n"));
32764064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
32864064216a8433360745f69edddce19a606659163The Android Open Source Project    }
32964064216a8433360745f69edddce19a606659163The Android Open Source Project#else
33064064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
33164064216a8433360745f69edddce19a606659163The Android Open Source Project#endif /* USE_RECOVERY */
33264064216a8433360745f69edddce19a606659163The Android Open Source Project} /* recoveryMgr_recoveryProcess */
33364064216a8433360745f69edddce19a606659163The Android Open Source Project
33464064216a8433360745f69edddce19a606659163The Android Open Source Project
33564064216a8433360745f69edddce19a606659163The Android Open Source Project
33664064216a8433360745f69edddce19a606659163The Android Open Source Project
33764064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************
33864064216a8433360745f69edddce19a606659163The Android Open Source Project*                           recoveryMgr_endOfRecovery                      *
33964064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************
34064064216a8433360745f69edddce19a606659163The Android Open Source Project* DESCRIPTION:  This function is the CB from the RecoveryCtrl that will
34164064216a8433360745f69edddce19a606659163The Android Open Source Project*               issue the "EndOfTwdRestart" event to the RecoveryMgr SM.
34264064216a8433360745f69edddce19a606659163The Android Open Source Project*               Indicates that TWD has performed its recovery.
34364064216a8433360745f69edddce19a606659163The Android Open Source Project*
34464064216a8433360745f69edddce19a606659163The Android Open Source Project* INPUTS:       hRecoveryMgr - the object
34564064216a8433360745f69edddce19a606659163The Android Open Source Project*
34664064216a8433360745f69edddce19a606659163The Android Open Source Project* OUTPUT:
34764064216a8433360745f69edddce19a606659163The Android Open Source Project*
34864064216a8433360745f69edddce19a606659163The Android Open Source Project* RETURNS:      OK - succesfull
34964064216a8433360745f69edddce19a606659163The Android Open Source Project*               NOK - unsuccesfull
35064064216a8433360745f69edddce19a606659163The Android Open Source Project***************************************************************************/
35164064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS recoveryMgr_endOfRecovery(TI_HANDLE hRecoveryMgr)
35264064216a8433360745f69edddce19a606659163The Android Open Source Project{
35364064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef USE_RECOVERY
35464064216a8433360745f69edddce19a606659163The Android Open Source Project    recoverMgr_t *pRecoverMgr = (recoverMgr_t *)hRecoveryMgr;
35564064216a8433360745f69edddce19a606659163The Android Open Source Project
35664064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INIT(pRecoverMgr->hReport, RECOVERY_MGR_MODULE_LOG,
35764064216a8433360745f69edddce19a606659163The Android Open Source Project        (".....recoveryMgr_endOfRecovery\n"));
35864064216a8433360745f69edddce19a606659163The Android Open Source Project
35964064216a8433360745f69edddce19a606659163The Android Open Source Project    recoveryMgr_SM(hRecoveryMgr);
36064064216a8433360745f69edddce19a606659163The Android Open Source Project#endif /* USE_RECOVERY */
36164064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
36264064216a8433360745f69edddce19a606659163The Android Open Source Project} /* recoveryMgr_endOfRecovery */
36364064216a8433360745f69edddce19a606659163The Android Open Source Project
36464064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************
36564064216a8433360745f69edddce19a606659163The Android Open Source Project*                 recoveryMgr_notifyStadAboutRecovery                      *
36664064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************
36764064216a8433360745f69edddce19a606659163The Android Open Source Project* DESCRIPTION:  Inform STAD that recovery has been performed: inform TX,
36864064216a8433360745f69edddce19a606659163The Android Open Source Project*               SCR, Current BSS and Power Mgr about FW reset.
36964064216a8433360745f69edddce19a606659163The Android Open Source Project*
37064064216a8433360745f69edddce19a606659163The Android Open Source Project* INPUTS:       hRecoveryMgr - the object
37164064216a8433360745f69edddce19a606659163The Android Open Source Project*
37264064216a8433360745f69edddce19a606659163The Android Open Source Project* OUTPUT:
37364064216a8433360745f69edddce19a606659163The Android Open Source Project*
37464064216a8433360745f69edddce19a606659163The Android Open Source Project* RETURNS:      OK - succesfull
37564064216a8433360745f69edddce19a606659163The Android Open Source Project*               NOK - unsuccesfull
37664064216a8433360745f69edddce19a606659163The Android Open Source Project***************************************************************************/
37764064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef USE_RECOVERY
37864064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic TI_STATUS recoveryMgr_notifyStadAboutRecovery(TI_HANDLE hRecoveryMgr)
37964064216a8433360745f69edddce19a606659163The Android Open Source Project{
38064064216a8433360745f69edddce19a606659163The Android Open Source Project    recoverMgr_t *pRecoverMgr = (recoverMgr_t *)hRecoveryMgr;
38164064216a8433360745f69edddce19a606659163The Android Open Source Project    healthMonitor_t     *pHealthMonitor = (healthMonitor_t *)pRecoverMgr->hHealthMonitor;
38264064216a8433360745f69edddce19a606659163The Android Open Source Project
38364064216a8433360745f69edddce19a606659163The Android Open Source Project    txData_recoveryIndication (pHealthMonitor->hTxData);
38464064216a8433360745f69edddce19a606659163The Android Open Source Project    TnetwDrv_RecoveryCtrlBlk(pHealthMonitor->hTnetwDrv);
38564064216a8433360745f69edddce19a606659163The Android Open Source Project
38664064216a8433360745f69edddce19a606659163The Android Open Source Project    scr_notifyFWReset( pRecoverMgr->hScr );
38764064216a8433360745f69edddce19a606659163The Android Open Source Project    currBSS_performRecovery(pRecoverMgr->hCurrBss);
38864064216a8433360745f69edddce19a606659163The Android Open Source Project    PowerMgr_notifyFWReset(pRecoverMgr->hPowerMgr);
38964064216a8433360745f69edddce19a606659163The Android Open Source Project
39064064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
39164064216a8433360745f69edddce19a606659163The Android Open Source Project} /* recoveryMgr_notifyStadAboutRecovery */
39264064216a8433360745f69edddce19a606659163The Android Open Source Project#endif /* USE_RECOVERY */
39364064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************
39464064216a8433360745f69edddce19a606659163The Android Open Source Project*                           recoveryMgr_recoveryProcess                    *
39564064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************
39664064216a8433360745f69edddce19a606659163The Android Open Source Project* DESCRIPTION:  check if Inputs From OS are Disabled.
39764064216a8433360745f69edddce19a606659163The Android Open Source Project*
39864064216a8433360745f69edddce19a606659163The Android Open Source Project* INPUTS:       hRecoveryMgr - the object
39964064216a8433360745f69edddce19a606659163The Android Open Source Project*
40064064216a8433360745f69edddce19a606659163The Android Open Source Project* OUTPUT:
40164064216a8433360745f69edddce19a606659163The Android Open Source Project*
40264064216a8433360745f69edddce19a606659163The Android Open Source Project* RETURN:       TRUE  - Inputs From OS are Disabled
40364064216a8433360745f69edddce19a606659163The Android Open Source Project*               FALSE - Inputs From OS are not Disabled
40464064216a8433360745f69edddce19a606659163The Android Open Source Project***************************************************************************/
40564064216a8433360745f69edddce19a606659163The Android Open Source ProjectBOOL recoveryMgr_areInputsFromOsDisabled(TI_HANDLE hRecoveryMgr)
40664064216a8433360745f69edddce19a606659163The Android Open Source Project{
40764064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef USE_RECOVERY
40864064216a8433360745f69edddce19a606659163The Android Open Source Project    recoverMgr_t *pRecoverMgr = (recoverMgr_t *)hRecoveryMgr;
40964064216a8433360745f69edddce19a606659163The Android Open Source Project
41064064216a8433360745f69edddce19a606659163The Android Open Source Project    return (pRecoverMgr->fDisableInputsFromOs);
41164064216a8433360745f69edddce19a606659163The Android Open Source Project#else
41264064216a8433360745f69edddce19a606659163The Android Open Source Project    return FALSE;
41364064216a8433360745f69edddce19a606659163The Android Open Source Project#endif /* USE_RECOVERY */
41464064216a8433360745f69edddce19a606659163The Android Open Source Project} /* recoveryMgr_recoveryProcess */
41564064216a8433360745f69edddce19a606659163The Android Open Source Project
41664064216a8433360745f69edddce19a606659163The Android Open Source Project
41764064216a8433360745f69edddce19a606659163The Android Open Source Project
418