/drivers/net/wireless/tiwlan1251/pform/linux/src/osapi.c
C | 1763 lines | 795 code | 193 blank | 775 comment | 28 complexity | 78246825439df95065b1570b4d335d77 MD5 | raw file
Possible License(s): AGPL-1.0, GPL-2.0, LGPL-2.0
- /****************************************************************************
- **+-----------------------------------------------------------------------+**
- **| |**
- **| Copyright(c) 1998 - 2008 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. |**
- **| |**
- **+-----------------------------------------------------------------------+**
- ****************************************************************************/
- #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/etherdevice.h>
- #include <linux/vmalloc.h>
- #include <linux/string.h>
- #include <linux/delay.h>
- #include <linux/time.h>
- #include <linux/list.h>
- #include <asm/io.h>
- #include "debug_module.h"
- #include "esta_drv.h"
- #ifdef DRIVER_PROFILING
- #include "tiwlan_profile.h"
- #endif
- #include "osApi.h"
- #include "osTIType.h"
- #include "srcApi.h"
- #include "whalHwRegs.h"
- #include "bmtrace.h"
- #include "TI_IPC_Api.h"
- #include "whalBus_Defs.h"
- #include "802_11Defs.h"
- #include "Ethernet.h"
- #define OS_PROTECT_HANDLE 0xffffeee0
- /*#define DEBUG_REG_ACCESS*/
- #ifdef DEBUG_REG_ACCESS
- #define PRINT_REG(fmt, args...) print_info(fmt, args)
- #else
- #define PRINT_REG(fmt, args...)
- #endif
- #define NOPRINT_REG(fmt, args...)
- #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
- /* Wlan chip reset defines */
- #define GPIO_16 16
- #define GPIO_16_DIRECTION_OUTPUT 0
- #define GPIO_16_CLEAR 0
- #define GPIO_16_SET 1
-
- #define GPIO1_IRQSTATUS1 0xFFFBE418
- #define GPIO1_DATAIN 0xFFFBE42C
- /********************* LOCAL DECLARATIONS ************************/
- static inline void os_timer_dec_use_count(timer_obj_t *tmr);
- static int os_tl_timerHandlr(struct tiwlan_req *req);
- static void os_timerHandlr(unsigned long parm);
- static void send_frag(char* msg, int message_len, int level, int module);
- BOOL use_debug_module = FALSE;
- /****************************************************************************************
- * *
- * OS Report API *
- * *
- ****************************************************************************************/
- /****************************************************************************************
- * os_setDebugMode()
- ****************************************************************************************
- DESCRIPTION: Set the Debug Mode
- INPUT:
- RETURN: None
- NOTES:
- *****************************************************************************************/
- void os_setDebugMode(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 */
- static UINT8 module = 0; /* Used to save the last message module */
- static UINT8 level = 0; /* Used to save the last message level */
- va_list ap;
- static char msg[500];
- char *p_msg = msg; /* Pointer to the message */
- UINT16 message_len;
- UINT32 sec = 0;
- UINT32 uSec = 0;
-
- /* Format the message and keep the message length */
- va_start(ap,format);
- message_len = vsnprintf(&msg[1], sizeof(msg) - 1, format, ap);
-
- if (use_debug_module)
- {
- /*********************/
- /* Use debug module */
- /*******************/
- if (msg[1] == '$')
- {
- /************************************
- Message format: "$XX"
- |||
- message prefix ----|||
- module index -------||
- severity index ------|
- ************************************/
- level = (msg[2] - 'A');
- module = (msg[3] - 'A');
- }
- else
- {
- send_frag(msg, message_len, level, module);
- }
- }
- else
- {
- /***********************/
- /* Use regular printk */
- /*********************/
-
- if( from_new_line )
- {
- if (msg[1] == '$')
- {
- p_msg += 4;
- }
-
- sec = os_timeStampUs(NULL);
- uSec = sec % 1000000;
- sec /= 1000000;
-
- printk(KERN_INFO DRIVER_NAME ": %d.%06d: %s",sec,uSec,p_msg);
- }
- else
- {
- printk(&msg[1]);
- }
-
- from_new_line = ( msg[message_len] == '\n' );
- }
- }
- static void send_frag(char* msg, int message_len, int level, int module)
- {
- #ifdef TIWLAN_OMAP1610 /* Dm: */
- int return_value;
- int offset = 1;
- int TmpLen;
- char* FragMsg;
-
- do
- {
- TmpLen = min(message_len - offset, FRAG_SIZE);
- FragMsg = msg + offset - 1;
- FragMsg[0] = module;
-
- return_value = debug_module_enqueue_message(DEBUG_MODULE_TRACE_QUEUE_ID, level, FragMsg, TmpLen+1, CONTROL_CODE_TYPE_MESSAGE);
- if (return_value)
- {
- /* Message overrun */
- /* Send the overrun indication to the debug module */
- os_memoryCopy(NULL, &msg[1], "*** Message Overrun ***", strlen("*** Message Overrun ***"));
- msg[0] = 0;
- debug_module_enqueue_message(DEBUG_MODULE_TRACE_QUEUE_ID, 0, msg, (strlen("*** Message Overrun ***") + 1), CONTROL_CODE_TYPE_MESSAGE);
- /* Print overrun indication to the terminal */
- /*printk(KERN_INFO DRIVER_NAME ": %d.%06d: %s\n", sec, uSec, "**** Debug module message overrun! ****\n");*/
- }
- offset += TmpLen;
- }while (offset < message_len);
-
- #endif
- }
- /****************************************************************************************
- * *
- * OS DMA CALLBACK API *
- ****************************************************************************************/
-
- /****************************************************************************************
- * os_TNETWIF_BusTxn_Complete()
- ****************************************************************************************
- DESCRIPTION: Callback directly called at an IRQ context from the SPI modue
- This should triger a tasklet_schedule so that the End of DMA will be handled
- in a tasklet context and then be directed to the TNETWIF to call the Client callback.
- INPUT: OsContext - our adapter context.
- RETURN: None
- NOTES:
- *****************************************************************************************/
- void os_TNETWIF_BusTxn_Complete(TI_HANDLE OsContext,int status)
- {
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)OsContext;
- drv->dma_done = 1;
- #ifdef DM_USE_WORKQUEUE
- /* printk("TI: %s:\t%lu\n", __FUNCTION__, jiffies); */
- #ifdef CONFIG_ANDROID_POWER
- android_lock_suspend( &drv->timer_wake_lock );
- #endif
- queue_work( drv->tiwlan_wq, &drv->tw );
- #else
- tasklet_schedule(&drv->tl);
- #endif
- }
- /****************************************************************************************
- * *
- * OS TIMER API *
- * *
- ****************************************************************************************/
- /****************************************************************************************
- * os_timerCreate()
- ****************************************************************************************
- DESCRIPTION: This function creates and initializes a timer object associated with a
- caller's pRoutine function.
- ARGUMENTS:
- RETURN: A handle of the created timer.
- TI_HANDLE_INVALID if there is insufficient memory available
- NOTES: Using the Kernel timer feature, problem is that kernel timers are one-shots.
- For timers that are periodic this abstraction layer will have to mediate
- between the callback function and the re-submission of a timer request.
- *****************************************************************************************/
- TI_HANDLE
- os_timerCreate(
- TI_HANDLE OsContext,
- PTIMER_FUNCTION pRoutine,
- TI_HANDLE Context
- )
- {
- timer_obj_t *tmr;
- #ifdef ESTA_TIMER_DEBUG
- esta_timer_log("\n\n%s:%d ::os_timerCreate(%p,%p,%p)",__FUNCTION__, __LINE__,OsContext,pRoutine,Context);
- #endif
- ti_nodprintf(TIWLAN_LOG_INFO, "\n----> os_timerCreate function = 0x%08x , context= 0x%08x",
- (int)pRoutine, (int)Context);
- os_profile (OsContext, 6, 0);
- tmr = os_memoryAlloc (OsContext, sizeof(timer_obj_t));
- if (tmr == NULL)
- return(TI_HANDLE_INVALID);
- memset (tmr,0,sizeof(timer_obj_t));
- init_timer(&tmr->timer);
- INIT_LIST_HEAD(&tmr->req.list);
- tmr->timer.function = os_timerHandlr;
- tmr->timer.data = (int)tmr;
- tmr->req.drv = (tiwlan_net_dev_t *)OsContext;
- tmr->req.u.req.p1 = (UINT32)pRoutine;
- tmr->req.u.req.p2 = (UINT32)Context;
- tmr->req.u.req.f = os_tl_timerHandlr;
- tmr->use_count = 1;
- esta_timer_log("=%p\n\n", tmr);
- return (TI_HANDLE)tmr;
- }
- /****************************************************************************************
- * os_timerDestroy()
- ****************************************************************************************
- DESCRIPTION: This function destroy the timer object.
- ARGUMENTS:
- RETURN:
- NOTES: Returning the Kernel level timer_list memory allocation and the
- abstraction level timer object.
- *****************************************************************************************/
- VOID
- os_timerDestroy(
- TI_HANDLE OsContext,
- TI_HANDLE TimerHandle
- )
- {
- timer_obj_t *tmr = TimerHandle;
- os_profile (OsContext, 6, 0);
- os_timerStop (OsContext, TimerHandle);
- os_timer_dec_use_count (tmr);
- }
- /****************************************************************************************
- * os_timerStart()
- ****************************************************************************************
- DESCRIPTION: This function start the timer object.
- ARGUMENTS:
- RETURN:
- NOTES:
- *****************************************************************************************/
- VOID
- os_timerStart(
- TI_HANDLE OsContext,
- TI_HANDLE TimerHandle,
- UINT32 DelayMs,
- BOOL bPeriodic
- )
- {
- timer_obj_t *tmr= (timer_obj_t *)TimerHandle;
- UINT32 jiffie_cnt = msecs_to_jiffies(DelayMs);
- #ifdef ESTA_TIMER_DEBUG
- esta_timer_log("\n\n%s:%d ::os_timerStart(%p,%p,%u,%d)\n\n",__FUNCTION__, __LINE__,OsContext,TimerHandle,DelayMs,bPeriodic);
- #endif
- tmr->req.u.req.p3 = bPeriodic;
- tmr->req.u.req.p4 = jiffie_cnt;
- tmr->timer.data = (unsigned long)tmr;
- mod_timer(&tmr->timer, jiffies + jiffie_cnt);
- return;
- }
- /****************************************************************************************
- * os_stopTimer()
- ****************************************************************************************
- DESCRIPTION: This function stop the timer object.
- ARGUMENTS:
- RETURN:
- NOTES:
- *****************************************************************************************/
- VOID
- os_timerStop(
- TI_HANDLE OsContext,
- TI_HANDLE TimerHandle
- )
- {
- timer_obj_t *tmr= (timer_obj_t *)TimerHandle;
- del_timer_sync(&tmr->timer);
- tmr->req.u.req.p3 = 0; /* Turn "periodic" off */
- list_del_init(&tmr->req.list);
- return;
- }
- /****************************************************************************************
- * 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)
- *****************************************************************************************/
- VOID
- os_periodicIntrTimerStart(
- TI_HANDLE OsContext
- )
- {
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)OsContext;
- mod_timer (&drv->poll_timer, jiffies + TIWLAN_IRQ_POLL_INTERVAL);
- }
- /****************************************************************************************
- * 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:
- *****************************************************************************************/
- 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:
- *****************************************************************************************/
- 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,
- UINT32 uSec
- )
- {
- /*UINT32 usec_now = os_timeStampUs(OsContext);
- while(os_timeStampUs(OsContext) - usec_now < uSec)
- ;
- */
- udelay(uSec);
- }
- /****************************************************************************************
- * os_WaitComplete()
- ****************************************************************************************
- DESCRIPTION: This function start waiting for the complete
- ARGUMENTS:
- RETURN:
- NOTES: can be called only from process context, and not from tasklet
- *****************************************************************************************/
- VOID
- os_WaitComplete(
- TI_HANDLE OsContext
- )
- {
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)OsContext;
-
- /* ti_dprintf(TIWLAN_LOG_INFO, "os_WaitComplete drv %x drv->comp %x\n",(UINT32)drv,(UINT32)&drv->comp); */
-
- /*
- he tasklet should them send back the user (here)the completion event so the user could
- go through the configuration phase
- */
- wait_for_completion(&drv->comp);
- }
- /****************************************************************************************
- * os_Complete()
- ****************************************************************************************
- DESCRIPTION: This function signals to the waiting process that completion occured
- ARGUMENTS:
- RETURN:
- NOTES:
- *****************************************************************************************/
- VOID
- os_Complete(
- TI_HANDLE OsContext
- )
- {
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)OsContext;
-
- /* ti_dprintf(TIWLAN_LOG_INFO, "os_Complete drv %x drv->comp %x\n",(UINT32)drv, (UINT32)&drv->comp); */
- /*
- Call the completion routine that will unblock the caller that was waiting on that object
- */
- complete(&drv->comp);
- }
- /****************************************************************************************
- * *
- * Hardware access functions API *
- * *
- ****************************************************************************************/
- /****************************************************************************************
- * os_clearWlanReady()
- ****************************************************************************************
- DESCRIPTION: Clear the WLAN Ready Interrupt Line stored in the PIC Controller
- INPUT: None
- RETURN: None
- NOTES:
- *****************************************************************************************/
- __inline__ VOID
- os_clearWlanReady(
- void)
- {
- #ifdef TIWLAN_OMAP1610
- omap_writel(4,GPIO1_IRQSTATUS1);
- #endif
- }
- /****************************************************************************************
- * os_senseIrqLine()
- ****************************************************************************************
- DESCRIPTION: Read the WLAN_IRQ line
- INPUT: void
- RETURN: Read value
- NOTES:
- *****************************************************************************************/
- __inline__ UINT32
- os_senseIrqLine(
- TI_HANDLE OsContext
- )
- {
- #ifdef TIWLAN_OMAP1610
- return (omap_readl(GPIO1_DATAIN) & 0x4);
- #else
- return 0;
- #endif
- }
- /****************************************************************************************
- * os_hwGetRegistersAddr()
- ****************************************************************************************
- DESCRIPTION:
- ARGUMENTS:
- RETURN:
- NOTES:
- *****************************************************************************************/
- PVOID
- os_hwGetRegistersAddr(
- TI_HANDLE OsContext
- )
- {
- return (PVOID)OS_API_REG_ADRR;
- }
- /****************************************************************************************
- * os_hwGetMemoryAddr()
- ****************************************************************************************
- DESCRIPTION:
- ARGUMENTS:
- RETURN:
- NOTES:
- *****************************************************************************************/
- PVOID
- os_hwGetMemoryAddr(
- TI_HANDLE OsContext
- )
- {
- return (PVOID)OS_API_MEM_ADRR;
- }
- /****************************************************************************************
- * os_memoryGetPhysicalLow()
- ****************************************************************************************
- DESCRIPTION: return the lower 32 bits of a 64bit number / address *
- ARGUMENTS:
- RETURN:
- NOTES:
- *****************************************************************************************/
- UINT32 os_memoryGetPhysicalLow (OS_PHYSICAL_ADDRESS pAddr)
- {
- UINT32 res;
- res = pAddr & 0xffffffff;
- ti_dprintf(TIWLAN_LOG_ERROR, "\n 64bit low. Got 0x%x; Returning 0x%x \n", (UINT32)pAddr, res);
- return res;
- }
- /****************************************************************************************
- * os_memoryGetPhysicalHigh()
- ****************************************************************************************
- DESCRIPTION: return the higher order 32 bits of a 64bit number / address *
- ARGUMENTS:
- RETURN:
- NOTES:
- *****************************************************************************************/
- UINT32 os_memoryGetPhysicalHigh (OS_PHYSICAL_ADDRESS pAddr)
- {
- UINT32 res;
- res = pAddr >> 32;
- ti_dprintf(TIWLAN_LOG_ERROR, "\n 64bit high. Got 0x%x; Returning 0x%x \n", (UINT32)pAddr, res);
- return res;
- }
- /****************************************************************************************
- * *
- * Protection services API *
- * *
- ****************************************************************************************
- * OS protection is implemented as dummy functions because *
- * all driver code is executed in context of a single tasklet, *
- * except IOCTL handlers and xmition. *
- * Protection in IOCTL handlers and hard_start_xmit is done by different *
- * means. *
- ****************************************************************************************/
- /****************************************************************************************
- * 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 (TI_HANDLE)OS_PROTECT_HANDLE;
- }
- /****************************************************************************************
- * 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
- )
- {
- return;
- }
- /****************************************************************************************
- * 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
- )
- {
- #if 1 /* uncomment for work in INDIRECT mode (HwACXAccessMethod=0) */
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)OsContext;
- spin_lock_irqsave(&drv->lock, drv->flags);
- #endif
- }
- /****************************************************************************************
- * 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
- )
- {
- #if 1 /* uncomment for work in INDIRECT mode (HwACXAccessMethod=0) */
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)OsContext;
- spin_unlock_irqrestore(&drv->lock, drv->flags);
- #endif
- }
- /*-----------------------------------------------------------------------------
- Routine Name:
- os_resetWakeOnGpio
- Routine Description:
- set the GPIO to low after awaking the TNET from ELP.
- Arguments:
- OsContext - our adapter context.
- Return Value:
- None
- -----------------------------------------------------------------------------*/
- VOID
- os_hardResetTnetw( void )
- {
- /*
- * Define the OMAP GPIO registers, the TNETW reset is currently connected
- * to GPIO 16, this logic assumes that the loading code had muxed the
- * GPIO 16 to the Y1 pinout.
- */
- /* direction out */
- #ifdef TIWLAN_OMAP1610
- omap_set_gpio_direction(GPIO_16, GPIO_16_DIRECTION_OUTPUT);
-
- /* clear reset WLAN chip */
- omap_set_gpio_dataout(GPIO_16, GPIO_16_CLEAR);
- /* wait for 50msec */
- mdelay(50);
- omap_set_gpio_dataout(GPIO_16, GPIO_16_SET);
- /* wait for 50msec */
- mdelay(50);
- #endif /* Dm: */
- #ifdef TIWLAN_MSM7000
- msm_wifi_reset(1); /* Reset active */
- msm_wifi_power(0); /* Power disable */
- msm_wifi_power(1); /* Power enable */
- msm_wifi_reset(0); /* Reset clear */
- #endif
- }
- #ifndef GWSI_DRIVER
- /****************************************************************************************
- START OF TI DRIVER API
- *****************************************************************************************/
- /****************************************************************************************
- * os_setWakeOnGpio()
- ****************************************************************************************
- DESCRIPTION: set the GPIO to high for awaking the TNET from ELP.
- ARGUMENTS: OsContext - our adapter context.
- RETURN: None
- NOTES:
- *****************************************************************************************/
- VOID
- os_setWakeOnGpio(
- TI_HANDLE OsContext
- )
- {
- #ifdef TIWLAN_OMAP1610
- /*
- Clear ELP_REQ by GPIO_CLEAR_DATAOUT
- */
- os_resetWakeOnGpio(OsContext);
- /*
- Rising edge on ELP_REQ by GPIO_SET_DATAOUT
- */
- omap_writel(0x00000200, 0xFFFBBCF0);
- #endif
- }
- /****************************************************************************************
- * os_resetWakeOnGpio()
- ****************************************************************************************
- DESCRIPTION: set the GPIO to low after awaking the TNET from ELP.
- ARGUMENTS: OsContext - our adapter context.
- RETURN: None
- NOTES:
- *****************************************************************************************/
- VOID
- os_resetWakeOnGpio(
- TI_HANDLE OsContext
- )
- {
- /*
- Clear ELP_REQ by GPIO_CLEAR_DATAOUT
- */
- #ifdef TIWLAN_OMAP1610
- omap_writel(0x00000200, 0xFFFBBCB0);
- #endif
- }
- /****************************************************************************************
- * _os_memorySharedFree()
- ****************************************************************************************
- DESCRIPTION:
- ARGUMENTS:
- RETURN:
- NOTES:
- *****************************************************************************************/
- VOID
- _os_memorySharedFree(
- TI_HANDLE OsContext,
- PVOID pVirtual,
- UINT32 Size,
- OS_PHYSICAL_ADDRESS pPhysical
- )
- {
- ti_dprintf(TIWLAN_LOG_ERROR, "\n\n\n %s is not implemented\n\n\n", __FUNCTION__);
- }
- /****************************************************************************************
- * _os_memorySharedAlloc()
- ****************************************************************************************
- DESCRIPTION:
- ARGUMENTS:
- RETURN:
- NOTES:
- *****************************************************************************************/
- PVOID
- _os_memorySharedAlloc(
- TI_HANDLE OsContext,
- UINT32 Size,
- OS_PHYSICAL_ADDRESS *pPhysical
- )
- {
- ti_dprintf(TIWLAN_LOG_ERROR, "\n\n\n %s is not implemented\n\n\n", __FUNCTION__);
- return NULL;
- }
- /****************************************************************************************
- * os_powerStateBusy()
- ****************************************************************************************
- DESCRIPTION: notify to the host that the TI_WLAN application is busy.
- ARGUMENTS: OsContext - our adapter context.
- RETURN:
- NOTES:
- *****************************************************************************************/
- VOID
- os_powerStateBusy(
- TI_HANDLE OsContext
- )
- {
- #if 0
- ti_dprintf(TIWLAN_LOG_INFO,
- "%s(%d) - os_powerStateBusy: TI_WLAN is busy!\n",
- __FILE__,__LINE__);
- #endif
- }
- /****************************************************************************************
- * os_powerStateIdle()
- ****************************************************************************************
- DESCRIPTION: notify to the host that the TI_WLAN application is idle.
- ARGUMENTS: OsContext - our adapter context.
- RETURN:
- NOTES:
- *****************************************************************************************/
- VOID
- os_powerStateIdle(
- TI_HANDLE OsContext
- )
- {
- #if 0
- ti_dprintf(TIWLAN_LOG_INFO,
- "%s(%d) - os_powerStateIdle: TI_WLAN is idle!\n",
- __FILE__,__LINE__);
- #endif
- }
- /****************************************************************************************
- * os_memoryMove()
- ****************************************************************************************
- DESCRIPTION: Move memory block from pSource to pDestination
- ARGUMENTS: OsContext - Our adapter context.
- pDestination - destination
- pSource - source
- Size - Number of characters
- RETURN:
- NOTES:
- *****************************************************************************************/
- VOID
- os_memoryMove(
- TI_HANDLE pOsContext,
- PVOID pDestination,
- PVOID pSource,
- UINT32 Size
- )
- {
- memmove(pDestination, pSource, Size);
- }
- /****************************************************************************************
- * os_memoryMoveToHw()
- ****************************************************************************************
- DESCRIPTION: This function copies data from a system-space buffer to device memory.
- ARGUMENTS: OsContext - Our adapter context.
- pTarget - Specifies the base address within a device memory range where
- the copy should begin.
- pSource - Pointer to a system-space buffer from which this function copies
- data to the destination range.
- Size - Specifies the number of bytes to copy.
- RETURN: None
- NOTES:
- *****************************************************************************************/
- VOID
- os_memoryMoveToHw(
- TI_HANDLE OsContext,
- PVOID pTarget,
- PVOID pSource,
- UINT32 Size
- )
- {
- print_info("\nos_memoryMoveToHw pTarget 0x%08x pSource 0x%08x Size 0x%08x",(int)pTarget, (int)pSource,(int)Size);
- print_info("\n-------------------------> Not Implemented <--------------------------------------------------- ");
- }
- /****************************************************************************************
- * os_memoryMoveFromHw()
- ****************************************************************************************
- DESCRIPTION: This function copies data from a system-space buffer to device memory.
- ARGUMENTS: OsContext - Our adapter context.
- pTarget - Pointer to a system-space buffer into which this function copies
- data from device memory.
- pSource - Specifies the base virtual address within device memory from
- which to copy the data.
- Size - Specifies the number of bytes to copy.
- RETURN: None
- NOTES:
- *****************************************************************************************/
- VOID
- os_memoryMoveFromHw(
- TI_HANDLE OsContext,
- PVOID pTarget,
- PVOID pSource,
- UINT32 Size
- )
- {
- print_info("\nos_memoryMoveFromHw pTarget 0x%08x pSource 0x%08x Size 0x%08x",(int)pTarget, (int)pSource,(int)Size);
- print_info("\n-------------------------> Not Implemented <--------------------------------------------------- ");
- }
- /****************************************************************************************
- * os_hwReadMemRegisterUINT8()
- ****************************************************************************************
- DESCRIPTION: Reads a UINT8 from a memory-mapped device register.
- ARGUMENTS: OsContext - our adapter context.
- Register - Pointer to the memory-mapped register.
- Data - Pointer to the caller-supplied variable in which this function
- returns the UINT8 read from Register.
- RETURN: None
- NOTES:
- *****************************************************************************************/
- VOID
- os_hwReadMemRegisterUINT8(
- TI_HANDLE OsContext,
- PUCHAR Register,
- PUINT8 Data
- )
- {
- *Data = *Register;
- PRINT_REG("R8: %p=0x%x\n", Register, *Data);
- return;
- }
- /****************************************************************************************
- * os_hwWriteMemRegisterUINT16()
- ****************************************************************************************
- DESCRIPTION: Writes a 'unsigned short' to a memory-mapped device register.
- ARGUMENTS: OsContext - our adapter context.
- Register - Pointer to the memory-mapped register.
- Data - Specifies the caller-supplied UINT16 that this function transfers
- to the Register.
- RETURN: None
- NOTES:
- *****************************************************************************************/
- VOID
- os_hwWriteMemRegisterUINT16(
- TI_HANDLE OsContext,
- PUINT16 Register,
- UINT16 Data
- )
- {
- PRINT_REG("W16: %p=0x%x\n", Register, Data);
- *Register = Data;
- return;
- }
- /****************************************************************************************
- * os_hwReadMemRegisterUINT16()
- ****************************************************************************************
- DESCRIPTION: Reads a UINT16 from a memory-mapped device register.
- ARGUMENTS: OsContext - our adapter context.
- Register - Pointer to the memory-mapped register.
- Data - Pointer to the caller-supplied variable in which this function
- returns the UINT16 read from Register.
-
- RETURN: None
- NOTES:
- *****************************************************************************************/
- VOID
- os_hwReadMemRegisterUINT16(
- TI_HANDLE OsContext,
- PUINT16 Register,
- PUINT16 Data
- )
- {
- *Data = *Register;
- PRINT_REG("R16: %p=0x%x\n", Register, *Data);
- return;
- }
- /****************************************************************************************
- * os_hwWriteMemRegisterUINT32()
- ****************************************************************************************
- DESCRIPTION: Writes a 'unsigned long' to a memory-mapped device register.
- ARGUMENTS: OsContext - our adapter context.
- Register - Pointer to the memory-mapped register.
- Data - Specifies the caller-supplied UINT32 that this function transfers
- to the Register.
- RETURN: None
- NOTES:
- *****************************************************************************************/
- VOID
- os_hwWriteMemRegisterUINT32(
- TI_HANDLE OsContext,
- PUINT32 Register,
- UINT32 Data
- )
- {
- PRINT_REG("W32: %p=0x%x\n", Register, Data);
- *Register = Data;
- return;
- }
- /****************************************************************************************
- * os_hwReadMemRegisterUINT32()
- ****************************************************************************************
- DESCRIPTION: Reads a UINT32 from a memory-mapped device register.
- ARGUMENTS: OsContext - our adapter context.
- Register - Pointer to the memory-mapped register.
- Data - Pointer to the caller-supplied variable in which this function
- returns the UINT32 read from Register.
- RETURN: None
- NOTES:
- *****************************************************************************************/
- VOID
- os_hwReadMemRegisterUINT32(
- TI_HANDLE OsContext,
- PUINT32 Register,
- PUINT32 Data
- )
- {
- *Data = *Register;
- PRINT_REG("R32: %p=0x%x\n", Register, *Data);
- return;
- }
- /****************************************************************************************
- * os_receivePacket()
- ****************************************************************************************
- DESCRIPTION:
- ARGUMENTS:
- RETURN:
- NOTES:
- *****************************************************************************************/
- BOOL
- os_receivePacket(
- TI_HANDLE OsContext,
- PVOID pPacket,
- UINT16 Length
- )
- {
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)OsContext;
- struct sk_buff *skb;
- mem_MSDU_T* pMsdu = (mem_MSDU_T*)pPacket;
- mem_BD_T *pCurBd;
- ti_nodprintf(TIWLAN_LOG_INFO, "os_receivePacket - Received EAPOL len-%d\n", pMsdu->firstBDPtr->length );
- bm_trace(10, Length, 0);
- if (pMsdu->firstBDPtr->length > Length) { /* Dm: Security fix */
- ti_dprintf(TIWLAN_LOG_ERROR, " TI: %s - Security Error\n", __FUNCTION__);
- return FALSE;
- }
- skb = dev_alloc_skb(Length+2);
- if(!skb) {
- print_deb(" os_receivePacket() : dev_alloc_skb failed!\n");
- configMgr_memMngrFreeMSDU(drv->adapter.CoreHalCtx, memMgr_MsduHandle(pPacket));
- drv->stats.rx_dropped++;
- return FALSE;
- }
- skb_reserve(skb, 2);
- pCurBd = pMsdu->firstBDPtr;
- while (pCurBd) {
- memcpy(skb_put(skb,pCurBd->length),pCurBd->data+pCurBd->dataOffset,pCurBd->length);
- pCurBd = pCurBd->nextBDPtr;
- }
- 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;
- bm_trace(11, Length, 0);
- #ifdef CONFIG_ANDROID_POWER
- drv->receive_packet = 1; /* Remember to stay awake */
- #endif
- netif_rx(skb);
- configMgr_memMngrFreeMSDU(drv->adapter.CoreHalCtx, memMgr_MsduHandle(pPacket));
- bm_trace(12, Length, 0);
- return TRUE;
- }
- /****************************************************************************************
- * os_sendPacket()
- ****************************************************************************************
- DESCRIPTION: send EAPOL packet from Supplicant
- ARGUMENTS:
- RETURN:
- NOTES:
- *****************************************************************************************/
- INT32
- os_sendPacket(
- TI_HANDLE OsContext,
- PVOID pPacket,
- UINT16 Length
- )
- {
- struct net_device *dev = (struct net_device *)OsContext;
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)NETDEV_GET_PRIVATE(dev);
- INT32 status;
- mem_MSDU_T* pMsdu;
- char *pMsduData;
- UINT32 packetHeaderLength;
- ti_nodprintf(TIWLAN_LOG_INFO, "os_sendPacket - Transmit EAPOL len-%x\n",Length );
- /*
- * Allocate enough place also for 802.11 header (24 bytes) and LLC (8 bytes)
- * to replace the Ethernet header (14 bytes)
- */
- if(!Length)
- {
- ti_dprintf(TIWLAN_LOG_ERROR, " EAPOL Packet Length = 0 \n");
- return -1;
- }
- /*
- * Retrieve the Packet Header length
- * from QoS Manager (through configMgr) and RSN
- */
- packetHeaderLength = configMgr_getPacketHeaderLength(drv->adapter.CoreHalCtx,pPacket,TX_DATA_EAPOL_MSDU);
- /*
- * need to reserve enough space for header translation
- * in the same first Bd.
- * Allocate enough place also for 802.11 header (24 bytes or 26 for QoS) and LLC (8 bytes)
- * to replace the Ethernet header (14 bytes)
- */
- status = configMgr_allocMSDU(drv->adapter.CoreHalCtx, &pMsdu,
- Length + packetHeaderLength , OS_ABS_TX_MODULE);
- if(status != OK)
- {
- ti_dprintf(TIWLAN_LOG_ERROR, " configMgr_allocMSDU failed !!!\n");
- ++drv->alloc_msdu_failures;
- return -ENOMEM;
- }
- /*
- * case 1: only legacy wlan header
- *
- * case 2: only QoS wlan header
- *
- * case 3: only legacy wlan header with new snap
- *
- * case 4: only QoS wlan header with new snap
- */
- pMsdu->firstBDPtr->dataOffset = packetHeaderLength - ETHERNET_HDR_LEN;
- pMsduData = pMsdu->firstBDPtr->data + pMsdu->firstBDPtr->dataOffset;
- memcpy(pMsduData, pPacket, Length);
- pMsdu->dataLen = Length;
- pMsdu->firstBDPtr->length = pMsdu->dataLen + pMsdu->firstBDPtr->dataOffset;
- pMsdu->freeFunc = 0;
- pMsdu->freeArgs[0] = 0;
- pMsdu->freeArgs[1] = 0;
- /*
- * Propagate Msdu through Config Manager.
- * Set DTag to 0
- * (note that classification is further handled in the Core)
- */
- status = configMgr_sendMsdu(drv->adapter.CoreHalCtx, pMsdu, 0);
- return status;
- }
- #endif /* NDEF GWSI_DRIVER*/
- /*******************************************************************************************************
-
- LOCAL FUNCTIONS
- ********************************************************************************************************/
- /*-----------------------------------------------------------------------------
- Routine Name:
- os_timer_dec_use_count
- Routine Description:
- This function is decrements timer use count.
- When use_count becomes 0, the timer block is destroyed
- -----------------------------------------------------------------------------*/
- static inline void os_timer_dec_use_count(timer_obj_t *tmr)
- {
- if (unlikely(!tmr->use_count)) {
- ti_dprintf(TIWLAN_LOG_ERROR, "\n\n\n %s: attempt to delete a deleted timer %p\n\n\n", __FUNCTION__, tmr);
- tmr->use_count = 1;
- }
- if (!(--tmr->use_count))
- os_memoryFree(tmr->req.drv, tmr, sizeof(timer_obj_t));
- }
- /*-----------------------------------------------------------------------------
- Routine Name:
- os_tl_timerHandlr
- Routine Description:
- This function is called in context of the control tasklet.
- It evokes user timer handler and restarts the timer if periodic
- Arguments:
- p1 - user handler
- p2 - user parameter
- p3 - periodic
- p4 - jiffies
- Return Value:
- None.
- Notes:
- -----------------------------------------------------------------------------*/
- static int os_tl_timerHandlr(struct tiwlan_req *req)
- {
- timer_obj_t *tmr= (timer_obj_t *)req;
- PTIMER_FUNCTION f = (PTIMER_FUNCTION)req->u.req.p1;
- TI_HANDLE parm = (TI_HANDLE)req->u.req.p2;
- esta_timer_log("%s: req=0x%x f=0x%p parm=0x%p\n", __FUNCTION__, req, f, parm);
- ++tmr->use_count;
- f(parm);
- if (req->u.req.p3) /* Periodic ? */
- mod_timer(&tmr->timer, jiffies + req->u.req.p4);
- os_timer_dec_use_count(tmr);
- return 0;
- }
- /*-----------------------------------------------------------------------------
- Routine Name:
- os_timerHandlr
- Routine Description:
- This function is called on timer expiration in context of
- softIsr. It delegates the timer handling to the control tasklet.
- Arguments:
- parm - timer object handle
- Return Value:
- None.
- Notes:
- -----------------------------------------------------------------------------*/
- static void os_timerHandlr(unsigned long parm)
- {
- timer_obj_t *tmr= (timer_obj_t *)parm;
- tiwlan_net_dev_t *drv = tmr->req.drv;
- unsigned long flags;
- esta_timer_log("%s: drv=%p f=0x%x ctx=0x%x\n",
- __FUNCTION__, tmr->req.drv, tmr->req.u.req.p1, tmr->req.u.req.p2);
- spin_lock_irqsave(&drv->lock, flags);
- list_del(&tmr->req.list);
- list_add_tail(&tmr->req.list, &drv->request_q);
- spin_unlock_irqrestore(&drv->lock, flags);
- #ifdef DM_USE_WORKQUEUE
- /* printk("TI: %s:\t%lu\n", __FUNCTION__, jiffies); */
- #ifdef CONFIG_ANDROID_POWER
- android_lock_suspend( &drv->timer_wake_lock );
- #endif
- queue_work( drv->tiwlan_wq, &drv->tw );
- #else
- tasklet_schedule(&drv->tl);
- #endif
- }
- /*-----------------------------------------------------------------------------
- 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
- -----------------------------------------------------------------------------*/
- tiINT32
- os_IndicateEvent(IPC_EV_DATA* pData)
- {
- IPC_EVENT_PARAMS * pInParam = (IPC_EVENT_PARAMS *)pData;
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)(pInParam->hUserParam);
- /*UCHAR AuthBuf[sizeof(ULONG) + 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);
- #if defined(CONFIG_TROUT_PWRSINK) || defined(CONFIG_HTC_PWRSINK)
- queue_delayed_work(drv->tiwlan_wq, &drv->trxw, 0);
- #endif
- }
- break;
- case IPC_EVENT_DISASSOCIATED:
- if (drv->netdev != NULL) {
- #if defined(CONFIG_TROUT_PWRSINK) || defined(CONFIG_HTC_PWRSINK)
- unsigned percent;
- cancel_delayed_work_sync(&drv->trxw);
- percent = ( drv->started ) ? PWRSINK_WIFI_PERCENT_BASE : 0;
- #ifdef CONFIG_HTC_PWRSINK
- htc_pwrsink_set(PWRSINK_WIFI, percent);
- #else
- trout_pwrsink_set(PWRSINK_WIFI, percent);
- #endif
- #endif
- netif_carrier_off(drv->netdev);
- }
- break;
- case IPC_EVENT_LINK_SPEED:
- drv->adapter.LinkSpeed = (*(PULONG)pData->uBuffer * 10000) / 2;
- ti_nodprintf(TIWLAN_LOG_INFO, "\n Link Speed = 0x%08x \n",drv->adapter.LinkSpeed);
- break;
- case IPC_EVENT_AUTH_SUCC:
- /* *(PULONG)AuthBuf = os802_11StatusType_Authentication;
- memcpy((PUCHAR)&AuthBuf[sizeof(ULONG)], pData->uBuffer,sizeof(OS_802_11_AUTHENTICATION_REQUEST));*/
- ti_dprintf(TIWLAN_LOG_OTHER, "\n Auth Succ Event from Driver to another BSSID. \n");
- break;
- case IPC_EVENT_SCAN_COMPLETE:
- ti_dprintf(TIWLAN_LOG_OTHER, "\n Driver Event = Scan Complete. \n");
- break;
- case IPC_EVENT_TIMEOUT:
- ti_dprintf(TIWLAN_LOG_OTHER, "\n Driver Event = Timeout. \n");
- break;
- case IPC_EVENT_CCKM_START:
- ti_dprintf(TIWLAN_LOG_OTHER, "\n Driver Event = IPC_EVENT_CCKM_START \n");
- break;
- default:
- ti_dprintf(TIWLAN_LOG_ERROR, "\n Unrecognized driver event. \n");
- break;
- }
- return OK;
- }
- /****************************************************************************/
- /* The following 4 functions are debug functions that enable the user
- to set/reset GPIO_25 and GPIO_27 in the OMAP - for debug purposes.
- Note: In order to enable GPIO_25/GPIO_27 the user must enable the define
- TIWLAN_OMAP1610_CRTWIPP_GPIO_DEBUG in the esta_drv.c/osapi.c files. */
- void os_ToggleDebugGPIO(int count)
- {
- #if 0
- int i,j;
- omap_writel(0x00000200, 0xFFFBBCB0 );/* 0 */
- for(i=0;i<count;i++)
- {
- omap_writel(0x00000200, 0xFFFBBCF0 );/* 1 */
- for(j=0;j<100;j++);
- omap_writel(0x00000200, 0xFFFBBCB0 );/* 0 */
- for(j=0;j<100;j++);
- }
- #endif
- }
- #ifdef TIWLAN_OMAP1610_CRTWIPP_GPIO_DEBUG
- VOID
- os_SetGpio_25(
- TI_HANDLE OsContext
- )
- {
- /*
- Setting GPIO_25 by GPIO_SET_DATAOUT
- */
- omap_writel(0x00000200, 0xFFFBECF0 );
- }
- VOID
- os_ResetGpio25(
- TI_HANDLE OsContext
- )
- {
- /*
- Clear GPIO_25 by GPIO_CLEAR_DATAOUT
- */
- omap_writel(0x00000200, 0xFFFBECB0 );
- }
- VOID
- os_SetGpio27(
- TI_HANDLE OsContext
- )
- {
- /*
- Setting GPIO_27 by GPIO_SET_DATAOUT
- */
- omap_writel(0x00000800, 0xFFFBECF0 );
- }
- VOID
- os_ResetGpio27(
- TI_HANDLE OsContext
- )
- {
- /*
- Clear GPIO_27 by GPIO_CLEAR_DATAOUT
- */
- omap_writel(0x00000800, 0xFFFBECB0 );
- }
- #endif
- /******************************************************************************/
- VOID
- os_disableIrq( TI_HANDLE OsContext)
- {
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)OsContext;
- disable_irq (drv->irq);
- }
- VOID
- os_enableIrq( TI_HANDLE OsContext)
- {
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)OsContext;
- enable_irq (drv->irq);
- }
- int
- os_getFirmwareImage(
- TI_HANDLE OsContext,
- PUINT8 *pBuffer,
- PUINT32 Length,
- UINT8 RadioType
- )
- {
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)OsContext;
- *pBuffer = drv->firmware_image.va;
- *Length = drv->firmware_image.size;
- return OK;
- }
- /*-----------------------------------------------------------------------------
- Routine Name:
- os_getRadioImage
- Routine Description:
- Arguments:
- Return Value:
- OK
- -----------------------------------------------------------------------------*/
- int
- os_getRadioImage(
- TI_HANDLE OsContext,
- PUINT8 *pBuffer,
- PUINT32 Length,
- UINT8 RadioType
- )
- {
- #ifdef FIRMWARE_DYNAMIC_LOAD
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *)OsContext;
- *pBuffer = drv->eeprom_image.va;
- *Length = drv->eeprom_image.size;
- #else
- extern unsigned char tiwlan_radimage[];
- extern unsigned int sizeof_tiwlan_radimage;
- *pBuffer = (PUINT8)tiwlan_radimage;
- *Length = sizeof_tiwlan_radimage;
- #endif
- ti_dprintf(TIWLAN_LOG_INFO, "%s: radio type: 0x%x\n", __FUNCTION__, RadioType);
- return OK;
- }
- #ifdef DRIVER_PROFILING
- void _os_profile (TI_HANDLE OsContext, UINT32 fn, UINT32 par)
- {
- tiwlan_profile (OsContext, fn, par);
- }
- #endif
- VOID
- os_closeFirmwareImage( TI_HANDLE OsContext )
- {
- return;
- }
- VOID
- os_closeRadioImage( TI_HANDLE OsContext )
- {
- return;
- }