diff options
Diffstat (limited to 'wl1271/TWD/FW_Transfer/HwInit.c')
-rw-r--r-- | wl1271/TWD/FW_Transfer/HwInit.c | 2360 |
1 files changed, 0 insertions, 2360 deletions
diff --git a/wl1271/TWD/FW_Transfer/HwInit.c b/wl1271/TWD/FW_Transfer/HwInit.c deleted file mode 100644 index addca88..0000000 --- a/wl1271/TWD/FW_Transfer/HwInit.c +++ /dev/null @@ -1,2360 +0,0 @@ -/* - * HwInit.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. - */ - - - -/*******************************************************************************/ -/* */ -/* MODULE: HwInit.c */ -/* PURPOSE: HwInit module manages the init process of the TNETW, included */ -/* firmware download process. It shall perform Hard Reset the chip */ -/* if possible (this will require a Reset line to be connected to */ -/* the host); Start InterfaceCtrl; Download NVS and FW */ -/* */ -/* */ -/*******************************************************************************/ - -#define __FILE_ID__ FILE_ID_105 -#include "tidef.h" -#include "osApi.h" -#include "report.h" -#include "timer.h" -#include "HwInit_api.h" -#include "FwEvent_api.h" -#include "TwIf.h" -#include "TWDriver.h" -#include "TWDriverInternal.h" -#include "eventMbox_api.h" -#include "CmdBld.h" -#include "CmdMBox_api.h" -#ifdef TI_RANDOM_DEFAULT_MAC -#include <linux/random.h> -#include <linux/jiffies.h> -#endif - - -extern void TWD_FinalizeOnFailure (TI_HANDLE hTWD); -extern void cmdBld_FinalizeDownload (TI_HANDLE hCmdBld, TBootAttr *pBootAttr, FwStaticData_t *pFwInfo); - - -/************************************************************************ - * Defines - ************************************************************************/ - -/* Download phase partition */ -#define PARTITION_DOWN_MEM_ADDR 0 -#define PARTITION_DOWN_MEM_SIZE 0x177C0 -#define PARTITION_DOWN_REG_ADDR REGISTERS_BASE -#define PARTITION_DOWN_REG_SIZE 0x8800 - -/* Working phase partition */ -#define PARTITION_WORK_MEM_ADDR1 0x40000 -#define PARTITION_WORK_MEM_SIZE1 0x14FC0 -#define PARTITION_WORK_MEM_ADDR2 REGISTERS_BASE -#define PARTITION_WORK_MEM_SIZE2 0xA000 -#define PARTITION_WORK_MEM_ADDR3 0x3004F8 -#define PARTITION_WORK_MEM_SIZE3 0x4 -#define PARTITION_WORK_MEM_ADDR4 0x40404 - -/* DRPW setting partition */ -#define PARTITION_DRPW_MEM_ADDR 0x40000 -#define PARTITION_DRPW_MEM_SIZE 0x14FC0 -#define PARTITION_DRPW_REG_ADDR DRPW_BASE -#define PARTITION_DRPW_REG_SIZE 0x6000 - -/* Total range of bus addresses range */ -#define PARTITION_TOTAL_ADDR_RANGE 0x1FFC0 - -/* Maximal block size in a single SDIO transfer --> Firmware image load chunk size */ -#ifdef _VLCT_ -#define MAX_SDIO_BLOCK (4000) -#else -#define MAX_SDIO_BLOCK (500) -#endif - -#define ACX_EEPROMLESS_IND_REG (SCR_PAD4) -#define USE_EEPROM (0) -#define SOFT_RESET_MAX_TIME (1000000) -#define SOFT_RESET_STALL_TIME (1000) -#define NVS_DATA_BUNDARY_ALIGNMENT (4) - -#define MAX_HW_INIT_CONSECUTIVE_TXN 15 - -#define WORD_SIZE 4 -#define WORD_ALIGNMENT_MASK 0x3 -#define DEF_NVS_SIZE ((NVS_PRE_PARAMETERS_LENGTH) + (NVS_TX_TYPE_INDEX) + 4) - -#define RADIO_SM_WAIT_LOOP 32 - -#define FREF_CLK_FREQ_MASK 0x7 -#define FREF_CLK_TYPE_MASK BIT_3 -#define FREF_CLK_POLARITY_MASK BIT_4 - -#define FREF_CLK_TYPE_BITS 0xfffffe7f -#define CLK_REQ_PRCM 0x100 - -#define FREF_CLK_POLARITY_BITS 0xfffff8ff -#define CLK_REQ_OUTN_SEL 0x700 - -#define DRPw_MASK_CHECK 0xc0 -#define DRPw_MASK_SET 0x2000000 - -/* time to wait till we check if fw is running */ -#define STALL_TIMEOUT 7 - -#ifdef DOWNLOAD_TIMER_REQUIERD -#define FIN_LOOP 10 -#endif - - -#ifdef _VLCT_ -#define FIN_LOOP 10 -#else -#define FIN_LOOP 20000 -#endif - - -/************************************************************************ - * Macros - ************************************************************************/ - -#define SET_DEF_NVS(aNVS) aNVS[0]=0x01; aNVS[1]=0x6d; aNVS[2]=0x54; aNVS[3]=0x56; aNVS[4]=0x34; \ - aNVS[5]=0x12; aNVS[6]=0x28; aNVS[7]=0x01; aNVS[8]=0x71; aNVS[9]=0x54; \ - aNVS[10]=0x00; aNVS[11]=0x08; aNVS[12]=0x00; aNVS[13]=0x00; aNVS[14]=0x00; \ - aNVS[15]=0x00; aNVS[16]=0x00; aNVS[17]=0x00; aNVS[18]=0x00; aNVS[19]=0x00; \ - aNVS[20]=0x00; aNVS[21]=0x00; aNVS[22]=0x00; aNVS[23]=0x00; aNVS[24]=eNVS_NON_FILE;\ - aNVS[25]=0x00; aNVS[26]=0x00; aNVS[27]=0x00; - - -#define SET_PARTITION(pPartition,uAddr1,uMemSize1,uAddr2,uMemSize2,uAddr3,uMemSize3,uAddr4) \ - ((TPartition*)pPartition)[0].uMemAdrr = uAddr1; \ - ((TPartition*)pPartition)[0].uMemSize = uMemSize1; \ - ((TPartition*)pPartition)[1].uMemAdrr = uAddr2; \ - ((TPartition*)pPartition)[1].uMemSize = uMemSize2; \ - ((TPartition*)pPartition)[2].uMemAdrr = uAddr3; \ - ((TPartition*)pPartition)[2].uMemSize = uMemSize3; \ - ((TPartition*)pPartition)[3].uMemAdrr = uAddr4; - -#define HW_INIT_PTXN_SET(pHwInit, pTxn) pTxn = (TTxnStruct*)&(pHwInit->aHwInitTxn[pHwInit->uTxnIndex].tTxnStruct); - -#define BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, uAddr, uVal, uSize, direction, fCB, hCB) \ - HW_INIT_PTXN_SET(pHwInit, pTxn) \ - TXN_PARAM_SET_DIRECTION(pTxn, direction); \ - pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData = (TI_UINT32)uVal; \ - BUILD_TTxnStruct(pTxn, uAddr, &(pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData), uSize, fCB, hCB) - -#define BUILD_HW_INIT_FW_STATIC_TXN(pHwInit, pTxn, uAddr, fCB, hCB) \ - HW_INIT_PTXN_SET(pHwInit, pTxn) \ - TXN_PARAM_SET_DIRECTION(pTxn, TXN_DIRECTION_READ); \ - BUILD_TTxnStruct(pTxn, uAddr, &(pHwInit->tFwStaticTxn.tFwStaticInfo), sizeof(FwStaticData_t), fCB, hCB) - -#define BUILD_HW_INIT_FW_DL_TXN(pHwInit, pTxn, uAddr, uVal, uSize, direction, fCB, hCB) \ - HW_INIT_PTXN_SET(pHwInit, pTxn) \ - TXN_PARAM_SET_DIRECTION(pTxn, direction); \ - BUILD_TTxnStruct(pTxn, uAddr, uVal, uSize, fCB, hCB) - - -#define SET_DRP_PARTITION(pPartition)\ - SET_PARTITION(pPartition, PARTITION_DRPW_MEM_ADDR, PARTITION_DRPW_MEM_SIZE, PARTITION_DRPW_REG_ADDR, PARTITION_DRPW_REG_SIZE, 0, 0, 0) - -#define SET_FW_LOAD_PARTITION(pPartition,uFwAddress)\ - SET_PARTITION(pPartition,uFwAddress,PARTITION_DOWN_MEM_SIZE, PARTITION_DOWN_REG_ADDR, PARTITION_DOWN_REG_SIZE,0,0,0) - -#define SET_WORK_PARTITION(pPartition)\ - SET_PARTITION(pPartition,PARTITION_WORK_MEM_ADDR1, PARTITION_WORK_MEM_SIZE1, PARTITION_WORK_MEM_ADDR2, PARTITION_WORK_MEM_SIZE2, PARTITION_WORK_MEM_ADDR3, PARTITION_WORK_MEM_SIZE3, PARTITION_WORK_MEM_ADDR4) - -/* Handle return status inside a state machine */ -#define EXCEPT(phwinit,status) \ - switch (status) { \ - case TI_OK: \ - case TXN_STATUS_OK: \ - case TXN_STATUS_COMPLETE: \ - break; \ - case TXN_STATUS_PENDING: \ - return TXN_STATUS_PENDING; \ - default: \ - TWD_FinalizeOnFailure (phwinit->hTWD); \ - return TXN_STATUS_ERROR; \ - } - - -/* Handle return status inside an init sequence state machine */ -#define EXCEPT_I(phwinit,status) \ - switch (status) { \ - case TI_OK: \ - case TXN_STATUS_COMPLETE: \ - break; \ - case TXN_STATUS_PENDING: \ - phwinit->uInitSeqStatus = status; \ - return TXN_STATUS_PENDING; \ - default: \ - TWD_FinalizeOnFailure (phwinit->hTWD); \ - return TXN_STATUS_ERROR; \ - } - - -/* Handle return status inside a load image state machine */ -#define EXCEPT_L(phwinit,status) \ - switch (status) { \ - case TXN_STATUS_OK: \ - case TXN_STATUS_COMPLETE: \ - break; \ - case TXN_STATUS_PENDING: \ - phwinit->DownloadStatus = status; \ - return TXN_STATUS_PENDING; \ - default: \ - phwinit->DownloadStatus = status; \ - TWD_FinalizeOnFailure (phwinit->hTWD); \ - return TXN_STATUS_ERROR; \ - } - - -/************************************************************************ - * Types - ************************************************************************/ - -enum -{ - REF_FREQ_19_2 = 0, - REF_FREQ_26_0 = 1, - REF_FREQ_38_4 = 2, - REF_FREQ_40_0 = 3, - REF_FREQ_33_6 = 4, - REF_FREQ_NUM = 5 -}; - -enum -{ - LUT_PARAM_INTEGER_DIVIDER = 0, - LUT_PARAM_FRACTIONAL_DIVIDER = 1, - LUT_PARAM_ATTN_BB = 2, - LUT_PARAM_ALPHA_BB = 3, - LUT_PARAM_STOP_TIME_BB = 4, - LUT_PARAM_BB_PLL_LOOP_FILTER = 5, - LUT_PARAM_NUM = 6 -}; - -typedef struct -{ - TTxnStruct tTxnStruct; - TI_UINT32 uData; - -} THwInitTxn; - -typedef struct -{ - TTxnStruct tTxnStruct; - FwStaticData_t tFwStaticInfo; - -} TFwStaticTxn; - - -/* The HW Init module object */ -typedef struct -{ - /* Handles */ - TI_HANDLE hOs; - TI_HANDLE hReport; - TI_HANDLE hTWD; - TI_HANDLE hBusTxn; - TI_HANDLE hTwIf; - - TI_HANDLE hFileInfo; /* holds parameters of FW Image Portion - for DW Download */ - TEndOfHwInitCb fInitHwCb; - - /* Firmware image ptr */ - TI_UINT8 *pFwBuf; - /* Firmware image length */ - TI_UINT32 uFwLength; - TI_UINT32 uFwAddress; - TI_UINT32 bFwBufLast; - TI_UINT32 uFwLastAddr; - /* EEPROM image ptr */ - TI_UINT8 *pEEPROMBuf; - /* EEPROM image length */ - TI_UINT32 uEEPROMLen; - - TI_UINT8 *pEEPROMCurPtr; - TI_UINT32 uEEPROMCurLen; - TBootAttr tBootAttr; - TI_HANDLE hHwCtrl; - ETxnStatus DownloadStatus; - /* Upper module callback for the init stage */ - fnotify_t fCb; - /* Upper module handle for the init stage */ - TI_HANDLE hCb; - /* Init stage */ - TI_UINT32 uInitStage; - /* Reset statge */ - TI_UINT32 uResetStage; - /* EEPROM burst stage */ - TI_UINT32 uEEPROMStage; - /* Init state machine temporary data */ - TI_UINT32 uInitData; - /* ELP command image */ - TI_UINT32 uElpCmd; - /* Chip ID */ - TI_UINT32 uChipId; - /* Boot state machine temporary data */ - TI_UINT32 uBootData; - TI_UINT32 uSelfClearTime; - TI_UINT8 uEEPROMBurstLen; - TI_UINT8 uEEPROMBurstLoop; - TI_UINT32 uEEPROMRegAddr; - TI_STATUS uEEPROMStatus; - TI_UINT32 uNVSStartAddr; - TI_UINT32 uNVSNumChar; - TI_UINT32 uNVSNumByte; - TI_STATUS uNVSStatus; - TI_UINT32 uScrPad6; - TI_UINT32 uRefFreq; - TI_UINT32 uInitSeqStage; - TI_STATUS uInitSeqStatus; - TI_UINT32 uLoadStage; - TI_UINT32 uBlockReadNum; - TI_UINT32 uBlockWriteNum; - TI_UINT32 uPartitionLimit; - TI_UINT32 uFinStage; - TI_UINT32 uFinData; - TI_UINT32 uFinLoop; - TI_UINT32 uRegStage; - TI_UINT32 uRegLoop; - TI_UINT32 uRegSeqStage; - TI_UINT32 uRegData; - TI_HANDLE hStallTimer; - - /* Top register Read/Write SM temporary data*/ - TI_UINT32 uTopRegAddr; - TI_UINT32 uTopRegValue; - TI_UINT32 uTopRegMask; - TI_UINT32 uTopRegUpdateValue; - TI_UINT32 uTopStage; - TI_STATUS uTopStatus; - - TI_UINT8 auFwTmpBuf [WSPI_PAD_LEN_WRITE + MAX_SDIO_BLOCK]; - - TFinalizeCb fFinalizeDownload; - TI_HANDLE hFinalizeDownload; - /* Size of the Fw image, retrieved from the image itself */ - TI_UINT32 uFwDataLen; - TI_UINT8 aDefaultNVS[DEF_NVS_SIZE]; - TI_UINT8 uTxnIndex; - THwInitTxn aHwInitTxn[MAX_HW_INIT_CONSECUTIVE_TXN]; - TFwStaticTxn tFwStaticTxn; - - TI_UINT32 uSavedDataForWspiHdr; /* For saving the 4 bytes before the NVS data for WSPI case - where they are overrun by the WSPI BusDrv */ - TPartition aPartition[NUM_OF_PARTITION]; -} THwInit; - - -/************************************************************************ - * Local Functions Prototypes - ************************************************************************/ -static void hwInit_SetPartition (THwInit *pHwInit, - TPartition *pPartition); -static TI_STATUS hwInit_BootSm (TI_HANDLE hHwInit); -static TI_STATUS hwInit_ResetSm (TI_HANDLE hHwInit); -static TI_STATUS hwInit_EepromlessStartBurstSm (TI_HANDLE hHwInit); -static TI_STATUS hwInit_LoadFwImageSm (TI_HANDLE hHwInit); -static TI_STATUS hwInit_FinalizeDownloadSm (TI_HANDLE hHwInit); -static TI_STATUS hwInit_TopRegisterRead(TI_HANDLE hHwInit); -static TI_STATUS hwInit_InitTopRegisterRead(TI_HANDLE hHwInit, TI_UINT32 uAddress); -static TI_STATUS hwInit_TopRegisterWrite(TI_HANDLE hHwInit); -static TI_STATUS hwInit_InitTopRegisterWrite(TI_HANDLE hHwInit, TI_UINT32 uAddress, TI_UINT32 uValue); -#ifdef DOWNLOAD_TIMER_REQUIERD -static void hwInit_StallTimerCb (TI_HANDLE hHwInit, TI_BOOL bTwdInitOccured); -#endif - - -/******************************************************************************* -* PUBLIC FUNCTIONS IMPLEMENTATION * -********************************************************************************/ - - -/************************************************************************* -* hwInit_Create * -************************************************************************** -* DESCRIPTION: This function initializes the HwInit module. -* -* INPUT: hOs - handle to Os Abstraction Layer -* -* RETURN: Handle to the allocated HwInit module -*************************************************************************/ -TI_HANDLE hwInit_Create (TI_HANDLE hOs) -{ - THwInit *pHwInit; - - /* Allocate HwInit module */ - pHwInit = os_memoryAlloc (hOs, sizeof(THwInit)); - - if (pHwInit == NULL) - { - WLAN_OS_REPORT(("Error allocating the HwInit Module\n")); - return NULL; - } - - /* Reset HwInit module */ - os_memoryZero (hOs, pHwInit, sizeof(THwInit)); - - pHwInit->hOs = hOs; - - return (TI_HANDLE)pHwInit; -} - - -/*************************************************************************** -* hwInit_Destroy * -**************************************************************************** -* DESCRIPTION: This function unload the HwInit module. -* -* INPUTS: hHwInit - the object -* -* OUTPUT: -* -* RETURNS: TI_OK - Unload succesfull -* TI_NOK - Unload unsuccesfull -***************************************************************************/ -TI_STATUS hwInit_Destroy (TI_HANDLE hHwInit) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - - if (pHwInit->hStallTimer) - { -#ifdef DOWNLOAD_TIMER_REQUIERD - tmr_DestroyTimer (pHwInit->hStallTimer); -#endif - } - - /* Free HwInit Module */ - os_memoryFree (pHwInit->hOs, pHwInit, sizeof(THwInit)); - - return TI_OK; -} - - -/*************************************************************************** -* hwInit_Init * -**************************************************************************** -* DESCRIPTION: This function configures the hwInit module -* -* RETURNS: TI_OK - Configuration successful -* TI_NOK - Configuration unsuccessful -***************************************************************************/ -TI_STATUS hwInit_Init (TI_HANDLE hHwInit, - TI_HANDLE hReport, - TI_HANDLE hTimer, - TI_HANDLE hTWD, - TI_HANDLE hFinalizeDownload, - TFinalizeCb fFinalizeDownload, - TEndOfHwInitCb fInitHwCb) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - TTxnStruct* pTxn; -#ifdef TI_RANDOM_DEFAULT_MAC - u32 rand_mac; -#endif - - /* Configure modules handles */ - pHwInit->hReport = hReport; - pHwInit->hTWD = hTWD; - pHwInit->hTwIf = ((TTwd *)hTWD)->hTwIf; - pHwInit->hOs = ((TTwd *)hTWD)->hOs; - pHwInit->fInitHwCb = fInitHwCb; - pHwInit->fFinalizeDownload = fFinalizeDownload; - pHwInit->hFinalizeDownload = hFinalizeDownload; - - SET_DEF_NVS(pHwInit->aDefaultNVS) -#ifdef TI_RANDOM_DEFAULT_MAC - /* Create random MAC address: offset 3, 4 and 5 */ - srandom32((u32)jiffies); - rand_mac = random32(); - pHwInit->aDefaultNVS[3] = (u8)rand_mac; - pHwInit->aDefaultNVS[4] = (u8)(rand_mac >> 8); - pHwInit->aDefaultNVS[5] = (u8)(rand_mac >> 16); -#endif - - for (pHwInit->uTxnIndex=0;pHwInit->uTxnIndex<MAX_HW_INIT_CONSECUTIVE_TXN;pHwInit->uTxnIndex++) - { - HW_INIT_PTXN_SET(pHwInit, pTxn) - /* Setting write as default transaction */ - TXN_PARAM_SET(pTxn, TXN_LOW_PRIORITY, TXN_FUNC_ID_WLAN, TXN_DIRECTION_WRITE, TXN_INC_ADDR) - } - -#ifdef DOWNLOAD_TIMER_REQUIERD - pHwInit->hStallTimer = tmr_CreateTimer (hTimer); - if (pHwInit->hStallTimer == NULL) - { - return TI_NOK; - } -#endif - - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INIT, ".....HwInit configured successfully\n"); - - return TI_OK; -} - - -TI_STATUS hwInit_SetNvsImage (TI_HANDLE hHwInit, TI_UINT8 *pbuf, TI_UINT32 length) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - - pHwInit->pEEPROMBuf = pbuf; - pHwInit->uEEPROMLen = length; - - return TI_OK; -} - - -TI_STATUS hwInit_SetFwImage (TI_HANDLE hHwInit, TFileInfo *pFileInfo) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - - if ((hHwInit == NULL) || (pFileInfo == NULL)) - { - return TI_NOK; - } - - pHwInit->pFwBuf = pFileInfo->pBuffer; - pHwInit->uFwLength = pFileInfo->uLength; - pHwInit->uFwAddress = pFileInfo->uAddress; - pHwInit->bFwBufLast = pFileInfo->bLast; - - return TI_OK; -} - - -/** - * \fn hwInit_SetPartition - * \brief Set HW addresses partition - * - * Set the HW address ranges for download or working memory and registers access. - * Generate and configure the bus access address mapping table. - * The partition is split between register (fixed partition of 24KB size, exists in all modes), - * and memory (dynamically changed during init and gets constant value in run-time, 104KB size). - * The TwIf configures the memory mapping table on the device by issuing write transaction to - * table address (note that the TxnQ and bus driver see this as a regular transaction). - * - * \note In future versions, a specific bus may not support partitioning (as in wUART), - * In this case the HwInit module shall not call this function (will learn the bus - * configuration from the INI file). - * - * \param pHwInit - The module's object - * \param pPartition - all partition base address - * \return void - * \sa - */ -static void hwInit_SetPartition (THwInit *pHwInit, - TPartition *pPartition) -{ - TRACE7(pHwInit->hReport, REPORT_SEVERITY_INFORMATION, "hwInit_SetPartition: uMemAddr1=0x%x, MemSize1=0x%x uMemAddr2=0x%x, MemSize2=0x%x, uMemAddr3=0x%x, MemSize3=0x%x, uMemAddr4=0x%x, MemSize4=0x%x\n",pPartition[0].uMemAdrr, pPartition[0].uMemSize,pPartition[1].uMemAdrr, pPartition[1].uMemSize,pPartition[2].uMemAdrr, pPartition[2].uMemSize,pPartition[3].uMemAdrr ); - - /* Prepare partition Txn data and send to HW */ - twIf_SetPartition (pHwInit->hTwIf,pPartition); -} - - -/**************************************************************************** - * hwInit_Boot() - **************************************************************************** - * DESCRIPTION: Start HW init sequence which writes and reads some HW registers - * that are needed prior to FW download. - * - * INPUTS: None - * - * OUTPUT: None - * - * RETURNS: TI_OK or TI_NOK - ****************************************************************************/ -TI_STATUS hwInit_Boot (TI_HANDLE hHwInit) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - TTwd *pTWD = (TTwd *)pHwInit->hTWD; - TWlanParams *pWlanParams = &DB_WLAN(pTWD->hCmdBld); - TBootAttr tBootAttr; - - tBootAttr.MacClock = pWlanParams->MacClock; - tBootAttr.ArmClock = pWlanParams->ArmClock; - - /* - * Initialize the status of download to pending - * It will be set to TXN_STATUS_COMPLETE at the FinalizeDownload function - */ - pHwInit->DownloadStatus = TXN_STATUS_PENDING; - - /* Call the boot sequence state machine */ - pHwInit->uInitStage = 0; - - os_memoryCopy (pHwInit->hOs, &pHwInit->tBootAttr, &tBootAttr, sizeof(TBootAttr)); - - hwInit_BootSm (hHwInit); - - /* - * If it returns the status of the StartInstance only then we can here query for the download status - * and then return the status up to the TNETW_Driver. - * This return value will go back up to the TNETW Driver layer so that the init from OS will know - * if to wait for the InitComplte or not in case of TXN_STATUS_ERROR. - * This value will always be pending since the SPI is ASYNC - * and in SDIOa timer is set so it will be ASync also in anyway. - */ - return pHwInit->DownloadStatus; -} - - - /**************************************************************************** - * DESCRIPTION: Firmware boot state machine - * - * INPUTS: - * - * OUTPUT: None - * - * RETURNS: TI_OK - ****************************************************************************/ -static TI_STATUS hwInit_BootSm (TI_HANDLE hHwInit) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - TI_STATUS status = 0; - TTxnStruct *pTxn; - TI_UINT32 uData; - TTwd *pTWD = (TTwd *) pHwInit->hTWD; - IniFileGeneralParam *pGenParams = &DB_GEN(pTWD->hCmdBld); - TI_UINT32 clkVal = 0x3; - - switch (pHwInit->uInitStage) - { - case 0: - pHwInit->uInitStage++; - pHwInit->uTxnIndex = 0; - - /* Set the bus addresses partition to its "running" mode */ - SET_WORK_PARTITION(pHwInit->aPartition) - hwInit_SetPartition (pHwInit,pHwInit->aPartition); - -#ifdef _VLCT_ - /* Set FW to test mode */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, SCR_PAD8, 0xBABABABE, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - pHwInit->uTxnIndex++; -#endif - - if (( 0 == (pGenParams->RefClk & FREF_CLK_FREQ_MASK)) || (2 == (pGenParams->RefClk & FREF_CLK_FREQ_MASK)) - || (4 == (pGenParams->RefClk & FREF_CLK_FREQ_MASK))) - {/* ref clk: 19.2/38.4/38.4-XTAL */ - clkVal = 0x3; - } - if ((1 == (pGenParams->RefClk & FREF_CLK_FREQ_MASK)) || (3 == (pGenParams->RefClk & FREF_CLK_FREQ_MASK))) - {/* ref clk: 26/52 */ - clkVal = 0x5; - } - - WLAN_OS_REPORT(("CHIP VERSION... set 1273 chip top registers\n")); - - /* set the reference clock freq' to be used (pll_selinpfref field) */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, PLL_PARAMETERS, clkVal, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - /* read the PAUSE value to highest threshold */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, PLL_PARAMETERS, 0, - REGISTER_SIZE, TXN_DIRECTION_READ, (TTxnDoneCb)hwInit_BootSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status) - - case 1: - pHwInit->uInitStage ++; - /* We don't zero pHwInit->uTxnIndex at the begining because we need it's value to the next transaction */ - uData = pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData; - uData &= ~(0x3ff); - - /* Now we can zero the index */ - pHwInit->uTxnIndex = 0; - - /* set the the PAUSE value to highest threshold */ - uData |= WU_COUNTER_PAUSE_VAL; - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, WU_COUNTER_PAUSE, uData, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - /* Continue the ELP wake up sequence */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - /* Wait 500uS */ - os_StalluSec (pHwInit->hOs, 500); - - /* Set the bus addresses partition to DRPw registers region */ - SET_DRP_PARTITION(pHwInit->aPartition) - hwInit_SetPartition (pHwInit,pHwInit->aPartition); - - pHwInit->uTxnIndex++; - - /* Read-modify-write DRPW_SCRATCH_START register (see next state) to be used by DRPw FW. - The RTRIM value will be added by the FW before taking DRPw out of reset */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, DRPW_SCRATCH_START, 0, - REGISTER_SIZE, TXN_DIRECTION_READ,(TTxnDoneCb)hwInit_BootSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status) - - case 2: - pHwInit->uInitStage ++; - - /* multiply fref value by 2, so that {0,1,2,3} values will become {0,2,4,6} */ - /* Then, move it 4 places to the right, to alter Fref relevant bits in register 0x2c */ - clkVal = pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData; - pHwInit->uTxnIndex = 0; /* Reset index only after getting the last read value! */ - clkVal |= ((pGenParams->RefClk & 0x3)<< 1) << 4; - if ((pGenParams->GeneralSettings & DRPw_MASK_CHECK) > 0) - { - clkVal |= DRPw_MASK_SET; - } - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, DRPW_SCRATCH_START, clkVal, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - - /* Set the bus addresses partition back to its "running" mode */ - SET_WORK_PARTITION(pHwInit->aPartition) - hwInit_SetPartition (pHwInit,pHwInit->aPartition); - - /* - * end of CHIP init seq. - */ - - /* Disable interrupts */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, ACX_REG_INTERRUPT_MASK, ACX_INTR_ALL, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - /* Read the CHIP ID to get an indication that the bus is TI_OK */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, CHIP_ID, 0, - REGISTER_SIZE, TXN_DIRECTION_READ,(TTxnDoneCb)hwInit_BootSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status) - - case 3: - pHwInit->uInitStage ++; - - /* We don't zero pHwInit->uTxnIndex at the begining because we need it's value to the next transaction */ - pHwInit->uChipId = pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData; - - /* This is only sanity check that the HW exists, we can continue and fail on FwLoad */ - if (pHwInit->uChipId == CHIP_ID_1273_PG10) - { - WLAN_OS_REPORT(("Error!! 1273 PG 1.0 is not supported anymore!!.\n")); - } - else if (pHwInit->uChipId == CHIP_ID_1273_PG20) - { - WLAN_OS_REPORT(("Working on a 1273 PG 2.0 board.\n")); - } - else - { - WLAN_OS_REPORT (("Error!! Found unknown Chip Id = 0x%x\n", pHwInit->uChipId)); - - /* - * NOTE: no exception because of forward compatibility - */ - } - - /* - * Soft reset - */ - pHwInit->uResetStage = 0; - pHwInit->uSelfClearTime = 0; - pHwInit->uBootData = 0; - status = hwInit_ResetSm (pHwInit); - - EXCEPT (pHwInit, status) - - case 4: - pHwInit->uInitStage ++; - - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INIT , "TNET SOFT-RESET\n"); - - WLAN_OS_REPORT(("Starting to process NVS...\n")); - - /* - * Start EEPROM/NVS burst - */ - - if (pHwInit->pEEPROMBuf) - { - /* NVS file exists (EEPROM-less support) */ - pHwInit->uEEPROMCurLen = pHwInit->uEEPROMLen; - - TRACE2(pHwInit->hReport, REPORT_SEVERITY_INIT , "EEPROM Image addr=0x%x, EEPROM Len=0x0x%x\n", pHwInit->pEEPROMBuf, pHwInit->uEEPROMLen); - WLAN_OS_REPORT (("NVS found, EEPROM Image addr=0x%x, EEPROM Len=0x0x%x\n", - pHwInit->pEEPROMBuf, pHwInit->uEEPROMLen)); - } - else - { - WLAN_OS_REPORT (("No Nvs, Setting default MAC address\n")); - pHwInit->uEEPROMCurLen = DEF_NVS_SIZE; - pHwInit->pEEPROMBuf = (TI_UINT8*)(&pHwInit->aDefaultNVS[0]); - WLAN_OS_REPORT (("pHwInit->uEEPROMCurLen: %x\n", pHwInit->uEEPROMCurLen)); - WLAN_OS_REPORT (("ERROR: If you are not calibating the device, you will soon get errors !!!\n")); - - } - - pHwInit->pEEPROMCurPtr = pHwInit->pEEPROMBuf; - pHwInit->uEEPROMStage = 0; - status = hwInit_EepromlessStartBurstSm (hHwInit); - - EXCEPT (pHwInit, status) - - case 5: - pHwInit->uInitStage ++; - pHwInit->uTxnIndex = 0; - - if (pHwInit->pEEPROMBuf) - { - /* Signal FW that we are eeprom less */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, ACX_EEPROMLESS_IND_REG, ACX_EEPROMLESS_IND_REG, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INIT , "DRIVER NVS BURST-READ\n"); - } - else - { - /* 1273 - EEPROM is not support by FPGA yet */ - /* - * Start ACX EEPROM - */ - /*pHwInit->uRegister = START_EEPROM_MGR; - TXN_PARAM_SET(pTxn, TXN_LOW_PRIORITY, TXN_FUNC_ID_WLAN, TXN_DIRECTION_WRITE, TXN_INC_ADDR) - BUILD_TTxnStruct(pTxn, ACX_REG_EE_START, &pHwInit->uRegister, REGISTER_SIZE, 0, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn);*/ - - /* - * The stall is needed so the EEPROM NVS burst read will complete - */ - os_StalluSec (pHwInit->hOs, 40000); - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, ACX_EEPROMLESS_IND_REG, USE_EEPROM, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INIT , "STARTING EEPROM NVS BURST-READ\n"); - } - - pHwInit->uTxnIndex++; - - /* Read Chip ID */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, CHIP_ID, 0, - REGISTER_SIZE, TXN_DIRECTION_READ,(TTxnDoneCb)hwInit_BootSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status) - - case 6: - pHwInit->uInitStage ++; - /* We don't zero pHwInit->uTxnIndex at the begining because we need it's value to the next transaction */ - pHwInit->uBootData = pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData; - /* Now we can zero the index */ - pHwInit->uTxnIndex = 0; - - WLAN_OS_REPORT(("Chip ID is 0x%X.\n", pHwInit->uBootData)); - /* if the WLAN_EN is ON but MainClock is problamtic the chip-id will be zero*/ - if (pHwInit->uBootData == 0) - { - WLAN_OS_REPORT(("Cannot read ChipID stopping\n", pHwInit->uBootData)); - TWD_FinalizeOnFailure (pHwInit->hTWD); - return TXN_STATUS_ERROR; - } - - - - /* Read Scr2 to verify that the HW is ready */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, SCR_PAD2, 0, - REGISTER_SIZE, TXN_DIRECTION_READ,(TTxnDoneCb)hwInit_BootSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - EXCEPT (pHwInit, status) - - case 7: - pHwInit->uInitStage ++; - /* We don't zero pHwInit->uTxnIndex at the begining because we need it's value to the next transaction */ - pHwInit->uBootData = pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData; - - if (pHwInit->uBootData == 0xffffffff) - { - TRACE0(pHwInit->hReport, REPORT_SEVERITY_FATAL_ERROR , "Error in SCR_PAD2 register\n"); - EXCEPT (pHwInit, TXN_STATUS_ERROR) - } - - /* Call the restart sequence */ - pHwInit->uInitSeqStage = 0; - pHwInit->uInitSeqStatus = TXN_STATUS_COMPLETE; - - EXCEPT (pHwInit, status) - - case 8: - pHwInit->uInitStage++; - if ((pGenParams->RefClk & FREF_CLK_TYPE_MASK) != 0x0) - { - status = hwInit_InitTopRegisterRead(hHwInit, 0x448); - EXCEPT (pHwInit, status) - } - - case 9: - pHwInit->uInitStage++; - - if ((pGenParams->RefClk & FREF_CLK_TYPE_MASK) != 0x0) - { - pHwInit->uTopRegValue &= FREF_CLK_TYPE_BITS; - pHwInit->uTopRegValue |= CLK_REQ_PRCM; - status = hwInit_InitTopRegisterWrite( hHwInit, 0x448, pHwInit->uTopRegValue); - EXCEPT (pHwInit, status) - } - - case 10: - pHwInit->uInitStage++; - if ((pGenParams->RefClk & FREF_CLK_POLARITY_MASK) == 0x0) - { - status = hwInit_InitTopRegisterRead(hHwInit, 0xCB2); - EXCEPT (pHwInit, status) - } - - case 11: - pHwInit->uInitStage++; - if ((pGenParams->RefClk & FREF_CLK_POLARITY_MASK) == 0x0) - { - pHwInit->uTopRegValue &= FREF_CLK_POLARITY_BITS; - pHwInit->uTopRegValue |= CLK_REQ_OUTN_SEL; - status = hwInit_InitTopRegisterWrite( hHwInit, 0xCB2, pHwInit->uTopRegValue); - EXCEPT (pHwInit, status) - } - - case 12: - pHwInit->uInitStage = 0; - - /* Set the Download Status to COMPLETE */ - pHwInit->DownloadStatus = TXN_STATUS_COMPLETE; - - /* Call upper layer callback */ - if (pHwInit->fInitHwCb) - { - (*pHwInit->fInitHwCb) (pHwInit->hTWD); - } - - return TI_OK; - } - - return TI_OK; -} - - -TI_STATUS hwInit_LoadFw (TI_HANDLE hHwInit) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - TI_STATUS status; - - /* check parameters */ - if (hHwInit == NULL) - { - EXCEPT (pHwInit, TXN_STATUS_ERROR) - } - - if (pHwInit->pFwBuf) - { - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INIT , "CPU halt -> download code\n"); - - /* Load firmware image */ - pHwInit->uLoadStage = 0; - status = hwInit_LoadFwImageSm (pHwInit); - - switch (status) - { - case TI_OK: - case TXN_STATUS_OK: - case TXN_STATUS_COMPLETE: - WLAN_OS_REPORT (("Firmware successfully downloaded.\n")); - break; - case TXN_STATUS_PENDING: - WLAN_OS_REPORT (("Starting to download firmware...\n")); - break; - default: - TRACE0(pHwInit->hReport, REPORT_SEVERITY_ERROR , "Firmware download failed!\n"); - break; - } - - EXCEPT (pHwInit, status); - } - else - { - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INIT , "Firmware not downloaded...\n"); - - EXCEPT (pHwInit, TXN_STATUS_ERROR) - } - - WLAN_OS_REPORT (("FW download OK...\n")); - return TI_OK; -} - - -/**************************************************************************** - * hwInit_FinalizeDownloadSm() - **************************************************************************** - * DESCRIPTION: Run the Hardware firmware - * Wait for Init Complete - * Configure the Bus Access with Addresses available on the scratch pad register - * Change the SDIO/SPI partitions to be able to see all the memory addresses - * - * INPUTS: None - * - * OUTPUT: None - * - * RETURNS: None - ****************************************************************************/ -static TI_STATUS hwInit_FinalizeDownloadSm (TI_HANDLE hHwInit) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - TTwd *pTWD = (TTwd *)pHwInit->hTWD; - TI_STATUS status = TI_OK; - TTxnStruct* pTxn; - - - while (TI_TRUE) - { - switch (pHwInit->uFinStage) - { - case 0: - pHwInit->uFinStage = 1; - pHwInit->uTxnIndex = 0; - /* - * Run the firmware (I) - Read current value from ECPU Control Reg. - */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, ACX_REG_ECPU_CONTROL, 0, - REGISTER_SIZE, TXN_DIRECTION_READ, (TTxnDoneCb)hwInit_FinalizeDownloadSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status) - - case 1: - pHwInit->uFinStage ++; - /* We don't zero pHwInit->uTxnIndex at the begining because we need it's value to the next transaction */ - pHwInit->uFinData = pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData; - /* Now we can zero the index */ - pHwInit->uTxnIndex = 0; - - /* - * Run the firmware (II) - Take HW out of reset (write ECPU_CONTROL_HALT to ECPU Control Reg.) - */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, ACX_REG_ECPU_CONTROL, (pHwInit->uFinData | ECPU_CONTROL_HALT), - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - WLAN_OS_REPORT (("Firmware running.\n")); - - /* - * CHIP ID Debug - */ - - pHwInit->uTxnIndex++; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, CHIP_ID, 0, - REGISTER_SIZE, TXN_DIRECTION_READ, (TTxnDoneCb)hwInit_FinalizeDownloadSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status) - - case 2: - pHwInit->uFinStage ++; - pHwInit->uFinLoop = 0; - - /* We don't zero pHwInit->uTxnIndex at the begining because we need it's value to the next transaction */ - pHwInit->uFinData = pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData; - - TRACE1(pHwInit->hReport, REPORT_SEVERITY_INIT , "CHIP ID IS %x\n", pHwInit->uFinData); - - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INIT , "Wait init complete\n"); - - case 3: - pHwInit->uTxnIndex = 0; - - /* - * Wait for init complete - */ - if (pHwInit->uFinLoop < FIN_LOOP) - { - pHwInit->uFinStage = 4; - -#ifndef DOWNLOAD_TIMER_REQUIERD - os_StalluSec (pHwInit->hOs, 50); -#endif - - /* Read interrupt status register */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, ACX_REG_INTERRUPT_NO_CLEAR, 0, - REGISTER_SIZE, TXN_DIRECTION_READ, (TTxnDoneCb)hwInit_FinalizeDownloadSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status) - } - else - { - pHwInit->uFinStage = 5; - } - continue; - - case 4: - /* We don't zero pHwInit->uTxnIndex at the begining because we need it's value to the next transaction */ - pHwInit->uFinData = pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData; - /* Now we can zero the index */ - pHwInit->uTxnIndex = 0; - - if (pHwInit->uFinData == 0xffffffff) /* error */ - { - TRACE0(pHwInit->hReport, REPORT_SEVERITY_ERROR , "Error reading hardware complete init indication\n"); - - pHwInit->DownloadStatus = TXN_STATUS_ERROR; - EXCEPT (pHwInit, TXN_STATUS_ERROR) - } - - if (IS_MASK_ON (pHwInit->uFinData, ACX_INTR_INIT_COMPLETE)) - { - pHwInit->uFinStage = 5; - - /* Interrupt ACK */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, ACX_REG_INTERRUPT_ACK, ACX_INTR_INIT_COMPLETE, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - break; - } - else - { - pHwInit->uFinStage = 3; - pHwInit->uFinLoop ++; - -#ifdef DOWNLOAD_TIMER_REQUIERD - tmr_StartTimer (pHwInit->hStallTimer, hwInit_StallTimerCb, hHwInit, STALL_TIMEOUT, TI_FALSE); - return TXN_STATUS_PENDING; -#endif - } -#ifndef DOWNLOAD_TIMER_REQUIERD - continue; -#endif - - case 5: - pHwInit->uFinStage++; - - if (pHwInit->uFinLoop >= FIN_LOOP) - { - TRACE0(pHwInit->hReport, REPORT_SEVERITY_ERROR , "Timeout waiting for the hardware to complete initialization\n"); - - pHwInit->DownloadStatus = TXN_STATUS_ERROR; - EXCEPT (pHwInit, TXN_STATUS_ERROR); - } - - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INIT , "Firmware init complete...\n"); - - /* - * There are valid addresses of the command and event mailbox - * on the scratch pad registers - */ - /* Hardware config command mail box */ - status = cmdMbox_ConfigHw (pTWD->hCmdMbox, - (fnotify_t)hwInit_FinalizeDownloadSm, - hHwInit); - EXCEPT (pHwInit, status) - - case 6: - pHwInit->uFinStage++; - - /* Hardware config event mail box */ - status = eventMbox_InitMboxAddr (pTWD->hEventMbox, - (fnotify_t)hwInit_FinalizeDownloadSm, - hHwInit); - EXCEPT (pHwInit, status); - - case 7: - pHwInit->uFinStage++; - pHwInit->uTxnIndex = 0; - - SET_WORK_PARTITION(pHwInit->aPartition) - /* Set the bus addresses partition to its "running" mode */ - SET_WORK_PARTITION(pHwInit->aPartition) - hwInit_SetPartition (pHwInit,pHwInit->aPartition); - - /* Unmask interrupts needed in the FW configuration phase */ - fwEvent_SetInitMask (pTWD->hFwEvent); - - /* Get FW static information from mailbox area */ - BUILD_HW_INIT_FW_STATIC_TXN(pHwInit, pTxn, cmdMbox_GetMboxAddress (pTWD->hCmdMbox), - (TTxnDoneCb)hwInit_FinalizeDownloadSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status); - continue; - - case 8: - - pHwInit->uFinStage = 0; - - cmdBld_FinalizeDownload (pTWD->hCmdBld, &pHwInit->tBootAttr, &(pHwInit->tFwStaticTxn.tFwStaticInfo)); - - /* Set the Download Status to COMPLETE */ - pHwInit->DownloadStatus = TXN_STATUS_COMPLETE; - - return TXN_STATUS_COMPLETE; - - } /* End switch */ - - } /* End while */ - -} - - -/**************************************************************************** - * hwInit_ResetSm() - **************************************************************************** - * DESCRIPTION: Reset hardware state machine - * - * INPUTS: None - * - * OUTPUT: None - * - * RETURNS: TI_OK or TI_NOK - ****************************************************************************/ -static TI_STATUS hwInit_ResetSm (TI_HANDLE hHwInit) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - TI_STATUS status = TI_OK; - TTxnStruct* pTxn; - - pHwInit->uTxnIndex = 0; - - /* Disable Rx/Tx */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, REG_ENABLE_TX_RX, 0x0, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - pHwInit->uTxnIndex++; - return status; -} - - -/**************************************************************************** - * hwInit_EepromlessStartBurstSm() - **************************************************************************** - * DESCRIPTION: prepare eepromless configuration before boot - * - * INPUTS: - * - * OUTPUT: - * - * RETURNS: - ****************************************************************************/ -static TI_STATUS hwInit_EepromlessStartBurstSm (TI_HANDLE hHwInit) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - TI_STATUS status = TI_OK; - TI_UINT8 *uAddr; - TI_UINT32 uDeltaLength; - TTxnStruct* pTxn; - - pHwInit->uTxnIndex = 0; - - while (TI_TRUE) - { - switch (pHwInit->uEEPROMStage) - { - /* - * Stages 0, 1 handles the eeprom format parameters: - * ------------------------------------------------ - * Length - 8bit --> The length is counted in 32bit words - * Address - 16bit - * Data - (Length * 4) bytes - * - * Note: The nvs is in big endian format and we need to change it to little endian - */ - case 0: - /* Check if address LSB = 1 --> Register address */ - if ((pHwInit->uEEPROMRegAddr = pHwInit->pEEPROMCurPtr[1]) & 1) - { - /* Mask the register's address LSB before writing to it */ - pHwInit->uEEPROMRegAddr &= 0xfe; - /* Change the address's endian */ - pHwInit->uEEPROMRegAddr |= (TI_UINT32)pHwInit->pEEPROMCurPtr[2] << 8; - /* Length of burst data */ - pHwInit->uEEPROMBurstLen = pHwInit->pEEPROMCurPtr[0]; - pHwInit->pEEPROMCurPtr += 3; - pHwInit->uEEPROMBurstLoop = 0; - /* - * We've finished reading the burst information. - * Go to stage 1 in order to write it - */ - pHwInit->uEEPROMStage = 1; - } - /* If address LSB = 0 --> We're not in the burst section */ - else - { - /* End of Burst transaction: we should see 7 zeroed bytes */ - if (pHwInit->pEEPROMCurPtr[0] == 0) - { - pHwInit->pEEPROMCurPtr += 7; - } - pHwInit->uEEPROMCurLen -= (pHwInit->pEEPROMCurPtr - pHwInit->pEEPROMBuf + 1); - pHwInit->uEEPROMCurLen = (pHwInit->uEEPROMCurLen + NVS_DATA_BUNDARY_ALIGNMENT - 1) & 0xfffffffc; - /* End of Burst transaction, go to TLV section */ - pHwInit->uEEPROMStage = 2; - } - continue; - - case 1: - if (pHwInit->uEEPROMBurstLoop < pHwInit->uEEPROMBurstLen) - { - /* Change the data's endian */ - TI_UINT32 val = (pHwInit->pEEPROMCurPtr[0] | - (pHwInit->pEEPROMCurPtr[1] << 8) | - (pHwInit->pEEPROMCurPtr[2] << 16) | - (pHwInit->pEEPROMCurPtr[3] << 24)); - - TRACE2(pHwInit->hReport, REPORT_SEVERITY_INIT , "NVS::BurstRead: *(%08x) = %x\n", pHwInit->uEEPROMRegAddr, val); - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, (REGISTERS_BASE+pHwInit->uEEPROMRegAddr), val, - REGISTER_SIZE, TXN_DIRECTION_WRITE, (TTxnDoneCb)hwInit_EepromlessStartBurstSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uEEPROMStatus = status; - pHwInit->uEEPROMRegAddr += WORD_SIZE; - pHwInit->pEEPROMCurPtr += WORD_SIZE; - /* While not end of burst, we stay in stage 1 */ - pHwInit->uEEPROMStage = 1; - pHwInit->uEEPROMBurstLoop ++; - - EXCEPT (pHwInit, status); - } - else - { - /* If end of burst return to stage 0 to read the next one */ - pHwInit->uEEPROMStage = 0; - } - - continue; - - case 2: - - - pHwInit->uEEPROMStage = 3; - - /* Set the bus addresses partition to its "running" mode */ - SET_WORK_PARTITION(pHwInit->aPartition) - hwInit_SetPartition (pHwInit,pHwInit->aPartition); - continue; - - case 3: - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INIT , "Reached TLV section\n"); - - /* Align the host address */ - if (((TI_UINT32)pHwInit->pEEPROMCurPtr & WORD_ALIGNMENT_MASK) && (pHwInit->uEEPROMCurLen > 0) ) - { - uAddr = (TI_UINT8*)(((TI_UINT32)pHwInit->pEEPROMCurPtr & 0xFFFFFFFC)+WORD_SIZE); - uDeltaLength = uAddr - pHwInit->pEEPROMCurPtr + 1; - - pHwInit->pEEPROMCurPtr = uAddr; - pHwInit->uEEPROMCurLen-= uDeltaLength; - } - - TRACE2(pHwInit->hReport, REPORT_SEVERITY_INIT , "NVS::WriteTLV: pEEPROMCurPtr= %x, Length=%d\n", pHwInit->pEEPROMCurPtr, pHwInit->uEEPROMCurLen); - - if (pHwInit->uEEPROMCurLen) - { - /* Save the 4 bytes before the NVS data for WSPI case where they are overrun by the WSPI BusDrv */ - pHwInit->uSavedDataForWspiHdr = *(TI_UINT32 *)(pHwInit->pEEPROMCurPtr - WSPI_PAD_LEN_WRITE); - - /* Prepare the Txn structure for the NVS transaction to the CMD_MBOX */ - HW_INIT_PTXN_SET(pHwInit, pTxn) - TXN_PARAM_SET_DIRECTION(pTxn, TXN_DIRECTION_WRITE); - BUILD_TTxnStruct(pTxn, CMD_MBOX_ADDRESS, pHwInit->pEEPROMCurPtr, pHwInit->uEEPROMCurLen, - (TTxnDoneCb)hwInit_EepromlessStartBurstSm, hHwInit) - - /* Transact the NVS data to the CMD_MBOX */ - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uEEPROMCurLen = 0; - pHwInit->uNVSStatus = status; - - EXCEPT (pHwInit, status); - } - else - { - /* Restore the 4 bytes before the NVS data for WSPI case were they are overrun by the WSPI BusDrv */ - *(TI_UINT32 *)(pHwInit->pEEPROMCurPtr - WSPI_PAD_LEN_WRITE) = pHwInit->uSavedDataForWspiHdr; - - /* Call the upper level state machine */ - if (pHwInit->uEEPROMStatus == TXN_STATUS_PENDING || - pHwInit->uNVSStatus == TXN_STATUS_PENDING) - { - hwInit_BootSm (hHwInit); - } - - return TXN_STATUS_COMPLETE; - } - } /* End switch */ - - } /* End while */ -} - -/**************************************************************************** - * hwInit_LoadFwImageSm() - **************************************************************************** - * DESCRIPTION: Load image from the host and download into the hardware - * - * INPUTS: None - * - * OUTPUT: None - * - * RETURNS: TI_OK or TI_NOK - ****************************************************************************/ - - -#define ADDRESS_SIZE (sizeof(TI_INT32)) - -static TI_STATUS hwInit_LoadFwImageSm (TI_HANDLE hHwInit) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - TI_STATUS status = TI_OK; - ETxnStatus TxnStatus; - TI_UINT32 uMaxPartitionSize = PARTITION_DOWN_MEM_SIZE; - TTxnStruct* pTxn; - - pHwInit->uTxnIndex = 0; - - while (TI_TRUE) - { - switch (pHwInit->uLoadStage) - { - case 0: - pHwInit->uLoadStage = 1; - - /* Check the Downloaded FW alignment */ - if ((pHwInit->uFwLength % ADDRESS_SIZE) != 0) - { - TRACE1(pHwInit->hReport, REPORT_SEVERITY_ERROR , "Length of downloaded Portion (%d) is not aligned\n",pHwInit->uFwLength); - EXCEPT_L (pHwInit, TXN_STATUS_ERROR); - } - - TRACE2(pHwInit->hReport, REPORT_SEVERITY_INIT , "Image addr=0x%x, Len=0x%x\n", pHwInit->pFwBuf, pHwInit->uFwLength); - - /* Set bus memory partition to current download area */ - SET_FW_LOAD_PARTITION(pHwInit->aPartition,pHwInit->uFwAddress) - hwInit_SetPartition (pHwInit,pHwInit->aPartition); - status = TI_OK; - break; - - case 1: - - pHwInit->uLoadStage = 2; - /* if initial size is smaller than MAX_SDIO_BLOCK - go strait to stage 4 to write partial block */ - if (pHwInit->uFwLength < MAX_SDIO_BLOCK) - { - pHwInit->uLoadStage = 4; - } - - pHwInit->uBlockReadNum = 0; - pHwInit->uBlockWriteNum = 0; - pHwInit->uPartitionLimit = pHwInit->uFwAddress + uMaxPartitionSize; - - continue; - - case 2: - - /* Load firmware by blocks */ - if (pHwInit->uBlockReadNum < (pHwInit->uFwLength / MAX_SDIO_BLOCK)) - { - pHwInit->uLoadStage = 3; - - /* Change partition */ - /* The +2 is for the last block and the block remainder */ - if ( ((pHwInit->uBlockWriteNum + 2) * MAX_SDIO_BLOCK + pHwInit->uFwAddress) > pHwInit->uPartitionLimit) - { - pHwInit->uFwAddress += pHwInit->uBlockWriteNum * MAX_SDIO_BLOCK; - /* update uPartitionLimit */ - pHwInit->uPartitionLimit = pHwInit->uFwAddress + uMaxPartitionSize; - /* Set bus memory partition to current download area */ - SET_FW_LOAD_PARTITION(pHwInit->aPartition,pHwInit->uFwAddress) - hwInit_SetPartition (pHwInit,pHwInit->aPartition); - TxnStatus = TXN_STATUS_OK; - pHwInit->uBlockWriteNum = 0; - TRACE1(pHwInit->hReport, REPORT_SEVERITY_INIT , "Change partition to address offset = 0x%x\n", pHwInit->uFwAddress + pHwInit->uBlockWriteNum * MAX_SDIO_BLOCK); - EXCEPT_L (pHwInit, TxnStatus); - } - } - else - { - pHwInit->uLoadStage = 4; - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INIT , "Load firmware with Portions\n"); - } - continue; - - case 3: - pHwInit->uLoadStage = 2; - - pHwInit->uTxnIndex = 0; - - /* Copy image block to temporary buffer */ - os_memoryCopy (pHwInit->hOs, - (void *)&pHwInit->auFwTmpBuf[WSPI_PAD_LEN_WRITE], - (void *)(pHwInit->pFwBuf + pHwInit->uBlockReadNum * MAX_SDIO_BLOCK), - MAX_SDIO_BLOCK); - - /* Load the block. Save WSPI_PAD_LEN_WRITE space for WSPI bus command */ - BUILD_HW_INIT_FW_DL_TXN(pHwInit, pTxn, (pHwInit->uFwAddress + pHwInit->uBlockWriteNum * MAX_SDIO_BLOCK), - (pHwInit->auFwTmpBuf + WSPI_PAD_LEN_WRITE), MAX_SDIO_BLOCK, TXN_DIRECTION_WRITE, - (TTxnDoneCb)hwInit_LoadFwImageSm, hHwInit) - TxnStatus = twIf_Transact(pHwInit->hTwIf, pTxn); - - /* Log ERROR if the transaction returned ERROR */ - if (TxnStatus == TXN_STATUS_ERROR) - { - TRACE1(pHwInit->hReport, REPORT_SEVERITY_ERROR , "hwInit_LoadFwImageSm: twIf_Transact retruned status=0x%x\n", TxnStatus); - } - - pHwInit->uBlockWriteNum ++; - pHwInit->uBlockReadNum ++; - EXCEPT_L (pHwInit, TxnStatus); - continue; - - case 4: - pHwInit->uLoadStage = 5; - - pHwInit->uTxnIndex = 0; - - /* If No Last block to write */ - if ( pHwInit->uFwLength % MAX_SDIO_BLOCK == 0 ) - { - continue; - } - - - /* Copy the last image block */ - os_memoryCopy (pHwInit->hOs, - (void *)&pHwInit->auFwTmpBuf[WSPI_PAD_LEN_WRITE], - (void *)(pHwInit->pFwBuf + pHwInit->uBlockReadNum * MAX_SDIO_BLOCK), - pHwInit->uFwLength % MAX_SDIO_BLOCK); - - /* Load the last block */ - BUILD_HW_INIT_FW_DL_TXN(pHwInit, pTxn, (pHwInit->uFwAddress + pHwInit->uBlockWriteNum * MAX_SDIO_BLOCK), - (pHwInit->auFwTmpBuf + WSPI_PAD_LEN_WRITE), (pHwInit->uFwLength % MAX_SDIO_BLOCK), TXN_DIRECTION_WRITE, - (TTxnDoneCb)hwInit_LoadFwImageSm, hHwInit) - TxnStatus = twIf_Transact(pHwInit->hTwIf, pTxn); - - if (TxnStatus == TXN_STATUS_ERROR) - { - TRACE1(pHwInit->hReport, REPORT_SEVERITY_ERROR , "hwInit_LoadFwImageSm: last block retruned status=0x%x\n", TxnStatus); - } - - EXCEPT_L (pHwInit, TxnStatus); - continue; - - case 5: - pHwInit->uLoadStage = 0; - - /*If end of overall FW Download Process: Finalize download (run firmware)*/ - if ( pHwInit->bFwBufLast == TI_TRUE ) - { - /* The download has completed */ - WLAN_OS_REPORT (("Finished downloading firmware.\n")); - status = hwInit_FinalizeDownloadSm (hHwInit); - } - /* Have to wait to more FW Portions */ - else - { - /* Call the upper layer callback */ - if ( pHwInit->fFinalizeDownload != NULL ) - { - (pHwInit->fFinalizeDownload) (pHwInit->hFinalizeDownload); - } - - status = TI_OK; - } - return status; - - } /* End switch */ - - } /* End while */ - -} /* hwInit_LoadFwImageSm() */ - -#define READ_TOP_REG_LOOP 32 - -/**************************************************************************** - * hwInit_ReadRadioParamsSm () - **************************************************************************** - * DESCRIPTION: hwInit_ReadRadioParamsSm - * INPUTS: None - * - * OUTPUT: None - * - * RETURNS: TI_OK or TI_NOK - ****************************************************************************/ -TI_STATUS hwInit_ReadRadioParamsSm (TI_HANDLE hHwInit) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - TTwd *pTWD = (TTwd *)pHwInit->hTWD; - IniFileGeneralParam *pGenParams = &DB_GEN(pTWD->hCmdBld); - TI_UINT32 val= 0, value; - TI_UINT32 add = FUNC7_SEL; - TI_UINT32 retAddress; - TTxnStruct *pTxn; - TI_STATUS status = 0; - - - while (TI_TRUE) - { - switch (pHwInit->uRegStage) - { - case 0: - pHwInit->uRegStage = 1; - pHwInit->uTxnIndex++; - - /* - * Select GPIO over Debug for BT_FUNC7 clear bit 17 - */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, GPIO_SELECT, 0, - REGISTER_SIZE, TXN_DIRECTION_READ, (TTxnDoneCb)hwInit_ReadRadioParamsSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status) - - case 1: - pHwInit->uRegStage ++; - pHwInit->uRegLoop = 0; - - /* We don't zero pHwInit->uTxnIndex at the begining because we need it's value to the next transaction */ - val = (pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData); - val &= 0xFFFDFFFF; /*clear bit 17*/ - /* Now we can zero the index */ - pHwInit->uTxnIndex = 0; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, GPIO_SELECT, val, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - pHwInit->uRegData = FUNC7_SEL; - - continue; - - case 2: - - pHwInit->uRegStage ++; - add = pHwInit->uRegData; - - - /* Select GPIO over Debug for BT_FUNC7*/ - retAddress = (TI_UINT32)(add / 2); - val = (retAddress & 0x7FF); - val |= BIT_16 | BIT_17; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_POR_CTR, val, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_CMD, 0x2, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - continue; - - case 3: - - pHwInit->uRegStage ++; - pHwInit->uTxnIndex++; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_DATA_RD, 0, - REGISTER_SIZE, TXN_DIRECTION_READ, (TTxnDoneCb)hwInit_ReadRadioParamsSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status) - - - case 4: - - val = (pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData); - - pHwInit->uTxnIndex = 0; - if (val & BIT_18) - { - if ((val & BIT_16) && (!(val & BIT_17))) - { - pHwInit->uRegStage ++; - pHwInit->uRegLoop = 0; - - } - else - { - TRACE0(pHwInit->hReport, REPORT_SEVERITY_ERROR , "can't writing bt_func7_sel\n"); - - TWD_FinalizeFEMRead(pHwInit->hTWD); - - return TI_NOK; - } - } - else - { - if (pHwInit->uRegLoop < READ_TOP_REG_LOOP) - { - pHwInit->uRegStage = 3; - pHwInit->uRegLoop++; - } - else - { - - TRACE0(pHwInit->hReport, REPORT_SEVERITY_ERROR , "Timeout waiting for writing bt_func7_sel\n"); - - TWD_FinalizeFEMRead(pHwInit->hTWD); - - return TI_NOK; - - } - } - - continue; - - case 5: - pHwInit->uRegStage ++; - add = pHwInit->uRegData; - retAddress = (TI_UINT32)(add / 2); - value = (retAddress & 0x7FF); - value |= BIT_16 | BIT_17; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_POR_CTR, value, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - if (pHwInit->uRegSeqStage == 0) - { - if (pHwInit->uRegData == FUNC7_SEL) - value = (val | 0x600); - else - value = (val | 0x1000); - } - else - { - if (pHwInit->uRegData == FUNC7_SEL) - value = (val & 0xF8FF); - else - value = (val & 0xCFFF); - - } - - value &= 0xFFFF; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_POR_WDATA, value, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_CMD, 0x1, - REGISTER_SIZE, TXN_DIRECTION_WRITE, (TTxnDoneCb)hwInit_ReadRadioParamsSm, hHwInit) - - /*BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, INDIRECT_REG5, 0x1, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) */ - - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - if ((pHwInit->uRegData == FUNC7_SEL)&& (pHwInit->uRegSeqStage == 0)) - { - pHwInit->uRegData = FUNC7_PULL; - pHwInit->uRegStage = 2; - } - else - { - if ((pHwInit->uRegData == FUNC7_PULL)&& (pHwInit->uRegSeqStage == 1)) - { - pHwInit->uRegData = FUNC7_SEL; - pHwInit->uRegStage = 2; - } - } - - EXCEPT (pHwInit, status) - continue; - - case 6: - - if (pHwInit->uRegSeqStage == 1) - { - pHwInit->uRegStage = 8; - } - else - { - pHwInit->uRegStage ++; - pHwInit->uTxnIndex++; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, GPIO_OE_RADIO, 0, - REGISTER_SIZE, TXN_DIRECTION_READ, (TTxnDoneCb)hwInit_ReadRadioParamsSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - EXCEPT (pHwInit, status) - } - continue; - - case 7: - pHwInit->uRegStage ++; - - /* We don't zero pHwInit->uTxnIndex at the begining because we need it's value to the next transaction */ - val = (pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData); - val |= 0x00020000; - - pHwInit->uTxnIndex = 0; - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, GPIO_OE_RADIO, val, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, GPIO_IN, 0, - REGISTER_SIZE, TXN_DIRECTION_READ, (TTxnDoneCb)hwInit_ReadRadioParamsSm, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status) - - - case 8: - if (pHwInit->uRegSeqStage == 0) - { - val = (pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData); - val &= 0x20000; - if(val) - { - pGenParams->TXBiPFEMManufacturer = FEM_TRIQUINT_TYPE_E; - } - else - { - pGenParams->TXBiPFEMManufacturer = FEM_RFMD_TYPE_E; - } - WLAN_OS_REPORT (("FEM Type %d \n",pGenParams->TXBiPFEMManufacturer)); - pHwInit->uTxnIndex = 0; - pHwInit->uRegSeqStage = 1; - pHwInit->uRegStage = 2; - pHwInit->uRegData = FUNC7_PULL; - continue; - } - else - { - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INFORMATION, "hwInit_ReadRadioParamsSm Ended Successfully\n"); - - TWD_FinalizeFEMRead(pHwInit->hTWD); - - return TI_OK; - - } - - } /* End switch */ - - } /* End while */ - -} - - -/**************************************************************************** - * hwInit_ReadRadioParams() - **************************************************************************** - * DESCRIPTION: hwInit_ReadRadioParamsSm - * initalizie hwInit_ReadRadioParamsSm parmaeters - ****************************************************************************/ - -TI_STATUS hwInit_ReadRadioParams (TI_HANDLE hHwInit) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - - pHwInit->uRegStage = 0; - pHwInit->uRegSeqStage = 0; - - return hwInit_ReadRadioParamsSm (hHwInit); -} - -/**************************************************************************** - * hwInit_InitPoalrity() - **************************************************************************** - * DESCRIPTION: hwInit_ReadRadioParamsSm - * initalizie hwInit_ReadRadioParamsSm parmaeters - ****************************************************************************/ - -TI_STATUS hwInit_InitPolarity(TI_HANDLE hHwInit) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - - pHwInit->uRegStage = 0; - pHwInit->uRegSeqStage = 0; - - return hwInit_WriteIRQPolarity (hHwInit); -} - - - -/**************************************************************************** - * hwInit_WriteIRQPolarity () - **************************************************************************** - * DESCRIPTION: hwInit_WriteIRQPolarity - * INPUTS: None - * - * OUTPUT: None - * - * RETURNS: TI_OK or TI_NOK - ****************************************************************************/ - TI_STATUS hwInit_WriteIRQPolarity(TI_HANDLE hHwInit) - { - THwInit *pHwInit = (THwInit *)hHwInit; - TI_UINT32 Address,value; - TI_UINT32 val=0; - TTxnStruct *pTxn; - TI_STATUS status = 0; - - /* To write to a top level address from the WLAN IP: - Write the top level address to the OCP_POR_CTR register. - Divide the top address by 2, and add 0x30000 to the result – for example for top address 0xC00, write to the OCP_POR_CTR 0x30600 - Write the data to the OCP_POR_WDATA register - Write 0x1 to the OCP_CMD register. - - To read from a top level address: - Write the top level address to the OCP_POR_CTR register. - Divide the top address by 2, and add 0x30000 to the result – for example for top address 0xC00, write to the OCP_POR_CTR 0x30600 - Write 0x2 to the OCP_CMD register. - Poll bit [18] of OCP_DATA_RD for data valid indication - Check bits 17:16 of OCP_DATA_RD: - 00 – no response - 01 – data valid / accept - 10 – request failed - 11 – response error - Read the data from the OCP_DATA_RD register - */ - - while (TI_TRUE) - { - switch (pHwInit->uRegStage) - { - case 0: - - pHwInit->uRegStage = 1; - pHwInit->uTxnIndex++; - pHwInit->uRegLoop = 0; - - /* first read the IRQ Polarity register*/ - Address = (TI_UINT32)(FN0_CCCR_REG_32 / 2); - val = (Address & 0x7FF); - val |= BIT_16 | BIT_17; - - /* Write IRQ Polarity address register to OCP_POR_CTR*/ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_POR_CTR, val, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - /* Write read (2)command to the OCP_CMD register. */ - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_CMD, 0x2, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - continue; - - case 1: - - pHwInit->uRegStage ++; - pHwInit->uTxnIndex++; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_DATA_RD, 0, - REGISTER_SIZE, TXN_DIRECTION_READ, (TTxnDoneCb)hwInit_WriteIRQPolarity, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, status) - - - case 2: - /* get the value from IRQ Polarity register*/ - val = pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData; - - pHwInit->uTxnIndex = 0; - - /*Poll bit 18 of OCP_DATA_RD for data valid indication*/ - if (val & BIT_18) - { - if ((val & BIT_16) && (!(val & BIT_17))) - { - pHwInit->uRegStage ++; - pHwInit->uRegLoop = 0; - - } - else - { - TRACE0(pHwInit->hReport, REPORT_SEVERITY_ERROR , "can't writing bt_func7_sel\n"); - TWD_FinalizePolarityRead(pHwInit->hTWD); - - return TI_NOK; - } - } - else - { - if (pHwInit->uRegLoop < READ_TOP_REG_LOOP) - { - pHwInit->uRegStage = 1; - pHwInit->uRegLoop++; - } - else - { - - TRACE0(pHwInit->hReport, REPORT_SEVERITY_ERROR , "Timeout waiting for writing bt_func7_sel\n"); - TWD_FinalizePolarityRead(pHwInit->hTWD); - - return TI_NOK; - - } - } - - continue; - - - case 3: - /* second, write new value of IRQ polarity due to complation flag 1 - active low, 0 - active high*/ - pHwInit->uRegStage ++; - Address = (TI_UINT32)(FN0_CCCR_REG_32 / 2); - value = (Address & 0x7FF); - value |= BIT_16 | BIT_17; - - /* Write IRQ Polarity address register to OCP_POR_CTR*/ - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_POR_CTR, value, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - -#ifdef USE_IRQ_ACTIVE_HIGH - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INFORMATION , "Hwinit IRQ polarity active high\n"); - val |= 0x0<<1; - -#else - TRACE0(pHwInit->hReport, REPORT_SEVERITY_INFORMATION , "Hwinit IRQ polarity active low\n"); - val |= 0x01<<1; -#endif - - /* Write the new IRQ polarity value to the OCP_POR_WDATA register */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_POR_WDATA, val, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - /* Write write (1)command to the OCP_CMD register. */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_CMD, 0x1, - REGISTER_SIZE, TXN_DIRECTION_WRITE, (TTxnDoneCb)hwInit_WriteIRQPolarity, hHwInit) - status = twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - EXCEPT (pHwInit, status) - continue; - - case 4: - - TWD_FinalizePolarityRead(pHwInit->hTWD); - - return TI_OK; - - - } /* End switch */ - - } /* End while */ - - } - - -/**************************************************************************** - * hwInit_InitTopRegisterWrite() - **************************************************************************** - * DESCRIPTION: hwInit_InitTopRegisterWrite - * initalizie hwInit_TopRegisterWrite SM parmaeters - ****************************************************************************/ - -TI_STATUS hwInit_InitTopRegisterWrite(TI_HANDLE hHwInit, TI_UINT32 uAddress, TI_UINT32 uValue) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - - pHwInit->uTopStage = 0; - uAddress = (TI_UINT32)(uAddress / 2); - uAddress = (uAddress & 0x7FF); - uAddress|= BIT_16 | BIT_17; - pHwInit->uTopRegAddr = uAddress; - pHwInit->uTopRegValue = uValue & 0xffff; - return hwInit_TopRegisterWrite (hHwInit); -} - - -/**************************************************************************** - * hwInit_TopRegisterWrite () - **************************************************************************** - * DESCRIPTION: Generic function that writes to the top registers area - * INPUTS: None - * - * OUTPUT: None - * - * RETURNS: TI_OK or TI_NOK - ****************************************************************************/ - TI_STATUS hwInit_TopRegisterWrite(TI_HANDLE hHwInit) - { - /* To write to a top level address from the WLAN IP: - Write the top level address to the OCP_POR_CTR register. - Divide the top address by 2, and add 0x30000 to the result – for example for top address 0xC00, write to the OCP_POR_CTR 0x30600 - Write the data to the OCP_POR_WDATA register - Write 0x1 to the OCP_CMD register. - */ - THwInit *pHwInit = (THwInit *)hHwInit; - TTxnStruct *pTxn; - - while (TI_TRUE) - { - switch (pHwInit->uTopStage) - { - case 0: - pHwInit->uTopStage = 1; - - pHwInit->uTxnIndex++; - /* Write the address to OCP_POR_CTR*/ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_POR_CTR, pHwInit->uTopRegAddr, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - /* Write the new value to the OCP_POR_WDATA register */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_POR_WDATA, pHwInit->uTopRegValue, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - /* Write write (1)command to the OCP_CMD register. */ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_CMD, 0x1, - REGISTER_SIZE, TXN_DIRECTION_WRITE, (TTxnDoneCb)hwInit_TopRegisterWrite, hHwInit) - pHwInit->uTopStatus = twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - - EXCEPT (pHwInit, pHwInit->uTopStatus) - continue; - - case 1: - - pHwInit->uTxnIndex = 0; - - if (pHwInit->uTopStatus == TXN_STATUS_PENDING) - { - hwInit_BootSm (hHwInit); - } - - return TI_OK; - - } /* End switch */ - - } /* End while */ - - } - - - /**************************************************************************** - * hwInit_InitTopRegisterRead() - **************************************************************************** - * DESCRIPTION: hwInit_InitTopRegisterRead - * initalizie hwInit_InitTopRegisterRead SM parmaeters - ****************************************************************************/ - -TI_STATUS hwInit_InitTopRegisterRead(TI_HANDLE hHwInit, TI_UINT32 uAddress) -{ - THwInit *pHwInit = (THwInit *)hHwInit; - - pHwInit->uTopStage = 0; - uAddress = (TI_UINT32)(uAddress / 2); - uAddress = (uAddress & 0x7FF); - uAddress|= BIT_16 | BIT_17; - pHwInit->uTopRegAddr = uAddress; - - return hwInit_TopRegisterRead (hHwInit); -} - - -/**************************************************************************** - * hwInit_TopRegisterRead () - **************************************************************************** - * DESCRIPTION: Generic function that reads the top registers area - * INPUTS: None - * - * OUTPUT: None - * - * RETURNS: TI_OK or TI_NOK - ****************************************************************************/ - TI_STATUS hwInit_TopRegisterRead(TI_HANDLE hHwInit) - { - /* - To read from a top level address: - Write the top level address to the OCP_POR_CTR register. - Divide the top address by 2, and add 0x30000 to the result – for example for top address 0xC00, write to the OCP_POR_CTR 0x30600 - Write 0x2 to the OCP_CMD register. - Poll bit [18] of OCP_DATA_RD for data valid indication - Check bits 17:16 of OCP_DATA_RD: - 00 – no response - 01 – data valid / accept - 10 – request failed - 11 – response error - Read the data from the OCP_DATA_RD register - */ - - THwInit *pHwInit = (THwInit *)hHwInit; - TTxnStruct *pTxn; - - while (TI_TRUE) - { - switch (pHwInit->uTopStage) - { - case 0: - pHwInit->uTopStage = 1; - pHwInit->uTxnIndex++; - pHwInit->uRegLoop = 0; - - /* Write the address to OCP_POR_CTR*/ - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_POR_CTR, pHwInit->uTopRegAddr, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - pHwInit->uTxnIndex++; - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_CMD, 0x2, - REGISTER_SIZE, TXN_DIRECTION_WRITE, NULL, NULL) - twIf_Transact(pHwInit->hTwIf, pTxn); - - continue; - - case 1: - pHwInit->uTopStage ++; - pHwInit->uTxnIndex++; - - BUILD_HW_INIT_TXN_DATA(pHwInit, pTxn, OCP_DATA_RD, 0, - REGISTER_SIZE, TXN_DIRECTION_READ, (TTxnDoneCb)hwInit_TopRegisterRead, hHwInit) - pHwInit->uTopStatus = twIf_Transact(pHwInit->hTwIf, pTxn); - - EXCEPT (pHwInit, pHwInit->uTopStatus) - - case 2: - /* get the value from IRQ Polarity register*/ - pHwInit->uTopRegValue = pHwInit->aHwInitTxn[pHwInit->uTxnIndex].uData; - - pHwInit->uTxnIndex = 0; - - /*Poll bit 18 of OCP_DATA_RD for data valid indication*/ - if (pHwInit->uTopRegValue & BIT_18) - { - if ((pHwInit->uTopRegValue & BIT_16) && (!(pHwInit->uTopRegValue & BIT_17))) - { - pHwInit->uTopRegValue &= 0xffff; - pHwInit->uTxnIndex = 0; - pHwInit->uRegLoop = 0; - if (pHwInit->uTopStatus == TXN_STATUS_PENDING) - { - hwInit_BootSm (hHwInit); - } - return TI_OK; - } - else - { - TRACE0(pHwInit->hReport, REPORT_SEVERITY_ERROR , "can't write bt_func7_sel\n"); - if (pHwInit->uTopStatus == TXN_STATUS_PENDING) - { - hwInit_BootSm (hHwInit); - } - return TI_NOK; - } - } - else - { - if (pHwInit->uRegLoop < READ_TOP_REG_LOOP) - { - pHwInit->uTopStage = 1; - pHwInit->uRegLoop++; - } - else - { - TRACE0(pHwInit->hReport, REPORT_SEVERITY_ERROR , "Timeout waiting for writing bt_func7_sel\n"); - if (pHwInit->uTopStatus == TXN_STATUS_PENDING) - { - hwInit_BootSm (hHwInit); - } - return TI_NOK; - } - } - - continue; - - } /* End switch */ - - } /* End while */ - - } - - -/**************************************************************************** -* hwInit_StallTimerCb () -**************************************************************************** -* DESCRIPTION: CB timer function in fTimerFunction format that calls hwInit_StallTimerCb -* INPUTS: TI_HANDLE hHwInit -* -* OUTPUT: None -* -* RETURNS: None -****************************************************************************/ -#ifdef DOWNLOAD_TIMER_REQUIERD - static void hwInit_StallTimerCb (TI_HANDLE hHwInit, TI_BOOL bTwdInitOccured) -{ - hwInit_FinalizeDownloadSm (hHwInit); -} -#endif |