diff options
author | Dmitry Shmidt <dimitrysh@google.com> | 2010-01-29 14:38:28 -0800 |
---|---|---|
committer | Dmitry Shmidt <dimitrysh@google.com> | 2010-01-29 14:38:28 -0800 |
commit | ddac9c138c5b4b16b99fb8bc5f0f10418efa1029 (patch) | |
tree | 9ad7e34f8dcd9d63ef2faa9e865d6056a061e6c3 /wl1271/platforms/os/linux/src/osapi.c | |
parent | a615fb1650af6e111053506f1b764b28a5b4631d (diff) | |
download | wlan-ddac9c138c5b4b16b99fb8bc5f0f10418efa1029.tar.gz |
wl1271: Android/Sholes update
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'wl1271/platforms/os/linux/src/osapi.c')
-rw-r--r-- | wl1271/platforms/os/linux/src/osapi.c | 348 |
1 files changed, 179 insertions, 169 deletions
diff --git a/wl1271/platforms/os/linux/src/osapi.c b/wl1271/platforms/os/linux/src/osapi.c index 3809ec7f..833281af 100644 --- a/wl1271/platforms/os/linux/src/osapi.c +++ b/wl1271/platforms/os/linux/src/osapi.c @@ -80,11 +80,6 @@ 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 * @@ -134,38 +129,37 @@ 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); + 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_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); } @@ -194,7 +188,7 @@ NOTES: 1) The user's callback is called directly from OS timer context *****************************************************************************************/ TI_HANDLE os_timerCreate (TI_HANDLE OsContext, fTimerFunction pRoutine, TI_HANDLE hFuncHandle) { - TOsTimer *pOsTimer = os_memoryAlloc (OsContext, sizeof(TOsTimer)); + TOsTimer *pOsTimer = os_memoryAlloc (OsContext, sizeof(TOsTimer)); if(pOsTimer) { @@ -220,8 +214,8 @@ NOTES: *****************************************************************************************/ void os_timerDestroy (TI_HANDLE OsContext, TI_HANDLE TimerHandle) { - os_timerStop (OsContext, TimerHandle); - os_memoryFree (OsContext, TimerHandle, sizeof(TOsTimer)); + os_timerStop (OsContext, TimerHandle); + os_memoryFree (OsContext, TimerHandle, sizeof(TOsTimer)); } @@ -238,9 +232,9 @@ NOTES: *****************************************************************************************/ void os_timerStart (TI_HANDLE OsContext, TI_HANDLE TimerHandle, TI_UINT32 DelayMs) { - TI_UINT32 jiffie_cnt = msecs_to_jiffies (DelayMs); + TI_UINT32 jiffie_cnt = msecs_to_jiffies (DelayMs); - mod_timer ((TOsTimer *)TimerHandle, jiffies + jiffie_cnt); + mod_timer ((TOsTimer *)TimerHandle, jiffies + jiffie_cnt); } @@ -257,7 +251,7 @@ NOTES: *****************************************************************************************/ void os_timerStop (TI_HANDLE OsContext, TI_HANDLE TimerHandle) { - del_timer_sync((TOsTimer *)TimerHandle); + del_timer_sync((TOsTimer *)TimerHandle); } @@ -298,9 +292,9 @@ NOTES: *****************************************************************************************/ TI_UINT32 os_timeStampMs (TI_HANDLE OsContext) { - struct timeval tv; - do_gettimeofday(&tv); - return tv.tv_sec*1000 + tv.tv_usec/1000; + struct timeval tv; + do_gettimeofday(&tv); + return tv.tv_sec*1000 + tv.tv_usec/1000; } @@ -319,9 +313,9 @@ NOTES: *****************************************************************************************/ TI_UINT32 os_timeStampUs (TI_HANDLE OsContext) { - struct timeval tv; - do_gettimeofday(&tv); - return tv.tv_sec*1000000 + tv.tv_usec; + struct timeval tv; + do_gettimeofday(&tv); + return tv.tv_sec*1000000 + tv.tv_usec; } @@ -339,7 +333,7 @@ NOTES: *****************************************************************************************/ void os_StalluSec (TI_HANDLE OsContext, TI_UINT32 uSec) { - udelay (uSec); + udelay (uSec); } @@ -367,7 +361,7 @@ NOTES: *****************************************************************************************/ TI_HANDLE os_protectCreate (TI_HANDLE OsContext) { - return NULL; + return NULL; } @@ -400,9 +394,9 @@ NOTES: *****************************************************************************************/ void os_protectLock (TI_HANDLE OsContext, TI_HANDLE ProtectContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - spin_lock_irqsave (&drv->lock, drv->flags); + spin_lock_irqsave (&drv->lock, drv->flags); } @@ -434,7 +428,6 @@ RETURN: NOTES: *****************************************************************************************/ - TI_BOOL os_receivePacket(TI_HANDLE OsContext, void *pRxDesc ,void *pPacket, TI_UINT16 Length) { TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; @@ -467,7 +460,9 @@ TI_BOOL os_receivePacket(TI_HANDLE OsContext, void *pRxDesc ,void *pPacket, TI_U 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); */ + /* Use skb_reserve, it updates both skb->data and skb->tail. */ skb->data = RX_ETH_PKT_DATA(pPacket); + skb->tail = skb->data; 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", @@ -570,14 +565,14 @@ TI_INT32 os_IndicateEvent (TI_HANDLE OsContext, IPC_EV_DATA* pData) void os_disableIrq (TI_HANDLE OsContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - disable_irq (drv->irq); + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + disable_irq (drv->irq); } void os_enableIrq (TI_HANDLE OsContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - enable_irq (drv->irq); + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + enable_irq (drv->irq); } /*----------------------------------------------------------------------------- @@ -595,108 +590,119 @@ 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 - * -----------------------------------------------------------------------------*/ +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; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + int ret = 0; + unsigned long flags; + + if (drv) { + spin_lock_irqsave(&drv->lock, flags); + ret = drv->wl_packet; + if (drv->wl_packet) { + drv->wl_packet = 0; #ifdef CONFIG_HAS_WAKELOCK - wake_lock_timeout(&drv->wl_rxwake, (HZ >> 1)); + wake_lock_timeout(&drv->wl_rxwake, (HZ >> 1)); #endif - } - } - spin_unlock_irqrestore(&drv->lock, flags); - /* printk("%s: %d\n", __func__, ret); */ - return ret; + } + 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 - * -----------------------------------------------------------------------------*/ +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; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + unsigned long flags; + int ret = 0; - spin_lock_irqsave(&drv->lock, flags); - ret = drv->wl_packet = 1; - spin_unlock_irqrestore(&drv->lock, flags); - return ret; + if (drv) { + 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 - * -----------------------------------------------------------------------------*/ +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; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + int ret = 0; + unsigned long flags; - spin_lock_irqsave(&drv->lock, flags); - if (drv) { + if (drv) { + spin_lock_irqsave(&drv->lock, flags); #ifdef CONFIG_HAS_WAKELOCK - if (!drv->wl_count) - wake_lock(&drv->wl_wifi); + 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; + 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 - * -----------------------------------------------------------------------------*/ +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; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + int ret = 0; + unsigned long flags; - spin_lock_irqsave(&drv->lock, flags); - if (drv && drv->wl_count) { - drv->wl_count--; + if (drv) { + spin_lock_irqsave(&drv->lock, flags); + if (drv->wl_count) { + drv->wl_count--; #ifdef CONFIG_HAS_WAKELOCK - if (!drv->wl_count) - wake_unlock(&drv->wl_wifi); + 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; + ret = drv->wl_count; + } + spin_unlock_irqrestore(&drv->lock, flags); + } + /* printk("%s: %d\n", __func__, ret); */ + return ret; } - /*----------------------------------------------------------------------------- Routine Name: os_RequestSchedule @@ -708,21 +714,20 @@ Return Value: TI_OK -----------------------------------------------------------------------------*/ int os_RequestSchedule (TI_HANDLE OsContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - int iRes = TI_OK; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - /* 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", ""); + /* 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; - } + if( !queue_work(drv->tiwlan_wq, &drv->tWork) ) { + /* printk("%s: Fail\n",__func__); */ + return TI_NOK; + } - return iRes; + return TI_OK; } @@ -737,11 +742,11 @@ 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); + struct completion *myPtr; + myPtr = os_memoryAlloc(OsContext, sizeof(struct completion)); + if (myPtr) + init_completion (myPtr); + return (myPtr); } @@ -756,8 +761,13 @@ Return Value: TI_OK -----------------------------------------------------------------------------*/ int os_SignalObjectWait (TI_HANDLE OsContext, void *signalObject) { - wait_for_completion ((struct completion *)signalObject); - return TI_OK; + if (!signalObject) + return TI_NOK; + if (!wait_for_completion_timeout((struct completion *)signalObject, + msecs_to_jiffies(10000))) { + printk("tiwlan: 10 sec %s timeout\n", __func__); + } + return TI_OK; } @@ -772,8 +782,10 @@ Return Value: TI_OK -----------------------------------------------------------------------------*/ int os_SignalObjectSet (TI_HANDLE OsContext, void *signalObject) { - complete ((struct completion *)signalObject); - return TI_OK; + if (!signalObject) + return TI_NOK; + complete ((struct completion *)signalObject); + return TI_OK; } @@ -788,8 +800,10 @@ Return Value: TI_OK -----------------------------------------------------------------------------*/ int os_SignalObjectFree (TI_HANDLE OsContext, void *signalObject) { - os_memoryFree(OsContext, signalObject, sizeof(struct completion)); - return TI_OK; + if (!signalObject) + return TI_NOK; + os_memoryFree(OsContext, signalObject, sizeof(struct completion)); + return TI_OK; } @@ -813,21 +827,21 @@ void os_Trace (TI_HANDLE OsContext, TI_UINT32 uLevel, TI_UINT32 uFileId, TI_UINT TI_UINT32 uMaxParamValue = 0; TI_UINT32 uMsgLen = TRACE_MSG_MIN_LENGTH; TI_UINT8 aMsg[TRACE_MSG_MAX_LENGTH] = {0}; - TTraceMsg *pMsgHdr = (TTraceMsg *)&aMsg[0]; + TTraceMsg *pMsgHdr = (TTraceMsg *)&aMsg[0]; TI_UINT8 *pMsgData = &aMsg[0] + sizeof(TTraceMsg); va_list list; - if (!bRedirectOutputToLogger) - { - return; - } + if (!bRedirectOutputToLogger) + { + return; + } if (uParamsNum > TRACE_MSG_MAX_PARAMS) { uParamsNum = TRACE_MSG_MAX_PARAMS; } - /* sync on the parameters */ + /* sync on the parameters */ va_start(list, uParamsNum); /* find the longest parameter */ @@ -849,7 +863,7 @@ void os_Trace (TI_HANDLE OsContext, TI_UINT32 uLevel, TI_UINT32 uFileId, TI_UINT } } - /* Set msg length and format according to the biggest parameter value (8/16/32 bits) */ + /* 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; @@ -866,11 +880,11 @@ void os_Trace (TI_HANDLE OsContext, TI_UINT32 uLevel, TI_UINT32 uFileId, TI_UINT 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; + /* 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); @@ -904,7 +918,7 @@ void os_Trace (TI_HANDLE OsContext, TI_UINT32 uLevel, TI_UINT32 uFileId, TI_UINT va_end(list); - /* Send the trace message to the logger */ + /* Send the trace message to the logger */ SendLoggerData(OsContext, aMsg, (TI_UINT16)uMsgLen); } @@ -922,7 +936,3 @@ void os_Trace (TI_HANDLE OsContext, TI_UINT32 uLevel, TI_UINT32 uFileId, TI_UINT void os_SetDrvThreadPriority (TI_HANDLE OsContext, TI_UINT32 uWlanDrvThreadPriority) { } - - - - |