summaryrefslogtreecommitdiff
path: root/wl1271/platforms/os/linux/src/osapi.c
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2010-01-29 14:38:28 -0800
committerDmitry Shmidt <dimitrysh@google.com>2010-01-29 14:38:28 -0800
commitddac9c138c5b4b16b99fb8bc5f0f10418efa1029 (patch)
tree9ad7e34f8dcd9d63ef2faa9e865d6056a061e6c3 /wl1271/platforms/os/linux/src/osapi.c
parenta615fb1650af6e111053506f1b764b28a5b4631d (diff)
downloadwlan-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.c348
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)
{
}
-
-
-
-