diff options
Diffstat (limited to 'wl1271/platforms/os/linux/src/osapi.c')
-rw-r--r-- | wl1271/platforms/os/linux/src/osapi.c | 928 |
1 files changed, 928 insertions, 0 deletions
diff --git a/wl1271/platforms/os/linux/src/osapi.c b/wl1271/platforms/os/linux/src/osapi.c new file mode 100644 index 00000000..3809ec7f --- /dev/null +++ b/wl1271/platforms/os/linux/src/osapi.c @@ -0,0 +1,928 @@ +/* + * osapi.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. + */ + + +/* + * src/osapi.c + * + */ +#include "tidef.h" +#include "arch_ti.h" + +#include <linux/stddef.h> +#include <linux/string.h> +#include <linux/time.h> +#include <linux/timer.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/netdevice.h> +#include <linux/completion.h> +#include <linux/etherdevice.h> +#include <linux/vmalloc.h> +#include <linux/string.h> +#include <linux/delay.h> +#include <linux/time.h> +#include <linux/list.h> +#include <stdarg.h> +#include <asm/io.h> +#include "RxBuf_linux.h" + +/*#include "debug_module.h"*/ +#include "host_platform.h" +#include "WlanDrvIf.h" +#include "bmtrace_api.h" +#include "TI_IPC_Api.h" +#include "802_11Defs.h" +#include "osApi.h" +#include "txMgmtQueue_Api.h" +#include "EvHandler.h" + +#ifdef ESTA_TIMER_DEBUG +#define esta_timer_log(fmt,args...) printk(fmt, ## args) +#else +#define esta_timer_log(fmt,args...) +#endif + +#define FRAG_SIZE 200 + +typedef struct timer_list TOsTimer; + +TI_BOOL bRedirectOutputToLogger = TI_FALSE; +TI_BOOL use_debug_module = TI_FALSE; + +/* linux/irq.h declerations */ +extern void disable_irq(unsigned int); +extern void enable_irq(unsigned int); + + +/**************************************************************************************** + * * + * OS Report API * + * * + ****************************************************************************************/ +static void SendLoggerData (TI_HANDLE OsContext, TI_UINT8 *pMsg, TI_UINT16 len) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + + if (len > 0) + { + EvHandlerSendEvent(drv->tCommon.hEvHandler, IPC_EVENT_LOGGER, pMsg, len); + } +} + +void os_setDebugOutputToLogger(TI_BOOL value) +{ + bRedirectOutputToLogger = value; +} +/**************************************************************************************** + * os_setDebugMode() + **************************************************************************************** +DESCRIPTION: Set the Debug Mode + +INPUT: + +RETURN: None + +NOTES: +*****************************************************************************************/ +void os_setDebugMode(TI_BOOL enable) +{ + use_debug_module = enable; +} + + +/**************************************************************************************** + * os_printf() + **************************************************************************************** +DESCRIPTION: Print formatted output. + +INPUT: format - Specifies the string, to be printed + +RETURN: None + +NOTES: +*****************************************************************************************/ +void os_printf(const char *format ,...) +{ + static int from_new_line = 1; /* Used to save the last message EOL */ + va_list ap; + static char msg[MAX_MESSAGE_SIZE]; + char *p_msg = msg; /* Pointer to the message */ + TI_UINT16 message_len; + TI_UINT32 sec = 0; + TI_UINT32 uSec = 0; + os_memoryZero(NULL,msg, MAX_MESSAGE_SIZE); + + /* Format the message and keep the message length */ + va_start(ap,format); + message_len = vsnprintf(&msg[0], sizeof(msg) -1 , format, ap); + if( from_new_line ) + { + if (msg[1] == '$') + { + p_msg += 4; + } + + sec = os_timeStampUs(NULL); + uSec = sec % MICROSECOND_IN_SECONDS; + sec /= MICROSECOND_IN_SECONDS; + + printk(KERN_INFO DRIVER_NAME ": %d.%06d: %s",sec,uSec,p_msg); + } + else + { + printk(&msg[0]); + } + + from_new_line = ( msg[message_len] == '\n' ); + + va_end(ap); +} + +/**************************************************************************************** + * * + * OS TIMER API * + * * + ****************************************************************************************/ + +/**************************************************************************************** + * os_timerCreate() + **************************************************************************************** +DESCRIPTION: This function creates and initializes an OS timer object associated with a + caller's pRoutine function. + +ARGUMENTS: OsContext - The OS handle + pRoutine - The user callback function + hFuncHandle - The user callback handle + +RETURN: A handle of the created OS timer. + +NOTES: 1) The user's callback is called directly from OS timer context when expired. + 2) In some OSs, it may be needed to use an intermediate callback in the + osapi layer (use os_timerHandlr for that). + +*****************************************************************************************/ +TI_HANDLE os_timerCreate (TI_HANDLE OsContext, fTimerFunction pRoutine, TI_HANDLE hFuncHandle) +{ + TOsTimer *pOsTimer = os_memoryAlloc (OsContext, sizeof(TOsTimer)); + + if(pOsTimer) + { + init_timer (pOsTimer); + pOsTimer->function = (void *)pRoutine; + pOsTimer->data = (int)hFuncHandle; + } + + return (TI_HANDLE)pOsTimer; +} + + +/**************************************************************************************** + * os_timerDestroy() + **************************************************************************************** +DESCRIPTION: This function destroys the OS timer object. + +ARGUMENTS: + +RETURN: + +NOTES: +*****************************************************************************************/ +void os_timerDestroy (TI_HANDLE OsContext, TI_HANDLE TimerHandle) +{ + os_timerStop (OsContext, TimerHandle); + os_memoryFree (OsContext, TimerHandle, sizeof(TOsTimer)); +} + + +/**************************************************************************************** + * os_timerStart() + **************************************************************************************** +DESCRIPTION: This function start the timer object. + +ARGUMENTS: + +RETURN: + +NOTES: +*****************************************************************************************/ +void os_timerStart (TI_HANDLE OsContext, TI_HANDLE TimerHandle, TI_UINT32 DelayMs) +{ + TI_UINT32 jiffie_cnt = msecs_to_jiffies (DelayMs); + + mod_timer ((TOsTimer *)TimerHandle, jiffies + jiffie_cnt); +} + + +/**************************************************************************************** + * os_stopTimer() + **************************************************************************************** +DESCRIPTION: This function stop the timer object. + +ARGUMENTS: + +RETURN: + +NOTES: +*****************************************************************************************/ +void os_timerStop (TI_HANDLE OsContext, TI_HANDLE TimerHandle) +{ + del_timer_sync((TOsTimer *)TimerHandle); +} + + +/**************************************************************************************** + * os_periodicIntrTimerStart() + **************************************************************************************** +DESCRIPTION: This function starts the periodic interrupt mechanism. This mode is used + when interrupts that usually received from the Fw is now masked, and we are + checking for any need of Fw handling in time periods. + +ARGUMENTS: + +RETURN: + +NOTES: Power level of the CHIP should be always awake in this mode (no ELP) +*****************************************************************************************/ +#ifdef PRIODIC_INTERRUPT +void os_periodicIntrTimerStart (TI_HANDLE OsContext) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + + mod_timer (drv->hPollTimer, jiffies + TIWLAN_IRQ_POLL_INTERVAL); +} +#endif + + +/**************************************************************************************** + * os_timeStampMs() + **************************************************************************************** +DESCRIPTION: This function returns the number of milliseconds that have elapsed since + the system was booted. + +ARGUMENTS: OsContext - our adapter context. + +RETURN: + +NOTES: +*****************************************************************************************/ +TI_UINT32 os_timeStampMs (TI_HANDLE OsContext) +{ + struct timeval tv; + do_gettimeofday(&tv); + return tv.tv_sec*1000 + tv.tv_usec/1000; +} + + +/**************************************************************************************** + * os_timeStampUs() + **************************************************************************************** +DESCRIPTION: This function returns the number of microseconds that have elapsed since + the system was booted. + +ARGUMENTS: OsContext - our adapter context. + Note that sometimes this function will be called with NULL(!!!) as argument! + +RETURN: + +NOTES: +*****************************************************************************************/ +TI_UINT32 os_timeStampUs (TI_HANDLE OsContext) +{ + struct timeval tv; + do_gettimeofday(&tv); + return tv.tv_sec*1000000 + tv.tv_usec; +} + + +/**************************************************************************************** + * os_StalluSec() + **************************************************************************************** +DESCRIPTION: This function make delay in microseconds. + +ARGUMENTS: OsContext - our adapter context. + uSec - delay time in microseconds + +RETURN: + +NOTES: +*****************************************************************************************/ +void os_StalluSec (TI_HANDLE OsContext, TI_UINT32 uSec) +{ + udelay (uSec); +} + + +/**************************************************************************************** + * * + * Protection services API * + * * + **************************************************************************************** + * OS protection is implemented as spin_lock_irqsave and spin_unlock_irqrestore * + ****************************************************************************************/ + + +/**************************************************************************************** + * os_protectCreate() + **************************************************************************************** +DESCRIPTION: + +ARGUMENTS: OsContext - our adapter context. + +RETURN: A handle of the created mutex/spinlock. + TI_HANDLE_INVALID if there is insufficient memory available or problems + initializing the mutex + +NOTES: +*****************************************************************************************/ +TI_HANDLE os_protectCreate (TI_HANDLE OsContext) +{ + return NULL; +} + + +/**************************************************************************************** + * os_protectDestroy() + **************************************************************************************** +DESCRIPTION: + +ARGUMENTS: OsContext - our adapter context. + +RETURN: None - This had better work since there is not a return value to the user + +NOTES: +*****************************************************************************************/ +void os_protectDestroy (TI_HANDLE OsContext, TI_HANDLE ProtectCtx) +{ +} + + +/**************************************************************************************** + * os_protectLock() + **************************************************************************************** +DESCRIPTION: + +ARGUMENTS: OsContext - our adapter context. + +RETURN: None - This had better work since there is not a return value to the user + +NOTES: +*****************************************************************************************/ +void os_protectLock (TI_HANDLE OsContext, TI_HANDLE ProtectContext) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + + spin_lock_irqsave (&drv->lock, drv->flags); +} + + +/**************************************************************************************** + * os_protectUnlock() + **************************************************************************************** +DESCRIPTION: + +ARGUMENTS: OsContext - our adapter context. + +RETURN: None - This had better work since there is not a return value to the user + +NOTES: +*****************************************************************************************/ +void os_protectUnlock (TI_HANDLE OsContext, TI_HANDLE ProtectContext) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + + spin_unlock_irqrestore (&drv->lock, drv->flags); +} +/**************************************************************************************** + * os_receivePacket() + **************************************************************************************** +DESCRIPTION: + +ARGUMENTS: + +RETURN: + +NOTES: +*****************************************************************************************/ + +TI_BOOL os_receivePacket(TI_HANDLE OsContext, void *pRxDesc ,void *pPacket, TI_UINT16 Length) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + unsigned char *pdata = (unsigned char *)((TI_UINT32)pPacket & ~(TI_UINT32)0x3); + rx_head_t *rx_head = (rx_head_t *)(pdata - WSPI_PAD_BYTES - RX_HEAD_LEN_ALIGNED); + struct sk_buff *skb = rx_head->skb; + +#ifdef TI_DBG + if ((TI_UINT32)pPacket & 0x3) + { + if ((TI_UINT32)pPacket - (TI_UINT32)skb->data != 2) + { + printk("os_receivePacket() address error skb=0x%x skb->data=0x%x pPacket=0x%x !!!\n",(int)skb, (int)skb->data, (int)pPacket); + } + } + else + { + if ((TI_UINT32)skb->data != (TI_UINT32)pPacket) + { + printk("os_receivePacket() address error skb=0x%x skb->data=0x%x pPacket=0x%x !!!\n",(int)skb, (int)skb->data, (int)pPacket); + } + } + if (Length != RX_ETH_PKT_LEN(pPacket)) + { + printk("os_receivePacket() Length=%d != RX_ETH_PKT_LEN(pPacket)=%d!!!\n",(int)Length, RX_ETH_PKT_LEN(pPacket)); + } + +#endif +/* + printk("-->> os_receivePacket() pPacket=0x%x Length=%d skb=0x%x skb->data=0x%x skb->head=0x%x skb->len=%d\n", + (int)pPacket, (int)Length, (int)skb, (int)skb->data, (int)skb->head, (int)skb->len); +*/ + skb->data = RX_ETH_PKT_DATA(pPacket); + skb_put(skb, RX_ETH_PKT_LEN(pPacket)); +/* + printk("-->> os_receivePacket() skb=0x%x skb->data=0x%x skb->head=0x%x skb->len=%d\n", + (int)skb, (int)skb->data, (int)skb->head, (int)skb->len); +*/ + ti_nodprintf(TIWLAN_LOG_INFO, "os_receivePacket - Received EAPOL len-%d\n", WBUF_LEN(pWbuf)); + + skb->dev = drv->netdev; + skb->protocol = eth_type_trans(skb, drv->netdev); + skb->ip_summed = CHECKSUM_NONE; + + drv->stats.rx_packets++; + drv->stats.rx_bytes += skb->len; + + /* Send the skb to the TCP stack. + * it responsibly of the Linux kernel to free the skb + */ + { + CL_TRACE_START_L1(); + + os_wake_lock_timeout_enable(drv); + + netif_rx_ni(skb); + + /* Note: Don't change this trace (needed to exclude OS processing from Rx CPU utilization) */ + CL_TRACE_END_L1("tiwlan_drv.ko", "OS", "RX", ""); + } + + return TI_TRUE; +} + +/*----------------------------------------------------------------------------- + +Routine Name: os_timerHandlr + +Routine Description: + + Just a place holder for timer expiration handling in other OSs. + In Linux, user callback is called directly on OS timer expiry. + +Arguments: parm - timer object handle + +Return Value: None. + +Notes: + +-----------------------------------------------------------------------------*/ +void os_timerHandlr(unsigned long parm) +{ + /* Not needed in Linux (user callback is called directly on OS timer expiry). */ +} + + +/*----------------------------------------------------------------------------- +Routine Name: os_connectionStatus + +Routine Description: + +The eSTA-DK will call this API so the OS stack is aware that the +WLAN layer is ready to function. + +Arguments: +cStatus = 1; WLAN in ready for network packets +cStatus = 0; WLAN in not ready for network packets + +Return Value: None +-----------------------------------------------------------------------------*/ +TI_INT32 os_IndicateEvent (TI_HANDLE OsContext, IPC_EV_DATA* pData) +{ + IPC_EVENT_PARAMS *pInParam = &pData->EvParams; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + /*TI_UINT8 AuthBuf[sizeof(TI_UINT32) + sizeof(OS_802_11_AUTHENTICATION_REQUEST)];*/ + + ti_nodprintf(TIWLAN_LOG_INFO, "\n os_ConnectionStatus Event 0x%08x \n", CsStatus->Event); + + switch(pInParam->uEventType) + { + case IPC_EVENT_ASSOCIATED: + if (drv->netdev != NULL) + netif_carrier_on(drv->netdev); + break; + + case IPC_EVENT_DISASSOCIATED: + if (drv->netdev != NULL) + netif_carrier_off(drv->netdev); + break; + + case IPC_EVENT_LINK_SPEED: + drv->tCommon.uLinkSpeed = (*(TI_UINT32*)pData->uBuffer * 10000) / 2; + ti_nodprintf(TIWLAN_LOG_INFO, "\n Link Speed = 0x%08x \n",drv->tCommon.uLinkSpeed); + break; + } + + return TI_OK; +} + + + +/******************************************************************************/ + +void os_disableIrq (TI_HANDLE OsContext) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + disable_irq (drv->irq); +} + +void os_enableIrq (TI_HANDLE OsContext) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + enable_irq (drv->irq); +} + +/*----------------------------------------------------------------------------- +Routine Name: os_InterruptServiced + +Routine Description: Called when IRQ line is not asserted any more + (i.e. we can enable IRQ in Level sensitive platform) + +Arguments: OsContext - handle to OS context + +Return Value: none +-----------------------------------------------------------------------------*/ +void os_InterruptServiced (TI_HANDLE OsContext) +{ + /* To be implemented with Level IRQ */ +} + +/*--------------------*/ +/* WAKE LOCK ROUTINES */ +/*--------------------*/ + +/*----------------------------------------------------------------------------- + * Routine Name: os_wake_lock_timeout + * Routine Description: Called to prevent system from suspend for some time + * Arguments: OsContext - handle to OS context + * Return Value: packet counter + * -----------------------------------------------------------------------------*/ +int os_wake_lock_timeout (TI_HANDLE OsContext) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + int ret = 0; + unsigned long flags; + + spin_lock_irqsave(&drv->lock, flags); + if (drv) { + ret = drv->wl_packet; + if (drv->wl_packet) { + drv->wl_packet = 0; +#ifdef CONFIG_HAS_WAKELOCK + wake_lock_timeout(&drv->wl_rxwake, (HZ >> 1)); +#endif + } + } + spin_unlock_irqrestore(&drv->lock, flags); + /* printk("%s: %d\n", __func__, ret); */ + return ret; +} + +/*----------------------------------------------------------------------------- + * Routine Name: os_wake_lock_timeout_enable + * Routine Description: Called to set flag for suspend prevention for some time + * Arguments: OsContext - handle to OS context + * Return Value: packet counter + * -----------------------------------------------------------------------------*/ +int os_wake_lock_timeout_enable (TI_HANDLE OsContext) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + unsigned long flags; + int ret; + + spin_lock_irqsave(&drv->lock, flags); + ret = drv->wl_packet = 1; + spin_unlock_irqrestore(&drv->lock, flags); + return ret; +} + +/*----------------------------------------------------------------------------- + * Routine Name: os_wake_lock + * Routine Description: Called to prevent system from suspend + * Arguments: OsContext - handle to OS context + * Return Value: wake_lock counter + * -----------------------------------------------------------------------------*/ +int os_wake_lock (TI_HANDLE OsContext) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + int ret = 0; + unsigned long flags; + + spin_lock_irqsave(&drv->lock, flags); + if (drv) { +#ifdef CONFIG_HAS_WAKELOCK + if (!drv->wl_count) + wake_lock(&drv->wl_wifi); +#endif + drv->wl_count++; + ret = drv->wl_count; + } + spin_unlock_irqrestore(&drv->lock, flags); + /* printk("%s: %d\n", __func__, ret); */ + return ret; +} + +/*----------------------------------------------------------------------------- + * Routine Name: os_wake_unlock + * Routine Description: Called to allow system to suspend + * Arguments: OsContext - handle to OS context + * Return Value: wake_lock counter + * -----------------------------------------------------------------------------*/ +int os_wake_unlock (TI_HANDLE OsContext) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + int ret = 0; + unsigned long flags; + + spin_lock_irqsave(&drv->lock, flags); + if (drv && drv->wl_count) { + drv->wl_count--; +#ifdef CONFIG_HAS_WAKELOCK + if (!drv->wl_count) + wake_unlock(&drv->wl_wifi); +#endif + ret = drv->wl_count; + } + spin_unlock_irqrestore(&drv->lock, flags); + /* printk("%s: %d\n", __func__, ret); */ + return ret; +} + + +/*----------------------------------------------------------------------------- +Routine Name: os_RequestSchedule + +Routine Description: + +Arguments: + +Return Value: TI_OK +-----------------------------------------------------------------------------*/ +int os_RequestSchedule (TI_HANDLE OsContext) +{ + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + int iRes = TI_OK; + + /* Note: The performance trace below doesn't inclose the schedule itself because the rescheduling + * can occur immediately and call os_RequestSchedule again which will confuse the trace tools + */ + CL_TRACE_START_L3(); + CL_TRACE_END_L3("tiwlan_drv.ko", "OS", "TASK", ""); + + if (!queue_work (drv->pWorkQueue, &drv->tWork)) + { + iRes = TI_NOK; + } + + return iRes; +} + + +/*----------------------------------------------------------------------------- +Routine Name: os_SignalObjectCreate + +Routine Description: + +Arguments: + +Return Value: TI_OK +-----------------------------------------------------------------------------*/ +void *os_SignalObjectCreate (TI_HANDLE OsContext) +{ + struct completion *myPtr; + myPtr = os_memoryAlloc(OsContext, sizeof(struct completion)); + if(myPtr) + init_completion (myPtr); + return (myPtr); +} + + +/*----------------------------------------------------------------------------- +Routine Name: os_SignalObjectWait + +Routine Description: + +Arguments: + +Return Value: TI_OK +-----------------------------------------------------------------------------*/ +int os_SignalObjectWait (TI_HANDLE OsContext, void *signalObject) +{ + wait_for_completion ((struct completion *)signalObject); + return TI_OK; +} + + +/*----------------------------------------------------------------------------- +Routine Name: os_SignalObjectSet + +Routine Description: + +Arguments: + +Return Value: TI_OK +-----------------------------------------------------------------------------*/ +int os_SignalObjectSet (TI_HANDLE OsContext, void *signalObject) +{ + complete ((struct completion *)signalObject); + return TI_OK; +} + + +/*----------------------------------------------------------------------------- +Routine Name: os_SignalObjectFree + +Routine Description: + +Arguments: + +Return Value: TI_OK +-----------------------------------------------------------------------------*/ +int os_SignalObjectFree (TI_HANDLE OsContext, void *signalObject) +{ + os_memoryFree(OsContext, signalObject, sizeof(struct completion)); + return TI_OK; +} + + +/** + * \fn os_Trace + * \brief Prepare and send trace message to the logger. + * + * \param OsContext - The OS handle + * \param uLevel - Severity level of the trace message + * \param uFileId - Source file ID of the trace message + * \param uLineNum - Line number of the trace message + * \param uParamsNum - Number of parameters in the trace message + * \param ... - The trace message parameters + * + * \return void + */ +void os_Trace (TI_HANDLE OsContext, TI_UINT32 uLevel, TI_UINT32 uFileId, TI_UINT32 uLineNum, TI_UINT32 uParamsNum, ...) +{ + TI_UINT32 index; + TI_UINT32 uParam; + TI_UINT32 uMaxParamValue = 0; + TI_UINT32 uMsgLen = TRACE_MSG_MIN_LENGTH; + TI_UINT8 aMsg[TRACE_MSG_MAX_LENGTH] = {0}; + TTraceMsg *pMsgHdr = (TTraceMsg *)&aMsg[0]; + TI_UINT8 *pMsgData = &aMsg[0] + sizeof(TTraceMsg); + va_list list; + + if (!bRedirectOutputToLogger) + { + return; + } + + if (uParamsNum > TRACE_MSG_MAX_PARAMS) + { + uParamsNum = TRACE_MSG_MAX_PARAMS; + } + + /* sync on the parameters */ + va_start(list, uParamsNum); + + /* find the longest parameter */ + for (index = 0; index < uParamsNum; index++) + { + /* get parameter from the stack */ + uParam = va_arg (list, TI_UINT32); + + /* save the longest parameter at variable 'uMaxParamValue' */ + if (uParam > uMaxParamValue) + { + uMaxParamValue = uParam; + } + + /* 32 bit parameter is the longest possible - get out of the loop */ + if (uMaxParamValue > UINT16_MAX_VAL) + { + break; + } + } + + /* Set msg length and format according to the biggest parameter value (8/16/32 bits) */ + if (uMaxParamValue > UINT16_MAX_VAL) + { + pMsgHdr->uFormat = TRACE_FORMAT_32_BITS_PARAMS; + uMsgLen += uParamsNum * sizeof(TI_UINT32); + } + else if (uMaxParamValue > UINT8_MAX_VAL) + { + pMsgHdr->uFormat = TRACE_FORMAT_16_BITS_PARAMS; + uMsgLen += uParamsNum * sizeof(TI_UINT16); + } + else + { + pMsgHdr->uFormat = TRACE_FORMAT_8_BITS_PARAMS; + uMsgLen += uParamsNum; + } + + /* Fill all other header information */ + pMsgHdr->uLevel = (TI_UINT8)uLevel; + pMsgHdr->uParamsNum = (TI_UINT8)uParamsNum; + pMsgHdr->uFileId = (TI_UINT16)uFileId; + pMsgHdr->uLineNum = (TI_UINT16)uLineNum; + + /* re-sync on the parameters */ + va_start(list, uParamsNum); + + /* add the parameters */ + for (index = 0; index < uParamsNum; index++) + { + /* get parameter from the stack */ + uParam = va_arg(list, TI_UINT32); + + /* insert the parameter and increment msg pointer */ + switch(pMsgHdr->uFormat) + { + case TRACE_FORMAT_8_BITS_PARAMS: + INSERT_BYTE(pMsgData, uParam); + break; + + case TRACE_FORMAT_16_BITS_PARAMS: + INSERT_2_BYTES(pMsgData, uParam); + break; + + case TRACE_FORMAT_32_BITS_PARAMS: + INSERT_4_BYTES(pMsgData, uParam); + break; + + default: + va_end(list); + return; + } + } + + va_end(list); + + /* Send the trace message to the logger */ + SendLoggerData(OsContext, aMsg, (TI_UINT16)uMsgLen); +} + +/*--------------------------------------------------------------------------------------*/ + +/** + * \fn os_SetDrvThreadPriority + * \brief Called upon init to set WLAN driver thread priority. + * Currently not supported in Linux. + * + * \param OsContext - The OS handle + * \param uWlanDrvThreadPriority - The WLAN driver thread priority + * \return + */ +void os_SetDrvThreadPriority (TI_HANDLE OsContext, TI_UINT32 uWlanDrvThreadPriority) +{ +} + + + + |