summaryrefslogtreecommitdiff
path: root/wl1271/stad/src/Ctrl_Interface/DrvMain.c
diff options
context:
space:
mode:
Diffstat (limited to 'wl1271/stad/src/Ctrl_Interface/DrvMain.c')
-rw-r--r--wl1271/stad/src/Ctrl_Interface/DrvMain.c1766
1 files changed, 0 insertions, 1766 deletions
diff --git a/wl1271/stad/src/Ctrl_Interface/DrvMain.c b/wl1271/stad/src/Ctrl_Interface/DrvMain.c
deleted file mode 100644
index 3ce112d..0000000
--- a/wl1271/stad/src/Ctrl_Interface/DrvMain.c
+++ /dev/null
@@ -1,1766 +0,0 @@
-/*
- * DrvMain.c
- *
- * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name Texas Instruments nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/** \file DrvMain.c
- * \brief The DrvMain module. Handles driver init, stop and recovery processes.
- *
- * \see DrvMain.h
- */
-
-#define __FILE_ID__ FILE_ID_49
-#include "tidef.h"
-#include "osApi.h"
-#include "report.h"
-#include "context.h"
-#include "timer.h"
-#include "CmdHndlr.h"
-#include "DrvMain.h"
-#include "scrApi.h"
-#include "EvHandler.h"
-#include "connApi.h"
-#include "siteMgrApi.h"
-#include "sme.h"
-#include "SoftGeminiApi.h"
-#include "roamingMngrApi.h"
-#include "qosMngr_API.h"
-#include "TrafficMonitor.h"
-#include "PowerMgr_API.h"
-#include "EvHandler.h"
-#include "apConn.h"
-#include "currBss.h"
-#include "SwitchChannelApi.h"
-#include "ScanCncn.h"
-#include "healthMonitor.h"
-#include "scanMngrApi.h"
-#include "regulatoryDomainApi.h"
-#include "measurementMgrApi.h"
-#ifdef XCC_MODULE_INCLUDED
-#include "XCCMngr.h"
-#endif
-#include "TxnQueue.h"
-#include "TWDriver.h"
-#include "debug.h"
-#include "host_platform.h"
-#include "StaCap.h"
-#include "WlanDrvCommon.h"
-#include "DrvMainModules.h"
-#include "CmdDispatcher.h"
-
-
-#define SM_WATCHDOG_TIME_MS 20000 /* SM processes timeout is 20 sec. */
-
-#define SDIO_CONNECT_THRESHOLD 8
-
-/* This is used to prevent endless recovery loops */
-#define MAX_NUM_OF_RECOVERY_TRIGGERS 5
-
-/* Handle failure status from the SM callbacks by triggering the SM with FAILURE event */
-#define HANDLE_CALLBACKS_FAILURE_STATUS(hDrvMain, eStatus) \
- if (eStatus != TI_OK) { drvMain_SmEvent (hDrvMain, SM_EVENT_FAILURE); return; }
-
-/* The DrvMain SM states */
-typedef enum
-{
- /* 0 */ SM_STATE_IDLE,
- /* 1 */ SM_STATE_WAIT_INI_FILE,
- /* 2 */ SM_STATE_WAIT_NVS_FILE,
- /* 3 */ SM_STATE_HW_INIT,
- /* 4 */ SM_STATE_DOWNLOAD_FW_FILE,
- /* 5 */ SM_STATE_WAIT_FW_FILE,
- /* 6 */ SM_STATE_FW_INIT,
- /* 7 */ SM_STATE_FW_CONFIG,
- /* 8 */ SM_STATE_OPERATIONAL,
- /* 9 */ SM_STATE_DISCONNECTING,
- /* 10 */ SM_STATE_STOPPING,
- /* 11 */ SM_STATE_STOPPED,
- /* 12 */ SM_STATE_STOPPING_ON_FAIL,
- /* 13 */ SM_STATE_FAILED
-
-} ESmState;
-
-/* The DrvMain SM events */
-typedef enum
-{
- /* 0 */ SM_EVENT_START,
- /* 1 */ SM_EVENT_INI_FILE_READY,
- /* 2 */ SM_EVENT_NVS_FILE_READY,
- /* 3 */ SM_EVENT_HW_INIT_COMPLETE,
- /* 4 */ SM_EVENT_FW_FILE_READY,
- /* 5 */ SM_EVENT_FW_INIT_COMPLETE,
- /* 6 */ SM_EVENT_FW_CONFIG_COMPLETE,
- /* 7 */ SM_EVENT_STOP,
- /* 8 */ SM_EVENT_RECOVERY,
- /* 9 */ SM_EVENT_DISCONNECTED,
- /* 10 */ SM_EVENT_STOP_COMPLETE,
- /* 11 */ SM_EVENT_FAILURE
-
-} ESmEvent;
-
-/* The module's object */
-typedef struct
-{
- TStadHandlesList tStadHandles; /* All STAD modules handles (distributed in driver init process) */
- TI_BOOL bRecovery; /* Indicates if we are during recovery process */
- TI_UINT32 uNumOfRecoveryAttempts; /* Indicates if we are during recovery process */
- ESmState eSmState; /* The DrvMain SM state. */
- ESmEvent ePendingEvent;/* A pending event issued when the SM is busy */
- TI_UINT32 uPendingEventsCount; /* Counts the number of events pending for SM execution */
- TFileInfo tFileInfo; /* Information of last file retrieved by os_GetFile() */
- TI_UINT32 uContextId; /* ID allocated to this module on registration to context module */
- EActionType eAction; /* The last action (start/stop) inserted to the driver */
- void *hSignalObj; /* The signal object used for waiting for action completion */
- TBusDrvCfg tBusDrvCfg; /* A union (struc per each supported bus type) for the bus driver configuration */
- TI_UINT32 uRxDmaBufLen; /* The bus driver Rx DMA buffer length (needed as a limit for Rx aggregation length) */
- TI_UINT32 uTxDmaBufLen; /* The bus driver Tx DMA buffer length (needed as a limit for Tx aggregation length) */
-
-} TDrvMain;
-
-
-static void drvMain_Init (TI_HANDLE hDrvMain);
-static void drvMain_InitHwCb (TI_HANDLE hDrvMain, TI_STATUS eStatus);
-static void drvMain_InitFwCb (TI_HANDLE hDrvMain, TI_STATUS eStatus);
-static void drvMain_ConfigFwCb (TI_HANDLE hDrvMain, TI_STATUS eStatus);
-static void drvMain_TwdStopCb (TI_HANDLE hDrvMain, TI_STATUS eStatus);
-static void drvMain_InitFailCb (TI_HANDLE hDrvMain, TI_STATUS eStatus);
-static void drvMain_InitLocals (TDrvMain *pDrvMain);
-/* static void drvMain_SmWatchdogTimeout (TI_HANDLE hDrvMain); */
-static void drvMain_SmEvent (TI_HANDLE hDrvMain, ESmEvent eEvent);
-static void drvMain_Sm (TI_HANDLE hDrvMain, ESmEvent eEvent);
-
-/* External functions prototypes */
-
-/** \brief WLAN Driver I/F Get file
- *
- * \param hOs - OS module object handle
- * \param pFileInfo - Pointer to output file information
- * \return TI_OK on success or TI_NOK on failure
- *
- * \par Description
- * This function provides access to a requested init file:
- * It provides the requested file information and call the requester callback.
- * Note that in Linux the files were previously loaded to driver memory by the loader
- *
- * \sa
- */
-extern int wlanDrvIf_GetFile (TI_HANDLE hOs, TFileInfo *pFileInfo);
-/** \brief WLAN Driver I/F Update Driver State
- *
- * \param hOs - OS module object handle
- * \param eDriverState - New Driver State
- * \return void
- *
- * \par Description
- * This function Update the driver state (Idle | Running | Stopped |Failed):
- *
- * \sa
- */
-extern void wlanDrvIf_UpdateDriverState (TI_HANDLE hOs, EDriverSteadyState eDriverState);
-/** \brief WLAN Driver I/F Set MAC Address
- *
- * \param hOs - OS module object handle
- * \param pMacAddr - Pointer to MAC address to set
- * \return void
- *
- * \par Description
- * This function Update the driver MAC address by copy it to the network interface structure
- *
- * \sa
- */
-extern void wlanDrvIf_SetMacAddress (TI_HANDLE hOs, TI_UINT8 *pMacAddr);
-/** \brief OS Init Table INI File
- *
- * \param hOs - OS module object handle
- * \param InitTable - Pointer to initialization table
- * \param file_buf - Pointer to Input buffer from INI file
- * \param file_length - Length of input buffer from INI file
- * \return void
- *
- * \par Description
- * This function perform Initializing of init table accrding to data from INI file and driver defaults
- *
- * \sa
- */
-extern int osInitTable_IniFile (TI_HANDLE hOs, TInitTable *InitTable, char *file_buf, int file_length);
-
-
-
-/*
- * \fn drvMain_Create
- * \brief Create the driver modules
- *
- * Create all STAD and TWD modules.
- * Then call all modules init functions which initializes their handles and variables.
- *
- * \note
- * \param hOs - Handle to the Os Abstraction Layer
- * \param pDrvMainHndl - Pointer for returning the DrvMain handle.
- * \param pCmdHndlr - Pointer for returning the CmdHndlr handle.
- * \param pContext - Pointer for returning the Context handle.
- * \param pTxDataQ - Pointer for returning the TxDataQ handle.
- * \param pTxMgmtQ - Pointer for returning the TxMgmtQ handle.
- * \param pTxCtrl - Pointer for returning the TxCtrl handle.
- * \param pTwd - Pointer for returning the TWD handle.
- * \param pEvHandler - Pointer for returning the EvHndler handle.
- * \return Handle to the DrvMain module (NULL if failed)
- * \sa
- */
-TI_STATUS drvMain_Create (TI_HANDLE hOs,
- TI_HANDLE *pDrvMainHndl,
- TI_HANDLE *pCmdHndlr,
- TI_HANDLE *pContext,
- TI_HANDLE *pTxDataQ,
- TI_HANDLE *pTxMgmtQ,
- TI_HANDLE *pTxCtrl,
- TI_HANDLE *pTwd,
- TI_HANDLE *pEvHandler,
- TI_HANDLE *pCmdDispatch,
- TI_HANDLE *pReport)
-{
- /* Create the DrvMain module object. */
- TDrvMain *pDrvMain = (TDrvMain *) os_memoryAlloc (hOs, sizeof(TDrvMain));
-
- if (pDrvMain == NULL)
- {
- return TI_NOK;
- }
-
- os_memoryZero (hOs, (void *)pDrvMain, sizeof(TDrvMain));
-
- pDrvMain->tStadHandles.hDrvMain = (TI_HANDLE)pDrvMain;
- pDrvMain->tStadHandles.hOs = hOs;
-
-/*
- * Create all driver modules
- * =========================
- */
-
- pDrvMain->tStadHandles.hContext = context_Create (hOs);
- if (pDrvMain->tStadHandles.hContext == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hTimer = tmr_Create (hOs);
- if (pDrvMain->tStadHandles.hTimer == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hSCR = scr_create (hOs);
- if (pDrvMain->tStadHandles.hSCR == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hTxnQ = txnQ_Create (hOs);
- if (pDrvMain->tStadHandles.hTxnQ == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hEvHandler = EvHandler_Create (hOs);
- if (pDrvMain->tStadHandles.hEvHandler == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hReport = report_Create (hOs);
- if (pDrvMain->tStadHandles.hReport == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hConn = conn_create (hOs);
- if (pDrvMain->tStadHandles.hConn == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hScanCncn = scanCncn_Create (hOs);
- if (pDrvMain->tStadHandles.hScanCncn == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hSme = sme_Create (hOs);
- if (pDrvMain->tStadHandles.hSme == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hSiteMgr = siteMgr_create (hOs);
- if (pDrvMain->tStadHandles.hSiteMgr == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hMlmeSm = mlme_create (hOs);
- if (pDrvMain->tStadHandles.hMlmeSm == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hAuth = auth_create (hOs);
- if (pDrvMain->tStadHandles.hAuth == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hAssoc = assoc_create (hOs);
- if (pDrvMain->tStadHandles.hAssoc == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hRxData = rxData_create (hOs);
- if (pDrvMain->tStadHandles.hRxData == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hTxCtrl = txCtrl_Create (hOs);
- if (pDrvMain->tStadHandles.hTxCtrl == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hTxDataQ = txDataQ_Create(hOs);
- if (pDrvMain->tStadHandles.hTxDataQ == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hTxMgmtQ = txMgmtQ_Create(hOs);
- if (pDrvMain->tStadHandles.hTxMgmtQ == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hTxPort = txPort_create (hOs);
- if (pDrvMain->tStadHandles.hTxPort == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hCtrlData = ctrlData_create (hOs);
- if (pDrvMain->tStadHandles.hCtrlData == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hTrafficMon = TrafficMonitor_create (hOs);
- if (pDrvMain->tStadHandles.hTrafficMon == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hRsn = rsn_create (hOs);
- if (pDrvMain->tStadHandles.hRsn == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hRegulatoryDomain = regulatoryDomain_create (hOs);
- if (pDrvMain->tStadHandles.hRegulatoryDomain == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hMeasurementMgr = measurementMgr_create (hOs);
- if (pDrvMain->tStadHandles.hMeasurementMgr == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hSoftGemini = SoftGemini_create (hOs);
- if (pDrvMain->tStadHandles.hSoftGemini == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
-#ifdef XCC_MODULE_INCLUDED
- pDrvMain->tStadHandles.hXCCMngr = XCCMngr_create (hOs);
- if (pDrvMain->tStadHandles.hXCCMngr == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-#else
- pDrvMain->tStadHandles.hXCCMngr = NULL;
-#endif
-
- pDrvMain->tStadHandles.hRoamingMngr = roamingMngr_create (hOs);
- if (pDrvMain->tStadHandles.hRoamingMngr == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hAPConnection = apConn_create (hOs);
- if (pDrvMain->tStadHandles.hAPConnection == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hCurrBss = currBSS_create (hOs);
- if (pDrvMain->tStadHandles.hCurrBss == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hQosMngr = qosMngr_create (hOs);
- if (pDrvMain->tStadHandles.hQosMngr == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hPowerMgr = PowerMgr_create (hOs);
- if (pDrvMain->tStadHandles.hPowerMgr == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hSwitchChannel = switchChannel_create (hOs);
- if (pDrvMain->tStadHandles.hSwitchChannel == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hScanMngr = scanMngr_create (hOs);
- if (NULL == pDrvMain->tStadHandles.hScanMngr)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hHealthMonitor = healthMonitor_create (hOs);
- if (NULL == pDrvMain->tStadHandles.hHealthMonitor)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hTWD = TWD_Create (hOs);
- if (pDrvMain->tStadHandles.hTWD == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hCmdHndlr = cmdHndlr_Create (hOs, pDrvMain->tStadHandles.hEvHandler);
- if (pDrvMain->tStadHandles.hCmdHndlr == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hCmdDispatch = cmdDispatch_Create (hOs);
- if (pDrvMain->tStadHandles.hCmdDispatch == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- pDrvMain->tStadHandles.hStaCap = StaCap_Create (hOs);
- if (pDrvMain->tStadHandles.hStaCap == NULL)
- {
- drvMain_Destroy (pDrvMain);
- return TI_NOK;
- }
-
- /* Bind all modules handles */
- drvMain_Init ((TI_HANDLE)pDrvMain);
-
-
- /* Provide required handles to the OAL */
- *pDrvMainHndl = (TI_HANDLE)pDrvMain;
- *pCmdHndlr = pDrvMain->tStadHandles.hCmdHndlr;
- *pContext = pDrvMain->tStadHandles.hContext;
- *pTxDataQ = pDrvMain->tStadHandles.hTxDataQ;
- *pTxMgmtQ = pDrvMain->tStadHandles.hTxMgmtQ;
- *pTxCtrl = pDrvMain->tStadHandles.hTxCtrl;
- *pTwd = pDrvMain->tStadHandles.hTWD;
- *pEvHandler = pDrvMain->tStadHandles.hEvHandler;
- *pReport = pDrvMain->tStadHandles.hReport;
- *pCmdDispatch = pDrvMain->tStadHandles.hCmdDispatch;
-
- WLAN_INIT_REPORT (("drvMain_Create: success\n"));
-
- return TI_OK;
-}
-
-/*
- * \fn drvMain_Destroy
- * \brief Destroy driver
- *
- * Destroy all STAD and TWD modules and resources.
- *
- * \note
- * \param hDrvMain - The DrvMain object
- * \return TI_OK if succeeded, TI_NOK if failed.
- * \sa drvMain_Create
- */
-TI_STATUS drvMain_Destroy (TI_HANDLE hDrvMain)
-{
- TDrvMain *pDrvMain = (TDrvMain *)hDrvMain;
-
- hPlatform_Wlan_Hardware_DeInit ();
-
- if (pDrvMain == NULL)
- {
- return TI_NOK;
- }
-
- if (pDrvMain->tStadHandles.hScanMngr != NULL)
- {
- scanMngr_unload (pDrvMain->tStadHandles.hScanMngr);
- }
-
- if (pDrvMain->tStadHandles.hSiteMgr != NULL)
- {
- siteMgr_unLoad (pDrvMain->tStadHandles.hSiteMgr);
- }
-
- if (pDrvMain->tStadHandles.hSme != NULL)
- {
- sme_Destroy (pDrvMain->tStadHandles.hSme);
- }
-
- if (pDrvMain->tStadHandles.hConn != NULL)
- {
- conn_unLoad (pDrvMain->tStadHandles.hConn);
- }
-
- if (pDrvMain->tStadHandles.hTWD != NULL)
- {
- TWD_Destroy (pDrvMain->tStadHandles.hTWD);
- }
-
- if (pDrvMain->tStadHandles.hScanCncn != NULL)
- {
- scanCncn_Destroy (pDrvMain->tStadHandles.hScanCncn);
- }
-
- if (pDrvMain->tStadHandles.hTrafficMon != NULL)
- {
- TrafficMonitor_Destroy (pDrvMain->tStadHandles.hTrafficMon);
- }
-
- if (pDrvMain->tStadHandles.hCtrlData != NULL)
- {
- ctrlData_unLoad (pDrvMain->tStadHandles.hCtrlData);
- }
-
- if (pDrvMain->tStadHandles.hTxCtrl != NULL)
- {
- txCtrl_Unload (pDrvMain->tStadHandles.hTxCtrl);
- }
-
- if (pDrvMain->tStadHandles.hTxDataQ != NULL)
- {
- txDataQ_Destroy (pDrvMain->tStadHandles.hTxDataQ);
- }
-
- if (pDrvMain->tStadHandles.hTxMgmtQ != NULL)
- {
- txMgmtQ_Destroy (pDrvMain->tStadHandles.hTxMgmtQ);
- }
-
- if (pDrvMain->tStadHandles.hTxPort != NULL)
- {
- txPort_unLoad (pDrvMain->tStadHandles.hTxPort);
- }
-
- if (pDrvMain->tStadHandles.hRxData != NULL)
- {
- rxData_unLoad (pDrvMain->tStadHandles.hRxData);
- }
-
- if (pDrvMain->tStadHandles.hAssoc != NULL)
- {
- assoc_unload (pDrvMain->tStadHandles.hAssoc);
- }
-
- if (pDrvMain->tStadHandles.hAuth != NULL)
- {
- auth_unload (pDrvMain->tStadHandles.hAuth);
- }
-
- if (pDrvMain->tStadHandles.hMlmeSm != NULL)
- {
- mlme_unload (pDrvMain->tStadHandles.hMlmeSm);
- }
-
- if (pDrvMain->tStadHandles.hSCR != NULL)
- {
- scr_release (pDrvMain->tStadHandles.hSCR);
- }
-
-
- if (pDrvMain->tStadHandles.hRsn != NULL)
- {
- rsn_unload (pDrvMain->tStadHandles.hRsn);
- }
-
- if (pDrvMain->tStadHandles.hRegulatoryDomain != NULL)
- {
- regulatoryDomain_destroy (pDrvMain->tStadHandles.hRegulatoryDomain);
- }
-
- if (pDrvMain->tStadHandles.hMeasurementMgr != NULL)
- {
- measurementMgr_destroy (pDrvMain->tStadHandles.hMeasurementMgr);
- }
-
- if (pDrvMain->tStadHandles.hSoftGemini != NULL)
- {
- SoftGemini_destroy (pDrvMain->tStadHandles.hSoftGemini);
- }
-
-#ifdef XCC_MODULE_INCLUDED
- if (pDrvMain->tStadHandles.hXCCMngr != NULL)
- {
- XCCMngr_unload (pDrvMain->tStadHandles.hXCCMngr);
- }
-#endif
-
- if (pDrvMain->tStadHandles.hRoamingMngr != NULL)
- {
- roamingMngr_unload (pDrvMain->tStadHandles.hRoamingMngr);
- }
-
- if (pDrvMain->tStadHandles.hQosMngr != NULL)
- {
- qosMngr_destroy (pDrvMain->tStadHandles.hQosMngr);
- }
-
- if (pDrvMain->tStadHandles.hPowerMgr != NULL)
- {
- PowerMgr_destroy (pDrvMain->tStadHandles.hPowerMgr);
- }
-
- if (pDrvMain->tStadHandles.hAPConnection != NULL)
- {
- apConn_unload (pDrvMain->tStadHandles.hAPConnection);
- }
-
- if (pDrvMain->tStadHandles.hCurrBss != NULL)
- {
- currBSS_unload (pDrvMain->tStadHandles.hCurrBss);
- }
-
- if (pDrvMain->tStadHandles.hSwitchChannel != NULL)
- {
- switchChannel_unload (pDrvMain->tStadHandles.hSwitchChannel);
- }
-
- if (pDrvMain->tStadHandles.hHealthMonitor != NULL)
- {
- healthMonitor_unload (pDrvMain->tStadHandles.hHealthMonitor);
- }
-
- if (pDrvMain->tStadHandles.hCmdHndlr && pDrvMain->tStadHandles.hEvHandler)
- {
- cmdHndlr_Destroy (pDrvMain->tStadHandles.hCmdHndlr, pDrvMain->tStadHandles.hEvHandler);
- }
-
- if (pDrvMain->tStadHandles.hEvHandler != NULL)
- {
- EvHandlerUnload (pDrvMain->tStadHandles.hEvHandler);
- }
-
- if (pDrvMain->tStadHandles.hCmdDispatch)
- {
- cmdDispatch_Destroy (pDrvMain->tStadHandles.hCmdDispatch);
- }
-
- if (pDrvMain->tStadHandles.hTxnQ != NULL)
- {
- txnQ_Destroy (pDrvMain->tStadHandles.hTxnQ);
- }
- /* Note: The Timer module must be destroyed last, so all created timers are already destroyed!! */
- if (pDrvMain->tStadHandles.hTimer != NULL)
- {
- tmr_Destroy (pDrvMain->tStadHandles.hTimer);
- }
-
- /* Note: Moved after timers for locks */
- if (pDrvMain->tStadHandles.hContext != NULL)
- {
- context_Destroy (pDrvMain->tStadHandles.hContext);
- }
-
- if (pDrvMain->tStadHandles.hStaCap != NULL)
- {
- StaCap_Destroy (pDrvMain->tStadHandles.hStaCap);
- }
-
- if (pDrvMain->tStadHandles.hReport != NULL)
- {
- report_Unload (pDrvMain->tStadHandles.hReport);
- }
-
- /* Destroy the DrvMain object */
- os_memoryFree (pDrvMain->tStadHandles.hOs, hDrvMain, sizeof(TDrvMain));
-
- return TI_OK;
-}
-
-void drvMain_SmeStop (TI_HANDLE hDrvMain)
-{
- drvMain_SmEvent (hDrvMain, SM_EVENT_DISCONNECTED);
-}
-
-
-/*
- * \fn drvMain_Init
- * \brief Init driver modules
- *
- * Called from OS context following the driver creation.
- * Calls all STAD and TWD modules Init functions, which are saving other modules handles,
- * registering to other modules and initializing their variables.
- *
- * \note
- * \param hDrvMain - The DrvMain object
- * \return void
- * \sa drvMain_Create
- */
-static void drvMain_Init (TI_HANDLE hDrvMain)
-{
- TDrvMain *pDrvMain = (TDrvMain *) hDrvMain;
- TStadHandlesList *pModules = &pDrvMain->tStadHandles; /* The STAD modules handles list */
-
- /*
- * Init all modules handles, variables and registries
- */
- context_Init (pModules->hContext, pModules->hOs, pModules->hReport);
- tmr_Init (pModules->hTimer, pModules->hOs, pModules->hReport, pModules->hContext);
- txnQ_Init (pModules->hTxnQ, pModules->hOs, pModules->hReport, pModules->hContext);
- scr_init (pModules);
- conn_init (pModules);
- ctrlData_init (pModules,
- #ifdef XCC_MODULE_INCLUDED
- XCCMngr_LinkTestRetriesUpdate, pModules->hXCCMngr);
- #else
- NULL, NULL);
- #endif
- siteMgr_init (pModules);
- regulatoryDomain_init (pModules);
- scanCncn_Init (pModules);
- auth_init (pModules);
- mlme_init (pModules);
- assoc_init (pModules);
- rxData_init (pModules);
- txCtrl_Init (pModules);
- txDataQ_Init (pModules);
- txMgmtQ_Init (pModules);
- txPort_init (pModules);
- TrafficMonitor_Init (pModules, 1000 /* pInitTable->trafficMonitorMinIntervalPercentage */);
- sme_Init (pModules);
- rsn_init (pModules);
- measurementMgr_init (pModules);
-#ifdef XCC_MODULE_INCLUDED
- XCCMngr_init (pModules);
-#endif
- scanMngr_init (pModules);
- currBSS_init (pModules);
- apConn_init (pModules);
- roamingMngr_init (pModules);
- qosMngr_init (pModules);
- switchChannel_init (pModules);
- healthMonitor_init (pModules);
- PowerMgr_init (pModules);
- SoftGemini_init (pModules);
- cmdDispatch_Init (pModules);
- StaCap_Init (pModules);
- cmdHndlr_Init (pModules);
-
- /* Init TWD component (handles, variables and registries) and provide callbacks for next steps */
- TWD_Init (pModules->hTWD,
- pModules->hReport,
- pModules->hDrvMain,
- pModules->hTimer,
- pModules->hContext,
- pModules->hTxnQ,
- (TTwdCallback)drvMain_InitHwCb,
- (TTwdCallback)drvMain_InitFwCb,
- (TTwdCallback)drvMain_ConfigFwCb,
- (TTwdCallback)drvMain_TwdStopCb,
- (TTwdCallback)drvMain_InitFailCb);
-
- /* Init DrvMain module local variables */
- drvMain_InitLocals (pDrvMain);
-}
-
-
-/*
- * \fn drvMain_SetDefaults
- * \brief Set driver default configuration
- *
- * Configure all STAD and TWD modules with their default settings from the ini-file.
- * Timers creation is also done at this stage.
- *
- * \note
- * \param hDrvMain - The DrvMain object
- * \param pBuf - The ini-file data.
- * \param uLength - The ini-file length.
- * \return TI_OK if succeeded, TI_NOK if failed.
- * \sa drvMain_Init
- */
-static TI_STATUS drvMain_SetDefaults (TI_HANDLE hDrvMain, TI_UINT8 *pBuf, TI_UINT32 uLength)
-{
- TDrvMain *pDrvMain = (TDrvMain *) hDrvMain;
- TInitTable *pInitTable;
- TI_STATUS eStatus;
-
- pInitTable = os_memoryAlloc (pDrvMain->tStadHandles.hOs, sizeof(TInitTable));
-
- /* Parse defaults */
- eStatus = osInitTable_IniFile (pDrvMain->tStadHandles.hOs, pInitTable, (char*)pBuf, (int)uLength);
-
- /*
- * Configure modules with their default settings
- */
- report_SetDefaults (pDrvMain->tStadHandles.hReport, &pInitTable->tReport);
- context_SetDefaults (pDrvMain->tStadHandles.hContext, &pInitTable->tContextInitParams);
- TWD_SetDefaults (pDrvMain->tStadHandles.hTWD, &pInitTable->twdInitParams);
- conn_SetDefaults (pDrvMain->tStadHandles.hConn, &pInitTable->connInitParams);
- ctrlData_SetDefaults (pDrvMain->tStadHandles.hCtrlData, &pInitTable->ctrlDataInitParams);
- regulatoryDomain_SetDefaults (pDrvMain->tStadHandles.hRegulatoryDomain, &pInitTable->regulatoryDomainInitParams);
- scanCncn_SetDefaults (pDrvMain->tStadHandles.hScanCncn, &pInitTable->tScanCncnInitParams);
- auth_SetDefaults (pDrvMain->tStadHandles.hAuth, &pInitTable->authInitParams);
- assoc_SetDefaults (pDrvMain->tStadHandles.hAssoc, &pInitTable->assocInitParams);
- rxData_SetDefaults (pDrvMain->tStadHandles.hRxData, &pInitTable->rxDataInitParams);
- sme_SetDefaults (pDrvMain->tStadHandles.hSme, &pInitTable->tSmeModifiedInitParams, &pInitTable->tSmeInitParams);
- rsn_SetDefaults (pDrvMain->tStadHandles.hRsn, &pInitTable->rsnInitParams);
- measurementMgr_SetDefaults (pDrvMain->tStadHandles.hMeasurementMgr, &pInitTable->measurementInitParams);
-#ifdef XCC_MODULE_INCLUDED
- XCCMngr_SetDefaults (pDrvMain->tStadHandles.hXCCMngr, &pInitTable->XCCMngrParams);
-#endif /*XCC_MODULE_INCLUDED*/
- apConn_SetDefaults (pDrvMain->tStadHandles.hAPConnection, &pInitTable->apConnParams);
- qosMngr_SetDefaults (pDrvMain->tStadHandles.hQosMngr, &pInitTable->qosMngrInitParams);
- switchChannel_SetDefaults (pDrvMain->tStadHandles.hSwitchChannel, &pInitTable->SwitchChannelInitParams);
- healthMonitor_SetDefaults (pDrvMain->tStadHandles.hHealthMonitor, &pInitTable->healthMonitorInitParams);
- PowerMgr_SetDefaults (pDrvMain->tStadHandles.hPowerMgr, &pInitTable->PowerMgrInitParams);
- SoftGemini_SetDefaults (pDrvMain->tStadHandles.hSoftGemini, &pInitTable->SoftGeminiInitParams);
- txDataQ_SetDefaults (pDrvMain->tStadHandles.hTxDataQ, &pInitTable->txDataInitParams);
- txCtrl_SetDefaults (pDrvMain->tStadHandles.hTxCtrl, &pInitTable->txDataInitParams);
- currBSS_SetDefaults (pDrvMain->tStadHandles.hCurrBss, &pInitTable->tCurrBssInitParams);
- mlme_SetDefaults (pDrvMain->tStadHandles.hMlmeSm, &pInitTable->tMlmeInitParams);
-
- scanMngr_SetDefaults(pDrvMain->tStadHandles.hScanMngr, &pInitTable->tRoamScanMngrInitParams);
- roamingMngr_setDefaults(pDrvMain->tStadHandles.hRoamingMngr, &pInitTable->tRoamScanMngrInitParams);
-
- /* Note: The siteMgr_SetDefaults includes many settings that relate to other modules so keep it last!! */
- siteMgr_SetDefaults (pDrvMain->tStadHandles.hSiteMgr, &pInitTable->siteMgrInitParams);
-
- /* Set DrvMain local defaults */
- pDrvMain->tBusDrvCfg.tSdioCfg.uBlkSizeShift = pInitTable->tDrvMainParams.uSdioBlkSizeShift;
- pDrvMain->tBusDrvCfg.tSdioCfg.uBusDrvThreadPriority = pInitTable->tDrvMainParams.uBusDrvThreadPriority;
- os_SetDrvThreadPriority (pDrvMain->tStadHandles.hOs, pInitTable->tDrvMainParams.uWlanDrvThreadPriority);
-
- /* Release the init table memory */
- os_memoryFree (pDrvMain->tStadHandles.hOs, pInitTable, sizeof(TInitTable));
-
- return eStatus;
-}
-
-
-/*
- * \fn drvMain_xxx...Cb
- * \brief Callback functions for the init/stop stages completion
- *
- * The following callback functions are called from other modules (most from TWD)
- * when the current init/stop step is completed.
- * Note that the callbacks are called anyway, either in the original context (if completed), or
- * in another context if pending.
- * The first case (same context) may lead to a recursion of the SM, so a special handling is added
- * to the SM to prevent recursion (see drvMain_Sm).
- *
- * drvMain_InitHwCb - HW init completion callback
- * drvMain_InitFwCb - FW init (mainly download) completion callback
- * drvMain_ConfigFwCb - FW configuration completion callback
- * drvMain_TwdStopCb - TWD stopping completion callback
- * drvMain_InitFailCb - FW init faulty completion callback
- * drvMain_SmeStopCb - SME stopping completion callback
- * drvMain_GetFileCb - Getting-file completion callback
- *
- * \note
- * \param hDrvMain - The DrvMain object
- * \param eStatus - The process result (TI_OK if succeeded, TI_NOK if failed)
- * \return void
- * \sa drvMain_Create
- */
-static void drvMain_InitHwCb (TI_HANDLE hDrvMain, TI_STATUS eStatus)
-{
- HANDLE_CALLBACKS_FAILURE_STATUS(hDrvMain, eStatus);
- drvMain_SmEvent (hDrvMain, SM_EVENT_HW_INIT_COMPLETE);
-}
-
-static void drvMain_InitFwCb (TI_HANDLE hDrvMain, TI_STATUS eStatus)
-{
- HANDLE_CALLBACKS_FAILURE_STATUS(hDrvMain, eStatus);
- drvMain_SmEvent (hDrvMain, SM_EVENT_FW_INIT_COMPLETE);
-}
-
-static void drvMain_ConfigFwCb (TI_HANDLE hDrvMain, TI_STATUS eStatus)
-{
- HANDLE_CALLBACKS_FAILURE_STATUS(hDrvMain, eStatus);
- drvMain_SmEvent (hDrvMain, SM_EVENT_FW_CONFIG_COMPLETE);
-}
-
-static void drvMain_TwdStopCb (TI_HANDLE hDrvMain, TI_STATUS eStatus)
-{
- HANDLE_CALLBACKS_FAILURE_STATUS(hDrvMain, eStatus);
- drvMain_SmEvent (hDrvMain, SM_EVENT_STOP_COMPLETE);
-}
-
-static void drvMain_InitFailCb (TI_HANDLE hDrvMain, TI_STATUS eStatus)
-{
- drvMain_SmEvent (hDrvMain, SM_EVENT_FAILURE);
- /*
- * Note that this call will pass the SM to the FAILED state, since this event
- * is not handled by any state.
- */
-}
-
-static void drvMain_InvokeAction (TI_HANDLE hDrvMain)
-{
- TDrvMain *pDrvMain = (TDrvMain *)hDrvMain;
-
- switch (pDrvMain->eAction)
- {
- case ACTION_TYPE_START:
- drvMain_SmEvent (hDrvMain, SM_EVENT_START);
- break;
- case ACTION_TYPE_STOP:
- drvMain_SmEvent (hDrvMain, SM_EVENT_STOP);
- break;
- default:
- TRACE1(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_ERROR , "drvMain_InvokeAction(): Action=%d\n", pDrvMain->eAction);
- }
-}
-
-static void drvMain_GetFileCb (TI_HANDLE hDrvMain)
-{
- TDrvMain *pDrvMain = (TDrvMain *)hDrvMain;
- ESmEvent eSmEvent;
-
- switch (pDrvMain->tFileInfo.eFileType)
- {
- case FILE_TYPE_INI: eSmEvent = SM_EVENT_INI_FILE_READY; break;
- case FILE_TYPE_NVS: eSmEvent = SM_EVENT_NVS_FILE_READY; break;
- case FILE_TYPE_FW: eSmEvent = SM_EVENT_FW_FILE_READY; break;
- case FILE_TYPE_FW_NEXT: eSmEvent = SM_EVENT_FW_FILE_READY; break;
- default:
- TRACE1(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_ERROR , "drvMain_GetFileCb(): Unknown eFileType=%d\n", pDrvMain->tFileInfo.eFileType);
- return;
- }
- drvMain_SmEvent (hDrvMain, eSmEvent);
-}
-
-
-/*
- * \fn drvMain_InitLocals
- * \brief Init DrvMain module
- *
- * Init the DrvMain variables, register to other modules and set device power to off.
- *
- * \note
- * \param pDrvMain - The DrvMain object
- * \return void
- * \sa drvMain_Init
- */
-static void drvMain_InitLocals (TDrvMain *pDrvMain)
-{
- /* Initialize the module's local varniables to default values */
- pDrvMain->tFileInfo.eFileType = FILE_TYPE_INI;
- pDrvMain->tFileInfo.fCbFunc = drvMain_GetFileCb;
- pDrvMain->tFileInfo.hCbHndl = (TI_HANDLE)pDrvMain;
- pDrvMain->eSmState = SM_STATE_IDLE;
- pDrvMain->uPendingEventsCount = 0;
- pDrvMain->bRecovery = TI_FALSE;
- pDrvMain->uNumOfRecoveryAttempts = 0;
- pDrvMain->eAction = ACTION_TYPE_NONE;
-
- /* Register the Action callback to the context engine and get the client ID */
- pDrvMain->uContextId = context_RegisterClient (pDrvMain->tStadHandles.hContext,
- drvMain_InvokeAction,
- (TI_HANDLE)pDrvMain,
- TI_TRUE,
- "ACTION",
- sizeof("ACTION"));
-
- /* Platform specific HW preparations */
- hPlatform_Wlan_Hardware_Init(pDrvMain->tStadHandles.hOs);
-
- /* Insure that device power is off (expected to be) */
- hPlatform_DevicePowerOff ();
-}
-
-
-/*
- * \fn drvMain_InitHw & drvMain_InitFw
- * \brief Init HW and Init FW sequences
- *
- * drvMain_InitHw - HW init sequence which writes and reads some HW registers
- * that are needed prior to FW download.
- * drvMain_InitFw - FW init sequence which downloads the FW image and waits for
- * FW init-complete indication.
- *
- * \note
- * \param hDrvMain - The DrvMain object
- * \param pBuf - The file data (NVS for HW-init, FW-Image for FW-init).
- * \param uLength - The file length.
- * \return TI_OK if succeeded, TI_NOK if failed.
- * \sa
- */
-static TI_STATUS drvMain_InitHw (TI_HANDLE hDrvMain, TI_UINT8 *pbuf, TI_UINT32 uLength)
-{
- TDrvMain *pDrvMain = (TDrvMain *) hDrvMain;
-
- return TWD_InitHw (pDrvMain->tStadHandles.hTWD, pbuf, uLength, pDrvMain->uRxDmaBufLen, pDrvMain->uTxDmaBufLen);
-}
-
-static TI_STATUS drvMain_InitFw (TI_HANDLE hDrvMain, TFileInfo *pFileInfo)
-{
- TDrvMain *pDrvMain = (TDrvMain *) hDrvMain;
-
- return TWD_InitFw (pDrvMain->tStadHandles.hTWD, pFileInfo);
-}
-
-
-/*
- * \fn drvMain_ConfigFw
- * \brief Configure the FW
- *
- * The step that follows the FW Init (mainly FW download).
- * The Command-Mailbox interface is enabled here and the FW is configured.
- *
- * \note
- * \param pDrvMain - The DrvMain object
- * \return TI_OK
- * \sa drvMain_Init
- */
-static TI_STATUS drvMain_ConfigFw (TI_HANDLE hDrvMain)
-{
- TDrvMain *pDrvMain = (TDrvMain *) hDrvMain;
-
- /* get pointer to FW static info (already in driver memory) */
- TFwInfo *pFwInfo = TWD_GetFWInfo (pDrvMain->tStadHandles.hTWD);
- TI_UINT8 *pMacAddr = (TI_UINT8 *)pFwInfo->macAddress; /* STA MAC address */
-
- /* Update driver's MAC address */
- wlanDrvIf_SetMacAddress (pDrvMain->tStadHandles.hOs, pMacAddr);
-
- /*
- * Exit from init mode should be before smeSM starts. this enable us to send
- * command to the MboxQueue(that store the command) while the interrupts are masked.
- * the interrupt would be enable at the end of the init process.
- */
- TWD_ExitFromInitMode (pDrvMain->tStadHandles.hTWD);
-
- /* Configure the FW from the TWD DB */
- TWD_ConfigFw (pDrvMain->tStadHandles.hTWD);
-
- TRACE0(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_INIT , "EXIT FROM INIT\n");
-
- /* Print the driver and firmware version and the mac address */
- os_printf("\n");
- os_printf("-----------------------------------------------------\n");
- os_printf("Driver Version : %s\n", SW_VERSION_STR);
- os_printf("Firmware Version: %s\n", pFwInfo->fwVer);
- os_printf("Station ID : %02X-%02X-%02X-%02X-%02X-%02X\n",
- pMacAddr[0], pMacAddr[1], pMacAddr[2], pMacAddr[3], pMacAddr[4], pMacAddr[5]);
- os_printf("-----------------------------------------------------\n");
- os_printf("\n");
-
- return TI_OK;
-}
-
-
-/*
- * \fn drvMain_StopActivities
- * \brief Freeze driver activities
- *
- * Freeze all driver activities due to stop command or recovery process.
- *
- * \note
- * \param pDrvMain - The DrvMain object
- * \return TI_OK if succeeded, TI_NOK if failed.
- * \sa drvMain_EnableActivities
- */
-static TI_STATUS drvMain_StopActivities (TDrvMain *pDrvMain)
-{
- txPort_suspendTx (pDrvMain->tStadHandles.hTxPort);
-
- /* Disable External Inputs (IRQs and commands) */
- TWD_DisableInterrupts(pDrvMain->tStadHandles.hTWD);
- cmdHndlr_Disable (pDrvMain->tStadHandles.hCmdHndlr);
-
- /* Initiate TWD Restart */
- return TWD_Stop (pDrvMain->tStadHandles.hTWD);
-}
-
-
-/*
- * \fn drvMain_EnableActivities
- * \brief Enable driver activities
- *
- * Enable driver activities after init or recovery process completion.
- *
- * \note
- * \param pDrvMain - The DrvMain object
- * \return void
- * \sa drvMain_StopActivities
- */
-static void drvMain_EnableActivities (TDrvMain *pDrvMain)
-{
- txPort_resumeTx (pDrvMain->tStadHandles.hTxPort);
-
- /* Enable External Inputs (IRQ is enabled elsewhere) */
- cmdHndlr_Enable (pDrvMain->tStadHandles.hCmdHndlr);
-
- /* Enable external events from FW */
- TWD_EnableExternalEvents (pDrvMain->tStadHandles.hTWD);
-
-
-}
-
-
-/*
- * \fn drvMain_ClearQueuedEvents
- * \brief Enable driver activities
- *
- * Clear all external events queues (Tx, commands and timers) upon driver stop.
- *
- * \note
- * \param pDrvMain - The DrvMain object
- * \return void
- * \sa
- */
-static void drvMain_ClearQueuedEvents (TDrvMain *pDrvMain)
-{
- txDataQ_ClearQueues (pDrvMain->tStadHandles.hTxDataQ);
- txMgmtQ_ClearQueues (pDrvMain->tStadHandles.hTxMgmtQ);
- cmdHndlr_ClearQueue (pDrvMain->tStadHandles.hCmdHndlr);
- tmr_ClearOperQueue (pDrvMain->tStadHandles.hTimer);
-}
-
-
-/*
- * \fn drvMain_InsertAction
- * \brief Get start/stop action and trigger handling
- *
- * Get start or stop action command from OAL, save it and trigger driver task
- * for handling it.
- * Wait on a signal object until the requested process is completed.
- *
- * \note
- * \param hDrvMain - The DrvMain object
- * \param eAction - The requested action
- * \return void
- * \sa
- */
-TI_STATUS drvMain_InsertAction (TI_HANDLE hDrvMain, EActionType eAction)
-{
- TDrvMain *pDrvMain = (TDrvMain *) hDrvMain;
-
- context_EnterCriticalSection(pDrvMain->tStadHandles.hContext);
- if (pDrvMain->eAction == eAction)
- {
- context_LeaveCriticalSection(pDrvMain->tStadHandles.hContext);
- TRACE0(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_CONSOLE, "Action is identical to last action!\n");
- WLAN_OS_REPORT(("Action %d is identical to last action!\n", eAction));
- return TI_OK;
- }
-
- /* Save the requested action */
- pDrvMain->eAction = eAction;
- context_LeaveCriticalSection(pDrvMain->tStadHandles.hContext);
-
- /* Create signal object */
- /*
- * Notice that we must create the signal object before asking for ReSchedule,
- * because we might receive it immidiatly, and then we will be in a different context
- * with null signal object.
- */
- pDrvMain->hSignalObj = os_SignalObjectCreate (pDrvMain->tStadHandles.hOs);
- if (pDrvMain->hSignalObj == NULL)
- {
- TRACE0(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_ERROR , "drvMain_InsertAction(): Couldn't allocate signal object!\n");
- return TI_NOK;
- }
-
- /* Request driver task schedule for action handling */
- context_RequestSchedule (pDrvMain->tStadHandles.hContext, pDrvMain->uContextId);
-
- /* Wait for the action processing completion */
- os_SignalObjectWait (pDrvMain->tStadHandles.hOs, pDrvMain->hSignalObj);
-
- /* After "wait" - the action has already been processed in the driver's context */
-
- /* Free signalling object */
- os_SignalObjectFree (pDrvMain->tStadHandles.hOs, pDrvMain->hSignalObj);
- pDrvMain->hSignalObj = NULL;
-
- if (pDrvMain->eSmState == SM_STATE_FAILED)
- return TI_NOK;
-
- return TI_OK;
-}
-
-
-/*
- * \fn drvMain_Recovery
- * \brief Initiate recovery process
- *
- * Initiate recovery process upon HW/FW error detection (in the Health-Monitor).
- *
- * \note
- * \param hDrvMain - The DrvMain object
- * \return TI_OK if started recovery, TI_NOK if recovery is already in progress.
- * \sa
- */
-TI_STATUS drvMain_Recovery (TI_HANDLE hDrvMain)
-{
- TDrvMain *pDrvMain = (TDrvMain *) hDrvMain;
-
- if (!pDrvMain->bRecovery)
- {
- TRACE1(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_CONSOLE,".....drvMain_Recovery, ts=%d\n", os_timeStampMs(pDrvMain->tStadHandles.hOs));
-#ifdef REPORT_LOG
- WLAN_OS_REPORT((".....drvMain_Recovery, ts=%d\n", os_timeStampMs(pDrvMain->tStadHandles.hOs)));
-#else
- printk("%s\n",__func__);
-#endif
- pDrvMain->bRecovery = TI_TRUE;
- drvMain_SmEvent (hDrvMain, SM_EVENT_RECOVERY);
- return TI_OK;
- }
- else
- {
- TRACE0(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_ERROR, "drvMain_Recovery: **** Recovery already in progress! ****\n");
-
- /* nesting recoveries... Try again */
- drvMain_SmEvent (hDrvMain, SM_EVENT_RECOVERY);
- return TI_NOK;
- }
-}
-
-
-/*
- * \fn drvMain_RecoveryNotify
- * \brief Notify STAD modules about recovery
- *
- * Notify the relevant STAD modules that recovery took place (after completed).
- *
- * \note
- * \param pDrvMain - The DrvMain object
- * \return void
- * \sa
- */
-static void drvMain_RecoveryNotify (TDrvMain *pDrvMain)
-{
- txCtrl_NotifyFwReset (pDrvMain->tStadHandles.hTxCtrl);
- scr_notifyFWReset (pDrvMain->tStadHandles.hSCR);
- PowerMgr_notifyFWReset (pDrvMain->tStadHandles.hPowerMgr);
-
- TRACE1(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_CONSOLE, ".....drvMain_RecoveryNotify: End Of Recovery, ts=%d\n", os_timeStampMs(pDrvMain->tStadHandles.hOs));
- WLAN_OS_REPORT((".....drvMain_RecoveryNotify: End Of Recovery, ts=%d\n", os_timeStampMs(pDrvMain->tStadHandles.hOs)));
-}
-
-
-/*
- * \fn drvMain_SmWatchdogTimeout
- * \brief SM watchdog timer expiry handler
- *
- * This is the callback function called upon expiartion of the watchdog timer.
- * It is called by the OS-API in timer expiry context, and it issues a failure event to the SM.
- * Note that we can't switch to the driver task as for other timers, since we are using
- * this timer to protect the init processes, and anyway we just need to stop the driver.
- *
- * \note
- * \param hDrvMain - The DrvMain object
- * \return void
- * \sa
- */
-
-#if 0
-static void drvMain_SmWatchdogTimeout (TI_HANDLE hDrvMain)
-{
- TDrvMain *pDrvMain = (TDrvMain *)hDrvMain;
-
- TRACE1(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_ERROR , "drvMain_SmWatchdogTimeout(): State = %d\n", pDrvMain->eSmState);
-
- /* Send failure event directly to the SM (so the drvMain_SmEvent won't block it). */
-
- drvMain_Sm ((TI_HANDLE)pDrvMain, SM_EVENT_FAILURE);
-}
-#endif
-
-/*
- * \fn drvMain_SmEvent
- * \brief Issue DrvMain SM event
- *
- * Each event that is handled by the DrvMain state machine, is introduced through this function.
- * To prevent SM recursion, the SM is invoeked only if it's not already handling the
- * previous event.
- * If the SM is busy, the current event is saved until the previous handling is completed.
- *
- * \note Recursion may happen because some SM activities generate SM events in the same context.
- * \param hDrvMain - The DrvMain object
- * \param eEvent - The event issued to the SM
- * \return void
- * \sa
- */
-static void drvMain_SmEvent (TI_HANDLE hDrvMain, ESmEvent eEvent)
-{
- TDrvMain *pDrvMain = (TDrvMain *)hDrvMain;
-
- /* Increment pending events counter and save last event. */
- pDrvMain->uPendingEventsCount++;
- pDrvMain->ePendingEvent = eEvent;
-
- /* If the SM is busy, save event and exit (will be handled when current event is finished) */
- if (pDrvMain->uPendingEventsCount > 1)
- {
- /* Only one pending event is expected (in addition to the handled one, so two together). */
- if (pDrvMain->uPendingEventsCount > 2)
- {
- TRACE3(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_ERROR , "drvMain_SmEvent(): Multiple pending events (%d), State = %d, Event = %d\n", pDrvMain->uPendingEventsCount, pDrvMain->eSmState, eEvent);
- }
-
- /* Exit. The current event will be handled by the following while loop of the first instance. */
- return;
- }
-
- /* Invoke the SM with the current event and further events issued by the last SM invocation. */
- while (pDrvMain->uPendingEventsCount > 0)
- {
- drvMain_Sm (hDrvMain, pDrvMain->ePendingEvent);
-
- /*
- * Note: The SM may issue another event by calling this function and incrementing
- * the counter.
- * In this case, only the upper part of this function is run, and the pending
- * event is hanlded in the next while loo[.
- */
-
- pDrvMain->uPendingEventsCount--;
- }
-}
-
-
-/*
- * \fn drvMain_Sm
- * \brief The DrvMain state machine
- *
- * The DrvMain state machine, which handles all driver init, recovery and stop processes.
- *
- * \note Since the SM may be called back from its own context, recursion is prevented
- * by postponing the last event.
- * \param hDrvMain - The DrvMain object
- * \param eEvent - The event that triggers the SM
- * \return void
- * \sa
- */
-static void drvMain_Sm (TI_HANDLE hDrvMain, ESmEvent eEvent)
-{
- TDrvMain *pDrvMain = (TDrvMain *)hDrvMain;
- TI_STATUS eStatus = TI_NOK;
- TI_HANDLE hOs = pDrvMain->tStadHandles.hOs;
- TI_UINT32 uSdioConIndex = 0;
- TI_BOOL tmpRecovery;
-
- TRACE2(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_INFORMATION , "drvMain_Sm(): State = %d, Event = %d\n", pDrvMain->eSmState, eEvent);
-
- /*
- * General explenations:
- * =====================
- * 1) This SM calls some functions that may complete their processing in another context.
- * All of these functions (wlanDrvIf_GetFile, drvMain_InitHw, drvMain_InitFw, drvMain_ConfigFw,
- * drvMain_StopActivities, smeSm_start, smeSm_stop) are provided with a callback which
- * they always call upon completion, even if they are completed in the original (SM) context.
- * Since these callbacks are calling the SM, a simple mechanism is added to prevent
- * recursion, by postponing the last event if the SM is still in the previous event's context.
- * 2) In any case of unexpected event, the eStatus remains TI_NOK, leading to the FAILED state!
- * FAILED state is also reached if any of the functions listed in note 1 returns TI_NOK.
- * Note that if these functions detect a failure in another context, they may call their callback
- * with the eStatus parameter set to TI_NOK, or call the drvMain_InitFailCb callback.
- * All these cases lead to FAILED state which terminates all driver activities and wait for destroy.
- * 3) Note that the wlanDrvIf_GetFile is always completed in the original context, and the
- * option of completion in a later context is only for future use.
- * 4) All processes (Start, Stop, Relcovery) are protected by a watchdog timer to let
- * the user free the driver in case of deadlock during the process.
- */
-
- switch (pDrvMain->eSmState)
- {
- case SM_STATE_IDLE:
- /*
- * We get a START action after all modules are created and linked.
- * Disable further actions, start watchdog timer and request for the ini-file.
- */
- if (eEvent == SM_EVENT_START)
- {
- pDrvMain->eSmState = SM_STATE_WAIT_INI_FILE;
- context_DisableClient (pDrvMain->tStadHandles.hContext, pDrvMain->uContextId);
- pDrvMain->tFileInfo.eFileType = FILE_TYPE_INI;
- eStatus = wlanDrvIf_GetFile (hOs, &pDrvMain->tFileInfo);
- }
- break;
- case SM_STATE_WAIT_INI_FILE:
- /*
- * We've got the ini-file.
- * Set STAD and TWD modules defaults according to the ini-file,
- * turn on the device and request for the NVS file.
- */
- if (eEvent == SM_EVENT_INI_FILE_READY)
- {
- pDrvMain->eSmState = SM_STATE_WAIT_NVS_FILE;
- drvMain_SetDefaults (hDrvMain, pDrvMain->tFileInfo.pBuffer, pDrvMain->tFileInfo.uLength);
- hPlatform_DevicePowerOn ();
-
- pDrvMain->tFileInfo.eFileType = FILE_TYPE_NVS;
- eStatus = wlanDrvIf_GetFile (hOs, &pDrvMain->tFileInfo);
- }
- break;
-
- case SM_STATE_WAIT_NVS_FILE:
-
- /* SDBus Connect connection validation */
- for(uSdioConIndex=0; (uSdioConIndex < SDIO_CONNECT_THRESHOLD) && (eStatus != TI_OK); uSdioConIndex++)
- {
- /* : We should split the call to txnQ_ConnectBus to other state in order to support Async bus connection */
- eStatus = txnQ_ConnectBus(pDrvMain->tStadHandles.hTxnQ, &pDrvMain->tBusDrvCfg, NULL, NULL, &pDrvMain->uRxDmaBufLen, &pDrvMain->uTxDmaBufLen);
-
- if((eStatus != TI_OK) &&
- (uSdioConIndex < (SDIO_CONNECT_THRESHOLD - 1)))
- {
- TRACE0(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_WARNING , "SDBus Connect Failed\n");
- WLAN_OS_REPORT(("Try to SDBus Connect again...\n"));
- if (uSdioConIndex > 1)
- hPlatform_DevicePowerOffSetLongerDelay();
- else
- hPlatform_DevicePowerOff();
- hPlatform_DevicePowerOn();
- }
- }
-
- if(eStatus != TI_OK)
- {
- WLAN_OS_REPORT(("SDBus Connect Failed, Set Object Event !!\r\n"));
- TRACE0(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_ERROR , "SDBus Connect Failed, Set Object Event !!\r\n");
- if (!pDrvMain->bRecovery)
- {
- os_SignalObjectSet(hOs, pDrvMain->hSignalObj);
- }
- }
- else /* SDBus Connect success */
- {
- /*
- * We've got the NVS file.
- * Start HW-Init process providing the NVS file.
- */
- if (eEvent == SM_EVENT_NVS_FILE_READY)
- {
- pDrvMain->eSmState = SM_STATE_HW_INIT;
- eStatus = drvMain_InitHw (hDrvMain, pDrvMain->tFileInfo.pBuffer, pDrvMain->tFileInfo.uLength);
- }
- }
- break;
- case SM_STATE_HW_INIT:
- /*
- * HW-Init process is completed.
- * Request for the FW image file.
- */
- if (eEvent == SM_EVENT_HW_INIT_COMPLETE)
- {
- pDrvMain->tFileInfo.eFileType = FILE_TYPE_FW;
- pDrvMain->eSmState = SM_STATE_DOWNLOAD_FW_FILE;
- eStatus = wlanDrvIf_GetFile (hOs, &pDrvMain->tFileInfo);
- }
- break;
- case SM_STATE_DOWNLOAD_FW_FILE:
- if (eEvent == SM_EVENT_FW_FILE_READY)
- {
- pDrvMain->tFileInfo.eFileType = FILE_TYPE_FW_NEXT;
- if (pDrvMain->tFileInfo.bLast == TI_TRUE)
- {
- pDrvMain->eSmState = SM_STATE_FW_INIT;
- }
- else
- {
- pDrvMain->eSmState = SM_STATE_WAIT_FW_FILE;
- }
- /*
- * We've got the FW image file.
- * Start FW-Init process (mainly FW image download) providing the FW image file.
- */
- eStatus = drvMain_InitFw (hDrvMain, &pDrvMain->tFileInfo);
- }
- break;
- case SM_STATE_WAIT_FW_FILE:
- if (eEvent == SM_EVENT_FW_INIT_COMPLETE)
- {
- pDrvMain->eSmState = SM_STATE_DOWNLOAD_FW_FILE;
- eStatus = wlanDrvIf_GetFile (hOs, &pDrvMain->tFileInfo);
- }
- break;
- case SM_STATE_FW_INIT:
- /*
- * FW-Init process is completed.
- * Free the semaphore of the START action to enable the OS interface.
- * Enable interrupts (or polling for debug).
- * Start FW-Configuration process, and free the semaphore of the START action.
- *
- * Note that in some OSs, the semaphore must be released in order to enable the
- * interrupts, and the interrupts are needed for the configuration process!
- */
- if (eEvent == SM_EVENT_FW_INIT_COMPLETE)
- {
- pDrvMain->eSmState = SM_STATE_FW_CONFIG;
- TWD_EnableInterrupts(pDrvMain->tStadHandles.hTWD);
- #ifdef PRIODIC_INTERRUPT
- /* Start periodic interrupts. It means that every period of time the FwEvent SM will be called */
- os_periodicIntrTimerStart (hOs);
- #endif
- eStatus = drvMain_ConfigFw (hDrvMain);
- }
- break;
- case SM_STATE_FW_CONFIG:
- /*
- * FW-configuration process is completed.
- * Stop watchdog timer.
- * For recovery, notify the relevant STAD modules.
- * For regular start, start the SME which handles the connection process.
- * Update timer and OAL about entering OPERATIONAL state (OAL ignores recovery)
- * Enable driver activities and external events.
- * Enable STOP action
- * We are now in OPERATIONAL state, i.e. the driver is fully operational!
- */
-
- tmpRecovery = pDrvMain->bRecovery;
- if (eEvent == SM_EVENT_FW_CONFIG_COMPLETE)
- {
- pDrvMain->eSmState = SM_STATE_OPERATIONAL;
- if (pDrvMain->bRecovery)
- {
- pDrvMain->uNumOfRecoveryAttempts = 0;
- drvMain_RecoveryNotify (pDrvMain);
- pDrvMain->bRecovery = TI_FALSE;
- }
- else
- {
- sme_Start (pDrvMain->tStadHandles.hSme);
- wlanDrvIf_UpdateDriverState (hOs, DRV_STATE_RUNNING);
- }
- tmr_UpdateDriverState (pDrvMain->tStadHandles.hTimer, TI_TRUE);
- drvMain_EnableActivities (pDrvMain);
- context_EnableClient (pDrvMain->tStadHandles.hContext, pDrvMain->uContextId);
- eStatus = TI_OK;
-
- }
- if (!tmpRecovery)
- {
- os_SignalObjectSet(hOs, pDrvMain->hSignalObj);
- }
- break;
- case SM_STATE_OPERATIONAL:
- /*
- * Disable start/stop commands and start watchdog timer.
- * Update timer and OAL about exiting OPERATIONAL state (OAL ignores recovery).
- * For STOP, stop SME (handle disconnection) and move to DISCONNECTING state.
- * For recovery, stop driver activities and move to STOPPING state.
- * Note that driver-stop process may be Async if we are during Async bus transaction.
- */
-
- context_DisableClient (pDrvMain->tStadHandles.hContext, pDrvMain->uContextId);
- tmr_UpdateDriverState (pDrvMain->tStadHandles.hTimer, TI_FALSE);
- if (eEvent == SM_EVENT_STOP)
- {
- pDrvMain->eSmState = SM_STATE_DISCONNECTING;
- wlanDrvIf_UpdateDriverState (hOs, DRV_STATE_STOPING);
- sme_Stop (pDrvMain->tStadHandles.hSme);
- eStatus = TI_OK;
- }
- else if (eEvent == SM_EVENT_RECOVERY)
- {
- pDrvMain->eSmState = SM_STATE_STOPPING;
- eStatus = drvMain_StopActivities (pDrvMain);
- }
-
- break;
- case SM_STATE_DISCONNECTING:
- /*
- * Note that this state is not relevant for recovery.
- * SME stop is completed
- * Stop driver activities and move to STOPPING state.
- * Note that driver stop process may be Async if we are during Async bus transaction.
- */
-
- if (eEvent == SM_EVENT_DISCONNECTED)
- {
- pDrvMain->eSmState = SM_STATE_STOPPING;
- eStatus = drvMain_StopActivities (pDrvMain);
- }
- break;
- case SM_STATE_STOPPING:
- /*
- * Driver stopping process is done.
- * Turn device power off.
- * For recovery, turn device power back on, request NVS file and continue with
- * the init process (recover back all the way to OPERATIONAL state).
- * For STOP process, the driver is now fully stopped (STOPPED state), so stop watchdog timer,
- * clear all events queues, free the semaphore of the STOP action and enable START action.
- */
-
- if (eEvent == SM_EVENT_STOP_COMPLETE)
- {
- txnQ_DisconnectBus (pDrvMain->tStadHandles.hTxnQ);
- hPlatform_DevicePowerOff ();
- if (pDrvMain->bRecovery)
- {
- hPlatform_DevicePowerOn ();
- pDrvMain->eSmState = SM_STATE_WAIT_NVS_FILE;
- pDrvMain->tFileInfo.eFileType = FILE_TYPE_NVS;
- eStatus = wlanDrvIf_GetFile (hOs, &pDrvMain->tFileInfo);
- }
- else
- {
- pDrvMain->eSmState = SM_STATE_STOPPED;
- drvMain_ClearQueuedEvents (pDrvMain);
- scr_notifyFWReset(pDrvMain->tStadHandles.hSCR);
- os_SignalObjectSet (hOs, pDrvMain->hSignalObj);
- context_EnableClient (pDrvMain->tStadHandles.hContext, pDrvMain->uContextId);
- wlanDrvIf_UpdateDriverState (hOs, DRV_STATE_STOPPED);
- eStatus = TI_OK;
- }
- }
-
- break;
- case SM_STATE_STOPPED:
- /*
- * A START action command was inserted, so we go through the init process.
- * Disable further actions, start watchdog timer, turn on device and request NVS file.
- */
-
- context_DisableClient (pDrvMain->tStadHandles.hContext, pDrvMain->uContextId);
- if (eEvent == SM_EVENT_START)
- {
- hPlatform_DevicePowerOn ();
- pDrvMain->eSmState = SM_STATE_WAIT_NVS_FILE;
- pDrvMain->tFileInfo.eFileType = FILE_TYPE_NVS;
- eStatus = wlanDrvIf_GetFile (hOs, &pDrvMain->tFileInfo);
- }
- break;
- case SM_STATE_STOPPING_ON_FAIL:
- /*
- * Driver stopping process upon failure is completed.
- * Turn off the device and move to FAILED state.
- */
-
- pDrvMain->eSmState = SM_STATE_FAILED;
- txnQ_DisconnectBus (pDrvMain->tStadHandles.hTxnQ);
- hPlatform_DevicePowerOff ();
- if (!pDrvMain->bRecovery)
- {
- os_SignalObjectSet (hOs, pDrvMain->hSignalObj);
- }
- else if (pDrvMain->uNumOfRecoveryAttempts < MAX_NUM_OF_RECOVERY_TRIGGERS)
- {
- pDrvMain->uNumOfRecoveryAttempts++;
- pDrvMain->eSmState = SM_STATE_STOPPING;
- eStatus = drvMain_StopActivities (pDrvMain);
- }
- WLAN_OS_REPORT(("[WLAN] Exit application\n"));
- pDrvMain->bRecovery = TI_FALSE;
- break;
- case SM_STATE_FAILED:
- /* Nothing to do except waiting for Destroy */
- break;
- default:
- TRACE2(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_ERROR , "drvMain_Sm: Unknown state, eEvent=%u at state=%u\n", eEvent, pDrvMain->eSmState);
- /* Note: Handled below as a failure since the status remains TI_NOK */
- break;
- }
-
- /* Handle failures (status = NOK) if not handled yet */
- if ((eStatus == TI_NOK) &&
- (pDrvMain->eSmState != SM_STATE_FAILED) &&
- (pDrvMain->eSmState != SM_STATE_STOPPING_ON_FAIL))
- {
- TRACE3(pDrvMain->tStadHandles.hReport, REPORT_SEVERITY_ERROR , "drvMain_Sm: eEvent=%u at state=%u, status=%d\n", eEvent, pDrvMain->eSmState, eStatus);
- pDrvMain->eSmState = SM_STATE_STOPPING_ON_FAIL;
- wlanDrvIf_UpdateDriverState (hOs, DRV_STATE_FAILED);
-
- /*
- * Stop all activities. This may be completed in a different context if
- * we should wait for an Async bus transaction completion.
- * The drvMain_TwdStopCb is called from the TWD in any case to pass
- * us to the SM_STATE_FAILED state (where we wait for Destroy).
- */
- eStatus = drvMain_StopActivities (pDrvMain);
- }
-}