summaryrefslogtreecommitdiff
path: root/wl1271/TWD/TwIf/TwIf.c
diff options
context:
space:
mode:
Diffstat (limited to 'wl1271/TWD/TwIf/TwIf.c')
-rw-r--r--wl1271/TWD/TwIf/TwIf.c1148
1 files changed, 0 insertions, 1148 deletions
diff --git a/wl1271/TWD/TwIf/TwIf.c b/wl1271/TWD/TwIf/TwIf.c
deleted file mode 100644
index 08565de..0000000
--- a/wl1271/TWD/TwIf/TwIf.c
+++ /dev/null
@@ -1,1148 +0,0 @@
-/*
- * TwIf.c
- *
- * Copyright(c) 1998 - 2009 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 TwIf.c
- * \brief The TWD bottom API towards the Txn-Queue.
- *
- * The TwIf module is the lowest WLAN-specific layer and presents a common interface to all Xfer modules.
- * As such, it is responsible for the common functionalities related to device access, which includes:
- * - transactions submission
- * - interface power control
- * - address translation (paging) when needed (depends on bus attributes).
- * The TwIf has no OS, platform or bus type dependencies.
- *
- * \see TwIf.h, TxnQueue.c, TxnQueue.h
- */
-
-#define __FILE_ID__ FILE_ID_121
-#include "tidef.h"
-#include "report.h"
-#include "context.h"
-#include "timer.h"
-#include "TxnDefs.h"
-#include "TxnQueue.h"
-#include "TwIf.h"
-#include "TWDriver.h"
-
-
-/************************************************************************
- * Defines
- ************************************************************************/
-#define TXN_DONE_QUE_SIZE QUE_UNLIMITED_SIZE
-#define PEND_RESTART_TIMEOUT 100 /* timeout in msec for completion of last DMA transaction during restart */
-
-/* Values to write to the ELP register for sleep/awake */
-#define ELP_CTRL_REG_SLEEP 0
-#define ELP_CTRL_REG_AWAKE 1
-
-/*
- * Device interface-control registers addresses (at the end ot the 17-bit address space):
- */
-#define PARTITION_REGISTERS_ADDR (0x1FFC0) /* Four 32 bit register: */
- /* Memory region size (0x1FFC0) */
- /* Memory region base address (0x1FFC4) */
- /* Registers region size (0x1FFC8) */
- /* Registers region base address (0x1FFCC) */
-
-#define ELP_CTRL_REG_ADDR (0x1FFFC) /* ELP control register address */
-
-
-
-/************************************************************************
- * Types
- ************************************************************************/
-
-/* TwIf SM States */
-typedef enum
-{
- SM_STATE_AWAKE, /* HW is awake and Txn-Queue is running */
- SM_STATE_SLEEP, /* HW is asleep and Txn-Queue is stopped */
- SM_STATE_WAIT_HW /* Waiting for HW to wake up (after triggering it), Txn-Queue is stopped */
-} ESmState;
-
-/* TwIf SM Events */
-typedef enum
-{
- SM_EVENT_START, /* Need to wake up the device to handle transactions */
- SM_EVENT_HW_AVAILABLE, /* The device woke up */
- SM_EVENT_SLEEP /* Need to let the device go to sleep */
-} ESmEvent;
-
-/* The addresses partitioning configuration Txn data */
-typedef struct
-{
- TI_UINT32 uMemSize; /* The HW memory region size. */
- TI_UINT32 uMemAddr; /* The HW memory region address. */
- TI_UINT32 uRegSize; /* The HW registers region size. */
- TI_UINT32 uRegAddr; /* The HW registers region address. */
-
-} TPartitionTxnData;
-
-/* The addresses partitioning configuration Txn */
-typedef struct
-{
- TTxnStruct tHdr; /* The generic transaction structure */
- TPartitionTxnData tData; /* The addresses partitioning configuration data */
-
-} TPartitionTxn;
-
-/* The addresses partitioning configuration Txn */
-typedef struct
-{
- TTxnStruct tHdr; /* The generic transaction structure */
- TI_UINT32 tData; /* The addresses partitioning configuration data for one register */
-
-} TPartitionRegTxn;
-
-/* The addresses partitioning configuration Txn */
-typedef struct
-{
- TTxnStruct tHdr; /* The generic transaction structure */
- TI_UINT8 uElpData; /* The value to write to the ELP register */
-
-} TElpTxn;
-
-/* The TwIf module Object */
-typedef struct _TTwIfObj
-{
- /* Other modules handles */
- TI_HANDLE hOs;
- TI_HANDLE hReport;
- TI_HANDLE hContext;
- TI_HANDLE hTimer;
- TI_HANDLE hTxnQ;
-
- ESmState eState; /* SM current state */
- TI_HANDLE hTxnDoneQueue; /* Queue for completed transactions not reported yet to the upper layer */
- TI_UINT32 uContextId; /* The ID allocated to this module on registration to context module */
- TFailureEventCb fErrCb; /* The upper layer CB function for error handling */
- TI_HANDLE hErrCb; /* The CB function handle */
- TRecoveryCb fRecoveryCb; /* The upper layer CB for restart complete */
- TI_HANDLE hRecoveryCb; /* The CB function handle */
- TI_UINT32 uAwakeReqCount; /* Increment on awake requests and decrement on sleep requests */
- TI_UINT32 uPendingTxnCount;/* Count pending transactions (sent to TxnQ and not completed yet) */
- TElpTxn tElpTxnSleep; /* Transaction structure for writing sleep to ELP register */
- TElpTxn tElpTxnAwake; /* Transaction structure for writing awake to ELP register */
-
- /* HW Addresses partitioning */
- TI_UINT32 uMemAddr1; /* The HW memory region start address. */
- TI_UINT32 uMemSize1; /* The HW memory region end address. */
- TI_UINT32 uMemAddr2; /* The HW registers region start address. */
- TI_UINT32 uMemSize2; /* The HW registers region end address. */
- TI_UINT32 uMemAddr3; /* The INT Status registers region start address. */
- TI_UINT32 uMemSize3; /* The INT Status registers region end address. */
- TI_UINT32 uMemAddr4; /* The FW Status mem registers region start address. */
-
-
-#ifdef TI_DBG
- /* Debug counters */
- TI_UINT32 uDbgCountAwake; /* Count calls to twIf_Awake */
- TI_UINT32 uDbgCountSleep; /* Count calls to twIf_Sleep */
- TI_UINT32 uDbgCountTxn; /* Count calls to twIf_SendTransaction (including TwIf internal Txns) */
- TI_UINT32 uDbgCountTxnPending; /* Count transactions that returned PENDING */
- TI_UINT32 uDbgCountTxnComplete;/* Count transactions that returned COMPLETE */
- TI_UINT32 uDbgCountTxnDoneCb; /* Count calls to twIf_TxnDoneCb */
-#endif
-
- TI_BOOL bTxnDoneInRecovery; /* Indicate that current TxnDone is within recovery process */
- TI_BOOL bPendRestartTimerRunning;/* Indicate that the restart guard timer is running */
- TI_HANDLE hPendRestartTimer; /* The restart process guard timer */
-
-} TTwIfObj;
-
-
-/************************************************************************
- * Internal functions prototypes
- ************************************************************************/
-static void twIf_WriteElpReg (TTwIfObj *pTwIf, TI_UINT32 uValue);
-static void twIf_PartitionTxnDoneCb (TI_HANDLE hTwIf, void *hTxn);
-static ETxnStatus twIf_SendTransaction (TTwIfObj *pTwIf, TTxnStruct *pTxn);
-static void twIf_HandleSmEvent (TTwIfObj *pTwIf, ESmEvent eEvent);
-static void twIf_TxnDoneCb (TI_HANDLE hTwIf, TTxnStruct *pTxn);
-static void twIf_HandleTxnDone (TI_HANDLE hTwIf);
-static void twIf_ClearTxnDoneQueue (TI_HANDLE hTwIf);
-static void twIf_PendRestratTimeout (TI_HANDLE hTwIf, TI_BOOL bTwdInitOccured);
-
-
-/************************************************************************
- *
- * Module functions implementation
- *
- ************************************************************************/
-
-/**
- * \fn twIf_Create
- * \brief Create the module
- *
- * Allocate and clear the module's object.
- *
- * \note
- * \param hOs - Handle to Os Abstraction Layer
- * \return Handle of the allocated object, NULL if allocation failed
- * \sa twIf_Destroy
- */
-TI_HANDLE twIf_Create (TI_HANDLE hOs)
-{
- TI_HANDLE hTwIf;
- TTwIfObj *pTwIf;
-
- hTwIf = os_memoryAlloc (hOs, sizeof(TTwIfObj));
- if (hTwIf == NULL)
- return NULL;
-
- pTwIf = (TTwIfObj *)hTwIf;
-
- os_memoryZero (hOs, hTwIf, sizeof(TTwIfObj));
-
- pTwIf->hOs = hOs;
-
- return pTwIf;
-}
-
-
-/**
- * \fn twIf_Destroy
- * \brief Destroy the module.
- *
- * Unregister from TxnQ and free the TxnDone-queue and the module's object.
- *
- * \note
- * \param The module's object
- * \return TI_OK on success or TI_NOK on failure
- * \sa twIf_Create
- */
-TI_STATUS twIf_Destroy (TI_HANDLE hTwIf)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
-
- if (pTwIf)
- {
- txnQ_Close (pTwIf->hTxnQ, TXN_FUNC_ID_WLAN);
- if (pTwIf->hTxnDoneQueue)
- {
- que_Destroy (pTwIf->hTxnDoneQueue);
- }
- if (pTwIf->hPendRestartTimer)
- {
- tmr_DestroyTimer (pTwIf->hPendRestartTimer);
- }
- os_memoryFree (pTwIf->hOs, pTwIf, sizeof(TTwIfObj));
- }
- return TI_OK;
-}
-
-
-/**
- * \fn twIf_Init
- * \brief Init module
- *
- * - Init required handles and module variables
- * - Create the TxnDone-queue
- * - Register to TxnQ
- * - Register to context module
- *
- * \note
- * \param hTwIf - The module's object
- * \param hXxx - Handles to other modules
- * \param fRecoveryCb - Callback function for recovery completed after TxnDone
- * \param hRecoveryCb - Handle for fRecoveryCb
- * \return void
- * \sa
- */
-void twIf_Init (TI_HANDLE hTwIf,
- TI_HANDLE hReport,
- TI_HANDLE hContext,
- TI_HANDLE hTimer,
- TI_HANDLE hTxnQ,
- TRecoveryCb fRecoveryCb,
- TI_HANDLE hRecoveryCb)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
- TI_UINT32 uNodeHeaderOffset;
- TTxnStruct *pTxnHdr; /* The ELP transactions header (as used in the TxnQ API) */
-
- pTwIf->hReport = hReport;
- pTwIf->hContext = hContext;
- pTwIf->hTimer = hTimer;
- pTwIf->hTxnQ = hTxnQ;
- pTwIf->fRecoveryCb = fRecoveryCb;
- pTwIf->hRecoveryCb = hRecoveryCb;
-
- /* Prepare ELP sleep transaction */
- pTwIf->tElpTxnSleep.uElpData = ELP_CTRL_REG_SLEEP;
- pTxnHdr = &(pTwIf->tElpTxnSleep.tHdr);
- TXN_PARAM_SET(pTxnHdr, TXN_LOW_PRIORITY, TXN_FUNC_ID_WLAN, TXN_DIRECTION_WRITE, TXN_INC_ADDR)
- TXN_PARAM_SET_MORE(pTxnHdr, 0); /* Sleep is the last transaction! */
- /* NOTE: Function id for single step will be replaced to 0 by the bus driver */
- TXN_PARAM_SET_SINGLE_STEP(pTxnHdr, 1); /* ELP write is always single step (TxnQ is topped)! */
- BUILD_TTxnStruct(pTxnHdr, ELP_CTRL_REG_ADDR, &(pTwIf->tElpTxnSleep.uElpData), sizeof(TI_UINT8), NULL, NULL)
-
- /* Prepare ELP awake transaction */
- pTwIf->tElpTxnAwake.uElpData = ELP_CTRL_REG_AWAKE;
- pTxnHdr = &(pTwIf->tElpTxnAwake.tHdr);
- TXN_PARAM_SET(pTxnHdr, TXN_LOW_PRIORITY, TXN_FUNC_ID_WLAN, TXN_DIRECTION_WRITE, TXN_INC_ADDR)
- TXN_PARAM_SET_MORE(pTxnHdr, 1);
- /* NOTE: Function id for single step will be replaced to 0 by the bus driver */
- TXN_PARAM_SET_SINGLE_STEP(pTxnHdr, 1); /* ELP write is always single step (TxnQ is topped)! */
- BUILD_TTxnStruct(pTxnHdr, ELP_CTRL_REG_ADDR, &(pTwIf->tElpTxnAwake.uElpData), sizeof(TI_UINT8), NULL, NULL)
-
- /* Create the TxnDone queue. */
- uNodeHeaderOffset = TI_FIELD_OFFSET(TTxnStruct, tTxnQNode);
- pTwIf->hTxnDoneQueue = que_Create (pTwIf->hOs, pTwIf->hReport, TXN_DONE_QUE_SIZE, uNodeHeaderOffset);
- if (pTwIf->hTxnDoneQueue == NULL)
- {
- TRACE0(pTwIf->hReport, REPORT_SEVERITY_ERROR, "twIf_Init: TxnDone queue creation failed!\n");
- }
-
- /* Register to the context engine and get the client ID */
- pTwIf->uContextId = context_RegisterClient (pTwIf->hContext,
- twIf_HandleTxnDone,
- hTwIf,
- TI_TRUE,
- "TWIF",
- sizeof("TWIF"));
-
- /* Allocate timer */
- pTwIf->hPendRestartTimer = tmr_CreateTimer (hTimer);
- if (pTwIf->hPendRestartTimer == NULL)
- {
- TRACE0(pTwIf->hReport, REPORT_SEVERITY_ERROR, "twIf_Init: Failed to create PendRestartTimer!\n");
- return;
- }
- pTwIf->bPendRestartTimerRunning = TI_FALSE;
-
- /* Register to TxnQ */
- txnQ_Open (pTwIf->hTxnQ, TXN_FUNC_ID_WLAN, TXN_NUM_PRIORITYS, (TTxnQueueDoneCb)twIf_TxnDoneCb, hTwIf);
-
- /* Restart TwIf and TxnQ modules */
- twIf_Restart (hTwIf);
-}
-
-
-/**
- * \fn twIf_Restart
- * \brief Restart module upon driver stop or recovery
- *
- * Called upon driver stop command or upon recovery.
- * Calls txnQ_Restart to clear the WLAN queues and call the TxnDone CB on each tansaction.
- * If no transaction in progress, the queues are cleared immediately.
- * If a transaction is in progress, it is done upon TxnDone.
- * The status in transactions that were dropped due to restart is TXN_STATUS_RECOVERY,
- * and its originator (Xfer module) handles it if required (if its CB was written in the Txn).
- *
- * \note
- * \param hTwIf - The module's object
- * \return COMPLETE if the WLAN queues were restarted, PENDING if waiting for TxnDone to restart queues
- * \sa
- */
-ETxnStatus twIf_Restart (TI_HANDLE hTwIf)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
- ETxnStatus eStatus;
-
- pTwIf->eState = SM_STATE_SLEEP;
- pTwIf->uAwakeReqCount = 0;
-
- pTwIf->uPendingTxnCount = 0;
-
- /* Clear done queue */
- twIf_ClearTxnDoneQueue(hTwIf);
-
- /* Restart WLAN queues */
- eStatus = txnQ_Restart (pTwIf->hTxnQ, TXN_FUNC_ID_WLAN);
-
- /* If pending upon ongoing transaction, start guard timer in case SDIO does not call us back */
- if (eStatus == TXN_STATUS_PENDING)
- {
- pTwIf->bPendRestartTimerRunning = TI_TRUE;
- tmr_StartTimer (pTwIf->hPendRestartTimer, twIf_PendRestratTimeout, hTwIf, PEND_RESTART_TIMEOUT, TI_FALSE);
- }
-
- /* Return result (COMPLETE if completed or PENDING if will be completed in TxnDone context) */
- return eStatus;
-}
-
-
-/**
- * \fn twIf_RegisterErrCb
- * \brief Register Error CB
- *
- * Register upper layer (health monitor) CB for bus error
- *
- * \note
- * \param hTwIf - The module's object
- * \param fErrCb - The upper layer CB function for error handling
- * \param hErrCb - The CB function handle
- * \return void
- * \sa
- */
-void twIf_RegisterErrCb (TI_HANDLE hTwIf, void *fErrCb, TI_HANDLE hErrCb)
-{
- TTwIfObj *pTwIf = (TTwIfObj*) hTwIf;
-
- /* Save upper layer (health monitor) CB for bus error */
- pTwIf->fErrCb = (TFailureEventCb)fErrCb;
- pTwIf->hErrCb = hErrCb;
-}
-
-
-/**
- * \fn twIf_WriteElpReg
- * \brief write ELP register
- *
- * \note
- * \param pTwIf - The module's object
- * \param uValue - ELP_CTRL_REG_SLEEP or ELP_CTRL_REG_AWAKE
- * \return void
- * \sa
- */
-static void twIf_WriteElpReg (TTwIfObj *pTwIf, TI_UINT32 uValue)
-{
- TRACE1(pTwIf->hReport, REPORT_SEVERITY_INFORMATION, "twIf_WriteElpReg: ELP Txn data = 0x%x\n", uValue);
- /* Send ELP (awake or sleep) transaction to TxnQ */
- if (uValue == ELP_CTRL_REG_AWAKE)
- {
- txnQ_Transact (pTwIf->hTxnQ, &(pTwIf->tElpTxnAwake.tHdr));
- }
- else
- {
- txnQ_Transact (pTwIf->hTxnQ, &(pTwIf->tElpTxnSleep.tHdr));
- }
-}
-
-
-/**
- * \fn twIf_SetPartition
- * \brief Set HW addresses partition
- *
- * Called by the HwInit module to set the HW address ranges for download or working 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 hTwIf - The module's object
- * \param uMemAddr - The memory partition base address
- * \param uMemSize - The memory partition size
- * \param uRegAddr - The registers partition base address
- * \param uRegSize - The register partition size
- * \return void
- * \sa
- */
-
-void twIf_SetPartition (TI_HANDLE hTwIf,
- TPartition *pPartition)
-{
- TTwIfObj *pTwIf = (TTwIfObj*) hTwIf;
- TPartitionRegTxn *pPartitionRegTxn;/* The partition transaction structure for one register */
- TTxnStruct *pTxnHdr; /* The partition transaction header (as used in the TxnQ API) */
- ETxnStatus eStatus;
- int i;
-
- /* Save partition information for translation and validation. */
- pTwIf->uMemAddr1 = pPartition[0].uMemAdrr;
- pTwIf->uMemSize1 = pPartition[0].uMemSize;
- pTwIf->uMemAddr2 = pPartition[1].uMemAdrr;
- pTwIf->uMemSize2 = pPartition[1].uMemSize;
- pTwIf->uMemAddr3 = pPartition[2].uMemAdrr;
- pTwIf->uMemSize3 = pPartition[2].uMemSize;
- pTwIf->uMemAddr4 = pPartition[3].uMemAdrr;
-
- /* Allocate memory for the current 4 partition transactions */
- pPartitionRegTxn = (TPartitionRegTxn *) os_memoryAlloc (pTwIf->hOs, 7*sizeof(TPartitionRegTxn));
- pTxnHdr = &(pPartitionRegTxn->tHdr);
-
- /* Zero the allocated memory to be certain that unused fields will be initialized */
- os_memoryZero(pTwIf->hOs, pPartitionRegTxn, 7*sizeof(TPartitionRegTxn));
-
- /* Prepare partition transaction data */
- pPartitionRegTxn[0].tData = ENDIAN_HANDLE_LONG(pTwIf->uMemAddr1);
- pPartitionRegTxn[1].tData = ENDIAN_HANDLE_LONG(pTwIf->uMemSize1);
- pPartitionRegTxn[2].tData = ENDIAN_HANDLE_LONG(pTwIf->uMemAddr2);
- pPartitionRegTxn[3].tData = ENDIAN_HANDLE_LONG(pTwIf->uMemSize2);
- pPartitionRegTxn[4].tData = ENDIAN_HANDLE_LONG(pTwIf->uMemAddr3);
- pPartitionRegTxn[5].tData = ENDIAN_HANDLE_LONG(pTwIf->uMemSize3);
- pPartitionRegTxn[6].tData = ENDIAN_HANDLE_LONG(pTwIf->uMemAddr4);
-
-
- /* Prepare partition Txn header */
- for (i=0; i<7; i++)
- {
- pTxnHdr = &(pPartitionRegTxn[i].tHdr);
- TXN_PARAM_SET(pTxnHdr, TXN_LOW_PRIORITY, TXN_FUNC_ID_WLAN, TXN_DIRECTION_WRITE, TXN_INC_ADDR)
- TXN_PARAM_SET_MORE(pTxnHdr, 1);
- TXN_PARAM_SET_SINGLE_STEP(pTxnHdr, 0);
- }
-
-
- /* Memory address */
- pTxnHdr = &(pPartitionRegTxn[0].tHdr);
- BUILD_TTxnStruct(pTxnHdr, PARTITION_REGISTERS_ADDR+4, &(pPartitionRegTxn[0].tData), REGISTER_SIZE, 0, 0)
- twIf_SendTransaction (pTwIf, pTxnHdr);
-
- /* Memory size */
- pTxnHdr = &(pPartitionRegTxn[1].tHdr);
- BUILD_TTxnStruct(pTxnHdr, PARTITION_REGISTERS_ADDR+0, &(pPartitionRegTxn[1].tData), REGISTER_SIZE, 0, 0)
- twIf_SendTransaction (pTwIf, pTxnHdr);
-
- /* Registers address */
- pTxnHdr = &(pPartitionRegTxn[2].tHdr);
- BUILD_TTxnStruct(pTxnHdr, PARTITION_REGISTERS_ADDR+12, &(pPartitionRegTxn[2].tData), REGISTER_SIZE, 0, 0)
- twIf_SendTransaction (pTwIf, pTxnHdr);
-
- /* Registers size */
- pTxnHdr = &(pPartitionRegTxn[3].tHdr);
- BUILD_TTxnStruct(pTxnHdr, PARTITION_REGISTERS_ADDR+8, &(pPartitionRegTxn[3].tData), REGISTER_SIZE, 0, 0)
- eStatus = twIf_SendTransaction (pTwIf, pTxnHdr);
-
- /* Registers address */
- pTxnHdr = &(pPartitionRegTxn[4].tHdr);
- BUILD_TTxnStruct(pTxnHdr, PARTITION_REGISTERS_ADDR+20, &(pPartitionRegTxn[4].tData), REGISTER_SIZE, 0, 0)
- twIf_SendTransaction (pTwIf, pTxnHdr);
-
- /* Registers size */
- pTxnHdr = &(pPartitionRegTxn[5].tHdr);
- BUILD_TTxnStruct(pTxnHdr, PARTITION_REGISTERS_ADDR+16, &(pPartitionRegTxn[5].tData), REGISTER_SIZE, 0, 0)
- eStatus = twIf_SendTransaction (pTwIf, pTxnHdr);
-
- /* Registers address */
- pTxnHdr = &(pPartitionRegTxn[6].tHdr);
- BUILD_TTxnStruct(pTxnHdr, PARTITION_REGISTERS_ADDR+24, &(pPartitionRegTxn[6].tData), REGISTER_SIZE, twIf_PartitionTxnDoneCb, pTwIf)
- twIf_SendTransaction (pTwIf, pTxnHdr);
-
- /* If the transaction is done, free the allocated memory (otherwise freed in the partition CB) */
- if (eStatus != TXN_STATUS_PENDING)
- {
- os_memoryFree (pTwIf->hOs, pPartitionRegTxn,7*sizeof(TPartitionRegTxn));
- }
-}
-
-
-static void twIf_PartitionTxnDoneCb (TI_HANDLE hTwIf, void *hTxn)
-{
- TTwIfObj *pTwIf = (TTwIfObj*) hTwIf;
-
- /* Free the partition transaction buffer after completed (see transaction above) */
- os_memoryFree (pTwIf->hOs,
- (char *)hTxn - (6 * sizeof(TPartitionRegTxn)), /* Move back to the first Txn start */
- 7 * sizeof(TPartitionRegTxn));
-}
-
-
-/**
- * \fn twIf_Awake
- * \brief Request to keep the device awake
- *
- * Used by the Xfer modules to request to keep the device awake until twIf_Sleep() is called.
- * Each call to this function increments AwakeReq counter. Once the device is awake (upon transaction),
- * the TwIf SM keeps it awake as long as this counter is not zero.
- *
- * \note
- * \param hTwIf - The module's object
- * \return void
- * \sa twIf_Sleep
- */
-void twIf_Awake (TI_HANDLE hTwIf)
-{
- TTwIfObj *pTwIf = (TTwIfObj*) hTwIf;
-
- /* Increment awake requests counter */
- pTwIf->uAwakeReqCount++;
-
-#ifdef TI_DBG
- pTwIf->uDbgCountAwake++;
- TRACE1(pTwIf->hReport, REPORT_SEVERITY_INFORMATION, "twIf_Awake: uAwakeReqCount = %d\n", pTwIf->uAwakeReqCount);
-#endif
-}
-
-
-/**
- * \fn twIf_Sleep
- * \brief Remove request to keep the device awake
- *
- * Each call to this function decrements AwakeReq counter.
- * Once this counter is zeroed, if the TxnQ is empty (no WLAN transactions), the TwIf SM is
- * invoked to stop the TxnQ and enable the device to sleep (write 0 to ELP register).
- *
- * \note
- * \param hTwIf - The module's object
- * \return void
- * \sa twIf_Awake
- */
-void twIf_Sleep (TI_HANDLE hTwIf)
-{
- TTwIfObj *pTwIf = (TTwIfObj*) hTwIf;
-
- /* Decrement awake requests counter */
- if (pTwIf->uAwakeReqCount > 0) /* in case of redundant call after recovery */
- {
- pTwIf->uAwakeReqCount--;
- }
-
-#ifdef TI_DBG
- pTwIf->uDbgCountSleep++;
- TRACE1(pTwIf->hReport, REPORT_SEVERITY_INFORMATION, "twIf_Sleep: uAwakeReqCount = %d\n", pTwIf->uAwakeReqCount);
-#endif
-
- /* If Awake not required and no pending transactions in TxnQ, issue Sleep event to SM */
- if ((pTwIf->uAwakeReqCount == 0) && (pTwIf->uPendingTxnCount == 0))
- {
- twIf_HandleSmEvent (pTwIf, SM_EVENT_SLEEP);
- }
-}
-
-
-/**
- * \fn twIf_HwAvailable
- * \brief The device is awake
- *
- * This is an indication from the FwEvent that the device is awake.
- * Issue HW_AVAILABLE event to the SM.
- *
- * \note
- * \param hTwIf - The module's object
- * \return void
- * \sa
- */
-void twIf_HwAvailable (TI_HANDLE hTwIf)
-{
- TTwIfObj *pTwIf = (TTwIfObj*) hTwIf;
-
- TRACE0(pTwIf->hReport, REPORT_SEVERITY_INFORMATION, "twIf_HwAvailable: HW is Available\n");
-
- /* Issue HW_AVAILABLE event to the SM */
- twIf_HandleSmEvent (pTwIf, SM_EVENT_HW_AVAILABLE);
-}
-
-
-/**
- * \fn twIf_Transact
- * \brief Issue a transaction
- *
- * This method is used by the Xfer modules to issue all transaction types.
- * Translate HW address according to bus partition and call twIf_SendTransaction().
- *
- * \note
- * \param hTwIf - The module's object
- * \param pTxn - The transaction object
- * \return COMPLETE if the transaction was completed in this context, PENDING if not, ERROR if failed
- * \sa twIf_SendTransaction
- */
-ETxnStatus twIf_Transact (TI_HANDLE hTwIf, TTxnStruct *pTxn)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
-
- /* Translate HW address for registers region */
- if ((pTxn->uHwAddr >= pTwIf->uMemAddr2) && (pTxn->uHwAddr <= pTwIf->uMemAddr2 + pTwIf->uMemSize2))
- {
- pTxn->uHwAddr = pTxn->uHwAddr - pTwIf->uMemAddr2 + pTwIf->uMemSize1;
- }
- /* Translate HW address for memory region */
- else
- {
- pTxn->uHwAddr = pTxn->uHwAddr - pTwIf->uMemAddr1;
- }
-
- /* Regular transaction are not the last and are not single step (only ELP write is) */
- TXN_PARAM_SET_MORE(pTxn, 1);
- TXN_PARAM_SET_SINGLE_STEP(pTxn, 0);
-
- /* Send the transaction to the TxnQ and update the SM if needed. */
- return twIf_SendTransaction (pTwIf, pTxn);
-}
-
-ETxnStatus twIf_TransactReadFWStatus (TI_HANDLE hTwIf, TTxnStruct *pTxn)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
-
- /* Regular transaction are not the last and are not single step (only ELP write is) */
- TXN_PARAM_SET_MORE(pTxn, 1);
- TXN_PARAM_SET_SINGLE_STEP(pTxn, 0);
-
- /* Send the transaction to the TxnQ and update the SM if needed. */
- return twIf_SendTransaction (pTwIf, pTxn);
-}
-
-
-/**
- * \fn twIf_SendTransaction
- * \brief Send a transaction to the device
- *
- * This method is used by the Xfer modules and the TwIf to send all transaction types to the device.
- * Send the transaction to the TxnQ and update the SM if needed.
- *
- * \note
- * \param pTwIf - The module's object
- * \param pTxn - The transaction object
- * \return COMPLETE if the transaction was completed in this context, PENDING if not, ERROR if failed
- * \sa
- */
-static ETxnStatus twIf_SendTransaction (TTwIfObj *pTwIf, TTxnStruct *pTxn)
-{
- ETxnStatus eStatus;
-#ifdef TI_DBG
- TI_UINT32 data = 0;
-
- /* Verify that the Txn HW-Address is 4-bytes aligned */
- if (pTxn->uHwAddr & 0x3)
- {
- TRACE2(pTwIf->hReport, REPORT_SEVERITY_ERROR, "twIf_SendTransaction: Unaligned HwAddr! HwAddr=0x%x, Params=0x%x\n", pTxn->uHwAddr, pTxn->uTxnParams);
- return TXN_STATUS_ERROR;
- }
-#endif
-
- context_EnterCriticalSection (pTwIf->hContext);
- /* increment pending Txn counter */
- pTwIf->uPendingTxnCount++;
- context_LeaveCriticalSection (pTwIf->hContext);
-
- /* Send transaction to TxnQ */
- eStatus = txnQ_Transact(pTwIf->hTxnQ, pTxn);
-
-#ifdef TI_DBG
- pTwIf->uDbgCountTxn++;
- if (eStatus == TXN_STATUS_COMPLETE) { pTwIf->uDbgCountTxnComplete++; }
- else if (eStatus == TXN_STATUS_PENDING ) { pTwIf->uDbgCountTxnPending++; }
-
- COPY_WLAN_LONG(&data,&(pTxn->aBuf[0]));
- TRACE8(pTwIf->hReport, REPORT_SEVERITY_INFORMATION, "twIf_SendTransaction: Status = %d, Params=0x%x, HwAddr=0x%x, Len0=%d, Len1=%d, Len2=%d, Len3=%d, Data=0x%x \n", eStatus, pTxn->uTxnParams, pTxn->uHwAddr, pTxn->aLen[0], pTxn->aLen[1], pTxn->aLen[2], pTxn->aLen[3],data);
-#endif
-
- /* If Txn status is PENDING issue Start event to the SM */
- if (eStatus == TXN_STATUS_PENDING)
- {
- twIf_HandleSmEvent (pTwIf, SM_EVENT_START);
- }
-
- /* Else (COMPLETE or ERROR) */
- else
- {
- context_EnterCriticalSection (pTwIf->hContext);
- /* decrement pending Txn counter in case of sync transact*/
- pTwIf->uPendingTxnCount--;
- context_LeaveCriticalSection (pTwIf->hContext);
-
- /* If Awake not required and no pending transactions in TxnQ, issue Sleep event to SM */
- if ((pTwIf->uAwakeReqCount == 0) && (pTwIf->uPendingTxnCount == 0))
- {
- twIf_HandleSmEvent (pTwIf, SM_EVENT_SLEEP);
- }
-
- /* If Txn failed and error CB available, call it to initiate recovery */
- if (eStatus == TXN_STATUS_ERROR)
- {
- TRACE6(pTwIf->hReport, REPORT_SEVERITY_ERROR, "twIf_SendTransaction: Txn failed!! Params=0x%x, HwAddr=0x%x, Len0=%d, Len1=%d, Len2=%d, Len3=%d\n", pTxn->uTxnParams, pTxn->uHwAddr, pTxn->aLen[0], pTxn->aLen[1], pTxn->aLen[2], pTxn->aLen[3]);
-
- if (pTwIf->fErrCb)
- {
- pTwIf->fErrCb (pTwIf->hErrCb, BUS_FAILURE);
- }
- }
- }
-
- /* Return the Txn status (COMPLETE if completed in this context, PENDING if not, ERROR if failed) */
- return eStatus;
-}
-
-/**
- * \fn twIf_HandleSmEvent
- * \brief The TwIf SM implementation
- *
- * Handle SM event.
- * Control the device awake/sleep states and the TxnQ run/stop states according to the event.
- *
- * \note
- * \param hTwIf - The module's object
- * \return void
- * \sa
- */
-static void twIf_HandleSmEvent (TTwIfObj *pTwIf, ESmEvent eEvent)
-{
- ESmState eState = pTwIf->eState; /* The state before handling the event */
-
- /* Switch by current state and handle event */
- switch (eState)
- {
- case SM_STATE_AWAKE:
- /* SLEEP event: AWAKE ==> SLEEP, stop TxnQ and set ELP reg to sleep */
- if (eEvent == SM_EVENT_SLEEP)
- {
- pTwIf->eState = SM_STATE_SLEEP;
- txnQ_Stop (pTwIf->hTxnQ, TXN_FUNC_ID_WLAN);
- twIf_WriteElpReg (pTwIf, ELP_CTRL_REG_SLEEP);
- }
- break;
- case SM_STATE_SLEEP:
- /* START event: SLEEP ==> WAIT_HW, set ELP reg to wake-up */
- if (eEvent == SM_EVENT_START)
- {
- pTwIf->eState = SM_STATE_WAIT_HW;
- twIf_WriteElpReg (pTwIf, ELP_CTRL_REG_AWAKE);
- }
- /* HW_AVAILABLE event: SLEEP ==> AWAKE, set ELP reg to wake-up and run TxnQ */
- else if (eEvent == SM_EVENT_HW_AVAILABLE)
- {
- pTwIf->eState = SM_STATE_AWAKE;
- twIf_WriteElpReg (pTwIf, ELP_CTRL_REG_AWAKE);
- txnQ_Run (pTwIf->hTxnQ, TXN_FUNC_ID_WLAN);
- }
- break;
- case SM_STATE_WAIT_HW:
- /* HW_AVAILABLE event: WAIT_HW ==> AWAKE, run TxnQ */
- if (eEvent == SM_EVENT_HW_AVAILABLE)
- {
- pTwIf->eState = SM_STATE_AWAKE;
- txnQ_Run (pTwIf->hTxnQ, TXN_FUNC_ID_WLAN);
- }
- break;
- }
-
- TRACE3(pTwIf->hReport, REPORT_SEVERITY_INFORMATION, "twIf_HandleSmEvent: <currentState = %d, event = %d> --> nextState = %d\n", eState, eEvent, pTwIf->eState);
-}
-
-
-/**
- * \fn twIf_TxnDoneCb
- * \brief Transaction completion CB
- *
- * This callback is called by the TxnQ upon transaction completion, unless is was completed in
- * the original context where it was issued.
- * It may be called from bus driver external context (TxnDone ISR) or from WLAN driver context.
- *
- * \note
- * \param hTwIf - The module's object
- * \param pTxn - The completed transaction object
- * \return void
- * \sa twIf_HandleTxnDone
- */
-static void twIf_TxnDoneCb (TI_HANDLE hTwIf, TTxnStruct *pTxn)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
-
-#ifdef TI_DBG
- pTwIf->uDbgCountTxnDoneCb++;
- TRACE6(pTwIf->hReport, REPORT_SEVERITY_INFORMATION, "twIf_TxnDoneCb: Params=0x%x, HwAddr=0x%x, Len0=%d, Len1=%d, Len2=%d, Len3=%d\n", pTxn->uTxnParams, pTxn->uHwAddr, pTxn->aLen[0], pTxn->aLen[1], pTxn->aLen[2], pTxn->aLen[3]);
-#endif
-
- /* In case of recovery flag, Call directly restart callback */
- if (TXN_PARAM_GET_STATUS(pTxn) == TXN_PARAM_STATUS_RECOVERY)
- {
- if (pTwIf->fRecoveryCb)
- {
- TRACE0(pTwIf->hReport, REPORT_SEVERITY_INFORMATION, "twIf_TxnDoneCb: During Recovery\n");
- pTwIf->bTxnDoneInRecovery = TI_TRUE;
- /* Request schedule to continue handling in driver context (will call twIf_HandleTxnDone()) */
- context_RequestSchedule (pTwIf->hContext, pTwIf->uContextId);
- return;
- }
- }
-
- /* If the completed Txn is ELP, nothing to do (not counted) so exit */
- if (TXN_PARAM_GET_SINGLE_STEP(pTxn))
- {
- return;
- }
-
- if (pTxn->fTxnDoneCb)
- {
- TI_STATUS eStatus;
-
- /* In critical section, enqueue the completed transaction in the TxnDoneQ. */
- context_EnterCriticalSection (pTwIf->hContext);
- eStatus = que_Enqueue (pTwIf->hTxnDoneQueue, (TI_HANDLE)pTxn);
- if (eStatus != TI_OK)
- {
- TRACE3(pTwIf->hReport, REPORT_SEVERITY_ERROR, "twIf_TxnDoneCb(): Enqueue failed, pTxn=0x%x, HwAddr=0x%x, Len0=%d\n", pTxn, pTxn->uHwAddr, pTxn->aLen[0]);
- }
- context_LeaveCriticalSection (pTwIf->hContext);
- }
- else
- {
- context_EnterCriticalSection (pTwIf->hContext);
- /* Decrement pending Txn counter, It's value will be checked in twIf_HandleTxnDone() */
- if (pTwIf->uPendingTxnCount > 0) /* in case of callback on recovery after restart */
- {
- pTwIf->uPendingTxnCount--;
- }
- context_LeaveCriticalSection (pTwIf->hContext);
-
- }
-
- /* Request schedule to continue handling in driver context (will call twIf_HandleTxnDone()) */
- context_RequestSchedule (pTwIf->hContext, pTwIf->uContextId);
-}
-
-/**
- * \fn twIf_HandleTxnDone
- * \brief Completed transactions handler
- *
- * The completed transactions handler, called upon TxnDone event, either from the context engine
- * or directly from twIf_TxnDoneCb() if we are already in the WLAN driver's context.
- * Dequeue all completed transactions in critical section, and call their callbacks if available.
- * If awake is not required and no pending transactions in TxnQ, issue Sleep event to SM.
- *
- * \note
- * \param hTwIf - The module's object
- * \return void
- * \sa
- */
-static void twIf_HandleTxnDone (TI_HANDLE hTwIf)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
- TTxnStruct *pTxn;
-
- /* In case of recovery, call the recovery callback and exit */
- if (pTwIf->bTxnDoneInRecovery)
- {
- TRACE0(pTwIf->hReport, REPORT_SEVERITY_INFORMATION, "twIf_HandleTxnDone: call RecoveryCb\n");
- pTwIf->bTxnDoneInRecovery = TI_FALSE;
- if (pTwIf->bPendRestartTimerRunning)
- {
- tmr_StopTimer (pTwIf->hPendRestartTimer);
- pTwIf->bPendRestartTimerRunning = TI_FALSE;
- }
- pTwIf->fRecoveryCb(pTwIf->hRecoveryCb);
- return;
- }
-
- /* Loop while there are completed transactions to handle */
- while (1)
- {
- /* In critical section, dequeue completed transaction from the TxnDoneQ. */
- context_EnterCriticalSection (pTwIf->hContext);
- pTxn = (TTxnStruct *) que_Dequeue (pTwIf->hTxnDoneQueue);
- context_LeaveCriticalSection (pTwIf->hContext);
-
- /* If no more transactions to handle, exit */
- if (pTxn != NULL)
- {
- context_EnterCriticalSection (pTwIf->hContext);
- /* Decrement pending Txn counter */
- if (pTwIf->uPendingTxnCount > 0) /* in case of callback on recovery after restart */
- {
- pTwIf->uPendingTxnCount--;
- }
- context_LeaveCriticalSection (pTwIf->hContext);
-
- TRACE4(pTwIf->hReport, REPORT_SEVERITY_INFORMATION, "twIf_HandleTxnDone: Completed-Txn: Params=0x%x, HwAddr=0x%x, Len0=%d, fTxnDoneCb=0x%x\n", pTxn->uTxnParams, pTxn->uHwAddr, pTxn->aLen[0], pTxn->fTxnDoneCb);
-
- /* If Txn failed and error CB available, call it to initiate recovery */
- if (TXN_PARAM_GET_STATUS(pTxn) == TXN_PARAM_STATUS_ERROR)
- {
- TRACE6(pTwIf->hReport, REPORT_SEVERITY_ERROR, "twIf_HandleTxnDone: Txn failed!! Params=0x%x, HwAddr=0x%x, Len0=%d, Len1=%d, Len2=%d, Len3=%d\n", pTxn->uTxnParams, pTxn->uHwAddr, pTxn->aLen[0], pTxn->aLen[1], pTxn->aLen[2], pTxn->aLen[3]);
-
- if (pTwIf->fErrCb)
- {
- pTwIf->fErrCb (pTwIf->hErrCb, BUS_FAILURE);
- }
- /* in error do not continue */
- return;
- }
-
- /* If Txn specific CB available, call it (may free Txn resources and issue new Txns) */
- if (pTxn->fTxnDoneCb != NULL)
- {
- ((TTxnDoneCb)(pTxn->fTxnDoneCb)) (pTxn->hCbHandle, pTxn);
- }
- }
-
- /*If uPendingTxnCount == 0 and awake not required, issue Sleep event to SM */
- if ((pTwIf->uAwakeReqCount == 0) && (pTwIf->uPendingTxnCount == 0))
- {
- twIf_HandleSmEvent (pTwIf, SM_EVENT_SLEEP);
- }
-
- if (pTxn == NULL)
- {
- return;
- }
- }
-}
-
-/**
- * \fn twIf_ClearTxnDoneQueue
- * \brief Clean the DoneQueue
- *
- * Clear the specified done queue - don't call the callbacks.
- *
- * \note
- * \param hTwIf - The module's object
- * \return void
- * \sa
- */
-static void twIf_ClearTxnDoneQueue (TI_HANDLE hTwIf)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
- TTxnStruct *pTxn;
-
- /* Loop while there are completed transactions to handle */
- while (1)
- {
- /* In critical section, dequeue completed transaction from the TxnDoneQ. */
- context_EnterCriticalSection (pTwIf->hContext);
- pTxn = (TTxnStruct *) que_Dequeue (pTwIf->hTxnDoneQueue);
- context_LeaveCriticalSection (pTwIf->hContext);
-
- /* If no more transactions to handle, exit */
- if (pTxn != NULL)
- {
- /* Decrement pending Txn counter */
- if (pTwIf->uPendingTxnCount > 0) /* in case of callback on recovery after restart */
- {
- pTwIf->uPendingTxnCount--;
- }
-
- /*
- * Drop on Recovery
- * do not call pTxn->fTxnDoneCb (pTxn->hCbHandle, pTxn) callback
- */
- }
-
- if (pTxn == NULL)
- {
- return;
- }
- }
-}
-
-
-/**
- * \fn twIf_PendRestratTimeout
- * \brief Pending restart process timeout handler
- *
- * Called if timer expires upon fail to complete the last bus transaction that was
- * pending during restart process.
- * Calls the recovery callback to continue the restart process.
- *
- * \note
- * \param hTwIf - The module's object
- * \return void
- * \sa
- */
-static void twIf_PendRestratTimeout (TI_HANDLE hTwIf, TI_BOOL bTwdInitOccured)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
-
- TRACE0(pTwIf->hReport, REPORT_SEVERITY_ERROR, "twIf_PendRestratTimeout: restart timer expired!\n");
-
- pTwIf->bPendRestartTimerRunning = TI_FALSE;
-
- /* Clear the Txn queues since TxnDone wasn't called so it wasn't done by the TxnQ module */
- txnQ_ClearQueues (pTwIf->hTxnQ, TXN_FUNC_ID_WLAN);
-
- /* Call the recovery callback to continue the restart process */
- pTwIf->fRecoveryCb(pTwIf->hRecoveryCb);
-}
-
-
-TI_BOOL twIf_isValidMemoryAddr(TI_HANDLE hTwIf, TI_UINT32 Address, TI_UINT32 Length)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
-
- if ((Address >= pTwIf->uMemAddr1) &&
- (Address + Length < pTwIf->uMemAddr1 + pTwIf->uMemSize1 ))
- return TI_TRUE;
-
- return TI_FALSE;
-}
-
-TI_BOOL twIf_isValidRegAddr(TI_HANDLE hTwIf, TI_UINT32 Address, TI_UINT32 Length)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
-
- if ((Address >= pTwIf->uMemAddr2 ) &&
- ( Address < pTwIf->uMemAddr2 + pTwIf->uMemSize2 ))
- return TI_TRUE;
-
- return TI_FALSE;
-}
-
-/*******************************************************************************
-* DEBUG FUNCTIONS IMPLEMENTATION *
-********************************************************************************/
-
-#ifdef TI_DBG
-
-/**
- * \fn twIf_PrintModuleInfo
- * \brief Print module's parameters (debug)
- *
- * This function prints the module's parameters.
- *
- * \note
- * \param hTwIf - The module's object
- * \return void
- * \sa
- */
-void twIf_PrintModuleInfo (TI_HANDLE hTwIf)
-{
-#ifdef REPORT_LOG
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
-
- WLAN_OS_REPORT(("-------------- TwIf Module Info-- ------------------------\n"));
- WLAN_OS_REPORT(("==========================================================\n"));
- WLAN_OS_REPORT(("eSmState = %d\n", pTwIf->eState ));
- WLAN_OS_REPORT(("uContextId = %d\n", pTwIf->uContextId ));
- WLAN_OS_REPORT(("fErrCb = %d\n", pTwIf->fErrCb ));
- WLAN_OS_REPORT(("hErrCb = %d\n", pTwIf->hErrCb ));
- WLAN_OS_REPORT(("uAwakeReqCount = %d\n", pTwIf->uAwakeReqCount ));
- WLAN_OS_REPORT(("uPendingTxnCount = %d\n", pTwIf->uPendingTxnCount ));
- WLAN_OS_REPORT(("uMemAddr = 0x%x\n", pTwIf->uMemAddr1 ));
- WLAN_OS_REPORT(("uMemSize = 0x%x\n", pTwIf->uMemSize1 ));
- WLAN_OS_REPORT(("uRegAddr = 0x%x\n", pTwIf->uMemAddr2 ));
- WLAN_OS_REPORT(("uRegSize = 0x%x\n", pTwIf->uMemSize2 ));
- WLAN_OS_REPORT(("uDbgCountAwake = %d\n", pTwIf->uDbgCountAwake ));
- WLAN_OS_REPORT(("uDbgCountSleep = %d\n", pTwIf->uDbgCountSleep ));
- WLAN_OS_REPORT(("uDbgCountTxn = %d\n", pTwIf->uDbgCountTxn ));
- WLAN_OS_REPORT(("uDbgCountTxnPending = %d\n", pTwIf->uDbgCountTxnPending ));
- WLAN_OS_REPORT(("uDbgCountTxnComplete = %d\n", pTwIf->uDbgCountTxnComplete ));
- WLAN_OS_REPORT(("uDbgCountTxnDone = %d\n", pTwIf->uDbgCountTxnDoneCb ));
- WLAN_OS_REPORT(("==========================================================\n\n"));
-#endif
-}
-
-
-void twIf_PrintQueues (TI_HANDLE hTwIf)
-{
- TTwIfObj *pTwIf = (TTwIfObj*)hTwIf;
-
- txnQ_PrintQueues(pTwIf->hTxnQ);
-}
-
-#endif /* TI_DBG */