gki_ulinux.c revision 0a85f658ebd49b72be39fe0fb61fcca4ee0fbc82
14ee2ad04344446e610172a0e73949212923014dfSebastian Redl/******************************************************************************
22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *
32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *  Copyright (C) 1999-2012 Broadcom Corporation
42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *
52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *  Licensed under the Apache License, Version 2.0 (the "License");
62cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *  you may not use this file except in compliance with the License.
72cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *  You may obtain a copy of the License at:
82cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *
92cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *  http://www.apache.org/licenses/LICENSE-2.0
10a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl *
112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *  Unless required by applicable law or agreed to in writing, software
122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *  distributed under the License is distributed on an "AS IS" BASIS,
132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147faa2ec03a7ef120ac165bb45b6c70a8b20c9f1cSebastian Redl *  See the License for the specific language governing permissions and
1589d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor *  limitations under the License.
160eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis *
17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor ******************************************************************************/
18e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include <stdio.h>
192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <stdarg.h>
202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <errno.h>
212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
222a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall#define GKI_DEBUG   FALSE
2389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis
240b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor#include <pthread.h>  /* must be 1st header defined  */
257a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall#include <time.h>
262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <hardware_legacy/power.h>  /* Android header */
27a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#include "gki_int.h"
286ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "gki_target.h"
297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
306a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor/* Temp android logging...move to android tgt config file */
317c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
3283d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff#ifndef LINUX_NATIVE
3314f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include <cutils/log.h>
3410e286aa8d39fb51a21412850265d9dae74613eeChris Lattner#else
353251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor#define LOGV(format, ...)  fprintf (stdout, LOG_TAG format, ## __VA_ARGS__)
3614f79002e58556798e86168c63e48d533287eda5Douglas Gregor#define LOGE(format, ...)  fprintf (stderr, LOG_TAG format, ## __VA_ARGS__)
37bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor#define LOGI(format, ...)  fprintf (stdout, LOG_TAG format, ## __VA_ARGS__)
382bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor
39ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor#define SCHED_NORMAL 0
400a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor#define SCHED_FIFO 1
4117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor#define SCHED_RR 2
4217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor#define SCHED_BATCH 3
432596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar
442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#define pthread_cond_timedwait_monotonic pthread_cond_timedwait
45fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer
4614f79002e58556798e86168c63e48d533287eda5Douglas Gregor#endif
4703013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer
483c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner/* Define the structure that holds the GKI variables
49cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor*/
502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#if GKI_DYNAMIC_MEMORY == FALSE
518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedltGKI_CB   gki_cb;
522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif
53ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl
546e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#define NANOSEC_PER_MILLISEC (1000000)
556e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#define NSEC_PER_SEC (1000*NANOSEC_PER_MILLISEC)
566e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer
576e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer/* works only for 1ms to 1000ms heart beat ranges */
58ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl#define LINUX_SEC (1000/TICKS_PER_SEC)
596e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer// #define GKI_TICK_TIMER_DEBUG
606e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer
616e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#define LOCK(m)  pthread_mutex_lock(&m)
626e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#define UNLOCK(m) pthread_mutex_unlock(&m)
636e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#define INIT(m) pthread_mutex_init(&m, NULL)
64ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl
65ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl
662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/* this kind of mutex go into tGKI_OS control block!!!! */
672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/* static pthread_mutex_t GKI_sched_mutex; */
682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/*static pthread_mutex_t thread_delay_mutex;
6912b1c7615d4f9a2edc544be499f895f16ac100edChris Lattnerstatic pthread_cond_t thread_delay_cond;
702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic pthread_mutex_t gki_timer_update_mutex;
713397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlstatic pthread_cond_t   gki_timer_update_cond;
72a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl*/
7389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#ifdef NO_GKI_RUN_RETURN
742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic pthread_t            timer_thread_id = 0;
752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif
762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/* For Android */
7989eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis
808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#ifndef GKI_SHUTDOWN_EVT
812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#define GKI_SHUTDOWN_EVT    APPL_EVT_7
822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif
832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregortypedef struct
852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    UINT8 task_id;          /* GKI task id */
872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    TASKPTR task_entry;     /* Task entry function*/
882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    UINT32 params;          /* Extra params to pass to task entry function */
892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_cond_t* pCond;	/* for android*/
902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_mutex_t* pMutex;  /* for android*/
912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} gki_pthread_info_t;
923397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlgki_pthread_info_t gki_pthread_info[GKI_MAX_TASKS];
932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic void* GKI_run_worker_thread (void*);
952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
963397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/*******************************************************************************
972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor**
988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl** Function         gki_task_entry
992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor**
1002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor** Description      entry point of GKI created tasks
1013397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl**
1022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor** Returns          void
1038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl**
1042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor*******************************************************************************/
1052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorvoid gki_task_entry(UINT32 params)
1063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    pthread_t thread_id = pthread_self();
1088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    gki_pthread_info_t *p_pthread_info = (gki_pthread_info_t *)params;
1092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    GKI_TRACE_5("gki_task_entry task_id=%i, thread_id=%x/%x, pCond/pMutex=%x/%x", p_pthread_info->task_id,
1102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                gki_cb.os.thread_id[p_pthread_info->task_id], pthread_self(),
1113397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                p_pthread_info->pCond, p_pthread_info->pMutex);
112df1550fc59b51681d37225934fe4e3acac321621Richard Smith
113df1550fc59b51681d37225934fe4e3acac321621Richard Smith    gki_cb.os.thread_id[p_pthread_info->task_id] = thread_id;
1148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    /* Call the actual thread entry point */
1152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    (p_pthread_info->task_entry)(p_pthread_info->params);
1162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1173397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    GKI_TRACE_1("gki_task task_id=%i terminating", p_pthread_info->task_id);
118df1550fc59b51681d37225934fe4e3acac321621Richard Smith    gki_cb.os.thread_id[p_pthread_info->task_id] = 0;
1198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
1202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_exit(0);    /* GKI tasks have no return value */
1212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/* end android */
1231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#ifndef ANDROID
1258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid GKI_TRACE(char *fmt, ...)
1262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
1272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    LOCK(gki_cb.os.GKI_trace_mutex);
1283397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    va_list ap;
1292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    va_start(ap, fmt);
1310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    vfprintf(stderr, fmt, ap);
1322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    fprintf(stderr, "\n");
1332cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1343397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    va_end(ap);
1352cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    UNLOCK(gki_cb.os.GKI_trace_mutex);
1362cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif
1382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1392cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/*******************************************************************************
1403397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl**
1412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor** Function         GKI_init
1428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl**
1432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor** Description      This function is called once at startup to initialize
1442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor**                  all the timer structures.
1453397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl**
1462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor** Returns          void
1477e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor**
1487e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor*******************************************************************************/
149c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
1508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid GKI_init(void)
1512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
1522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_mutexattr_t attr;
1533397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    tGKI_OS             *p_os;
1542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    memset (&gki_cb, 0, sizeof (gki_cb));
156e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson
1578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    gki_buffer_init();
1582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    gki_timers_init();
1592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    gki_cb.com.OSTicks = (UINT32) times(0);
1603397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_mutexattr_init(&attr);
1628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
1632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#ifndef __CYGWIN__
1642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
1653397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#endif
1662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    p_os = &gki_cb.os;
167264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola    pthread_mutex_init(&p_os->GKI_mutex, &attr);
168264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola    /* pthread_mutex_init(&GKI_sched_mutex, NULL); */
169a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman#if (GKI_DEBUG == TRUE)
170425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    pthread_mutex_init(&p_os->GKI_trace_mutex, NULL);
171ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor#endif
172264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola    /* pthread_mutex_init(&thread_delay_mutex, NULL); */  /* used in GKI_delay */
173f85e193739c953358c865005855253af4f68a497John McCall    /* pthread_cond_init (&thread_delay_cond, NULL); */
1742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    /* Initialiase GKI_timer_update suspend variables & mutexes to be in running state.
1763397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl     * this works too even if GKI_NO_TICK_STOP is defined in btld.txt */
1772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    p_os->no_timer_suspend = GKI_TIMER_TICK_RUN_COND;
1788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    pthread_mutex_init(&p_os->gki_timer_mutex, NULL);
1792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_cond_init(&p_os->gki_timer_cond, NULL);
1802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1813397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/*******************************************************************************
1842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor**
1852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor** Function         GKI_get_os_tick_count
1862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor**
1872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor** Description      This function is called to retrieve the native OS system tick.
188c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor**
18960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl** Returns          Tick count of native OS.
19060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl**
19160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl*******************************************************************************/
19260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian RedlUINT32 GKI_get_os_tick_count(void)
19360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl{
19460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
19560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    /* TODO - add any OS specific code here
19660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    **/
1978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    return (gki_cb.com.OSTicks);
1982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2003397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/*******************************************************************************
201ed97649e9574b9d854fa4d6109c9333ae0993554John McCall**
2028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl** Function         GKI_create_task
203ed97649e9574b9d854fa4d6109c9333ae0993554John McCall**
204ed97649e9574b9d854fa4d6109c9333ae0993554John McCall** Description      This function is called to create a new OSS task.
2053397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl**
2062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor** Parameters:      task_entry  - (input) pointer to the entry function of the task
2079763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis**                  task_id     - (input) Task id is mapped to priority
2089763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis**                  taskname    - (input) name given to the task
2098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl**                  stack       - (input) pointer to the top of the stack (highest memory location)
2102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor**                  stacksize   - (input) size of the stack allocated for the task
2112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor**
2123397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl** Returns          GKI_SUCCESS if all OK, GKI_FAILURE if any problem
213c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor**
2148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl** NOTE             This function take some parameters that may not be needed
2152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor**                  by your particular OS. They are here for compatability
2162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor**                  of the function prototype.
2173397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl**
2182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor*******************************************************************************/
2198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlUINT8 GKI_create_task (TASKPTR task_entry, UINT8 task_id, INT8 *taskname, UINT16 *stack, UINT16 stacksize, void* pCondVar, void* pMutex)
2202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
2212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    UINT16  i;
2223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    UINT8   *p;
223395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson    struct sched_param param;
2248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    int policy, ret = 0;
225395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson    pthread_attr_t attr1;
226395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson
227ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    GKI_TRACE_5 ("GKI_create_task func=0x%x  id=%d  name=%s  stack=0x%x  stackSize=%d", task_entry, task_id, taskname, stack, stacksize);
228ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
229ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    if (task_id >= GKI_MAX_TASKS)
230ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    {
231ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt        GKI_TRACE_0("Error! task ID > max task allowed");
232ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt        return (GKI_FAILURE);
233ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    }
23434b41d939a1328f484511c6002ba2456db879a29Richard Smith
23534b41d939a1328f484511c6002ba2456db879a29Richard Smith
23634b41d939a1328f484511c6002ba2456db879a29Richard Smith    gki_cb.com.OSRdyTbl[task_id]    = TASK_READY;
23734b41d939a1328f484511c6002ba2456db879a29Richard Smith    gki_cb.com.OSTName[task_id]     = taskname;
23834b41d939a1328f484511c6002ba2456db879a29Richard Smith    gki_cb.com.OSWaitTmr[task_id]   = 0;
2393397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    gki_cb.com.OSWaitEvt[task_id]   = 0;
240be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis
2412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    /* Initialize mutex and condition variable objects for events and timeouts */
2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    pthread_mutex_init(&gki_cb.os.thread_evt_mutex[task_id], NULL);
2432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_cond_init (&gki_cb.os.thread_evt_cond[task_id], NULL);
2442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_mutex_init(&gki_cb.os.thread_timeout_mutex[task_id], NULL);
2452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_cond_init (&gki_cb.os.thread_timeout_cond[task_id], NULL);
2463397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
2472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_attr_init(&attr1);
2488538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    /* by default, pthread creates a joinable thread */
2492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#if ( FALSE == GKI_PTHREAD_JOINABLE )
2502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_DETACHED);
2513397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
2522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    GKI_TRACE_3("GKI creating task %i, pCond/pMutex=%x/%x", task_id, pCondVar, pMutex);
2538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#else
2542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    GKI_TRACE_1("GKI creating JOINABLE task %i", task_id);
2552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif
2569d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
2579d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    /* On Android, the new tasks starts running before 'gki_cb.os.thread_id[task_id]' is initialized */
2589d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    /* Pass task_id to new task so it can initialize gki_cb.os.thread_id[task_id] for it calls GKI_wait */
2599d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    gki_pthread_info[task_id].task_id = task_id;
2609d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    gki_pthread_info[task_id].task_entry = task_entry;
2619d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    gki_pthread_info[task_id].params = 0;
2629d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    gki_pthread_info[task_id].pCond = (pthread_cond_t*)pCondVar;
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    gki_pthread_info[task_id].pMutex = (pthread_mutex_t*)pMutex;
2643397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
26549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    ret = pthread_create( &gki_cb.os.thread_id[task_id],
26649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall              &attr1,
26749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall              (void *)gki_task_entry,
2688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl              &gki_pthread_info[task_id]);
26949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
27049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    if (ret != 0)
27149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    {
272c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor         GKI_TRACE_2("pthread_create failed(%d), %s!", ret, taskname);
273c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor         return GKI_FAILURE;
274c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    }
275c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
276c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    if(pthread_getschedparam(gki_cb.os.thread_id[task_id], &policy, &param)==0)
277c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    {
278c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#if defined(PBS_SQL_TASK)
279c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor         if (task_id == PBS_SQL_TASK)
2803397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl         {
2812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor             GKI_TRACE_0("PBS SQL lowest priority task");
282be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis             policy = SCHED_NORMAL;
28390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis         }
28490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis         else
28590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#endif
28690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis         {
28790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis             policy = SCHED_RR;
2883e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith             param.sched_priority = 30 - task_id - 2;
2893e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith         }
2909763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis         pthread_setschedparam(gki_cb.os.thread_id[task_id], policy, &param);
2919763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis     }
2928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
29390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    GKI_TRACE_6( "Leaving GKI_create_task %x %d %x %s %x %d",
29490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis              task_entry,
29590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis              task_id,
2963397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl              gki_cb.os.thread_id[task_id],
297ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis              taskname,
298ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis              stack,
299ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis              stacksize);
3008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
30190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    return (GKI_SUCCESS);
30290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
30390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
3043397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/*******************************************************************************
30590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis**
30690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis** Function         GKI_shutdown
30790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis**
30890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis** Description      shutdowns the GKI tasks/threads in from max task id to 0 and frees
30990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis**                  pthread resources!
31090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis**                  IMPORTANT: in case of join method, GKI_shutdown must be called outside
3113397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl**                  a GKI thread context!
31290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis**
31390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis** Returns          void
31490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis**
3154fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth*******************************************************************************/
3168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#define WAKE_LOCK_ID "brcm_nfca"
31790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
31890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid GKI_shutdown(void)
31990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis{
3203397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    UINT8 task_id;
3218dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    volatile int    *p_run_cond = &gki_cb.os.no_timer_suspend;
3228dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    int     oldCOnd = 0;
3238dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis#if ( FALSE == GKI_PTHREAD_JOINABLE )
324f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis    int i = 0;
325f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis#else
326f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis    int result;
3278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif
32890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
32990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    /* release threads and set as TASK_DEAD. going from low to high priority fixes
33090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis     * GKI_exception problem due to btu->hci sleep request events  */
3313397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    for (task_id = GKI_MAX_TASKS; task_id > 0; task_id--)
33290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    {
3333acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis        if (gki_cb.com.OSRdyTbl[task_id - 1] != TASK_DEAD)
3343acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis        {
3353acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis            gki_cb.com.OSRdyTbl[task_id - 1] = TASK_DEAD;
3363acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3373acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis            /* paranoi settings, make sure that we do not execute any mailbox events */
3383acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis            gki_cb.com.OSWaitEvt[task_id-1] &= ~(TASK_MBOX_0_EVT_MASK|TASK_MBOX_1_EVT_MASK|
3393acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis                                                TASK_MBOX_2_EVT_MASK|TASK_MBOX_3_EVT_MASK);
3408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl            GKI_send_event(task_id - 1, EVENT_MASK(GKI_SHUTDOWN_EVT));
3412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
3422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#if ( FALSE == GKI_PTHREAD_JOINABLE )
3437536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor            i = 0;
3447536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
345cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor            while ((gki_cb.com.OSWaitEvt[task_id - 1] != 0) && (++i < 10))
346cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                usleep(100 * 1000);
347cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor#else
348cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor            /* wait for proper Arnold Schwarzenegger task state */
3497536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor            result = pthread_join( gki_cb.os.thread_id[task_id-1], NULL );
3507536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor            if ( result < 0 )
3517536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor            {
352075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara                GKI_TRACE_1( "pthread_join() FAILED: result: %d", result );
353075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara            }
354075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara#endif
355075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara            GKI_TRACE_1( "GKI_shutdown(): task %s dead", gki_cb.com.OSTName[task_id]);
356075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara            GKI_exit_task(task_id - 1);
3573397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl        }
358465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    }
3593acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3603acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    /* Destroy mutex and condition variable objects */
3618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    pthread_mutex_destroy(&gki_cb.os.GKI_mutex);
3622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    /*    pthread_mutex_destroy(&GKI_sched_mutex); */
3632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#if (GKI_DEBUG == TRUE)
3643397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    pthread_mutex_destroy(&gki_cb.os.GKI_trace_mutex);
3653cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#endif
36631f17ecbef57b5679c017c375db330546b7b5145John McCall    /*    pthread_mutex_destroy(&thread_delay_mutex);
3678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl     pthread_cond_destroy (&thread_delay_cond); */
3683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#if ( FALSE == GKI_PTHREAD_JOINABLE )
3693cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    i = 0;
3703397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#endif
371deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor
3728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#ifdef NO_GKI_RUN_RETURN
373c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    shutdown_timer = 1;
374c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall#endif
3753397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    if (gki_cb.os.gki_timer_wake_lock_on)
376c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    {
3772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        GKI_TRACE_0("GKI_shutdown :  release_wake_lock(brcm_btld)");
378c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        release_wake_lock(WAKE_LOCK_ID);
379446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff        gki_cb.os.gki_timer_wake_lock_on = 0;
380446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff    }
3818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    oldCOnd = *p_run_cond;
3822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    *p_run_cond = GKI_TIMER_TICK_EXIT_COND;
3832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    if (oldCOnd == GKI_TIMER_TICK_STOP_COND)
384d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff        pthread_cond_signal( &gki_cb.os.gki_timer_cond );
3853397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
3861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
3878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
3882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/*******************************************************************************
3892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor **
390a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall ** Function        GKI_run
391a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall **
392a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall ** Description     This function runs a task
393a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl **
39489eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis ** Parameters:     start: TRUE start system tick (again), FALSE stop
395a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall **
396a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall ** Returns         void
39789eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis **
398a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall *********************************************************************************/
399a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallvoid gki_system_tick_start_stop_cback(BOOLEAN start)
40051bd803fbdade51d674598ed45da3d54190a656cJohn McCall{
401a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    tGKI_OS         *p_os = &gki_cb.os;
40251bd803fbdade51d674598ed45da3d54190a656cJohn McCall    volatile int    *p_run_cond = &p_os->no_timer_suspend;
403a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    volatile static int wake_lock_count;
404a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    if ( FALSE == start )
40551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    {
40651bd803fbdade51d674598ed45da3d54190a656cJohn McCall        /* this can lead to a race condition. however as we only read this variable in the timer loop
407a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall         * we should be fine with this approach. otherwise uncomment below mutexes.
408a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall         */
409a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall        /* GKI_disable(); */
410a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall        *p_run_cond = GKI_TIMER_TICK_STOP_COND;
41151bd803fbdade51d674598ed45da3d54190a656cJohn McCall        /* GKI_enable(); */
41251bd803fbdade51d674598ed45da3d54190a656cJohn McCall#ifdef GKI_TICK_TIMER_DEBUG
41351bd803fbdade51d674598ed45da3d54190a656cJohn McCall        BT_TRACE_1( TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, ">>> STOP GKI_timer_update(), wake_lock_count:%d", --wake_lock_count);
41451bd803fbdade51d674598ed45da3d54190a656cJohn McCall#endif
415ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor        release_wake_lock(WAKE_LOCK_ID);
416ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor        gki_cb.os.gki_timer_wake_lock_on = 0;
417ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    }
418ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    else
419ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    {
420ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor        /* restart GKI_timer_update() loop */
421ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor        acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_ID);
42251bd803fbdade51d674598ed45da3d54190a656cJohn McCall        gki_cb.os.gki_timer_wake_lock_on = 1;
42351bd803fbdade51d674598ed45da3d54190a656cJohn McCall        *p_run_cond = GKI_TIMER_TICK_RUN_COND;
42451bd803fbdade51d674598ed45da3d54190a656cJohn McCall        pthread_mutex_lock( &p_os->gki_timer_mutex );
42551bd803fbdade51d674598ed45da3d54190a656cJohn McCall        pthread_cond_signal( &p_os->gki_timer_cond );
42651bd803fbdade51d674598ed45da3d54190a656cJohn McCall        pthread_mutex_unlock( &p_os->gki_timer_mutex );
42751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
42851bd803fbdade51d674598ed45da3d54190a656cJohn McCall#ifdef GKI_TICK_TIMER_DEBUG
42951bd803fbdade51d674598ed45da3d54190a656cJohn McCall        BT_TRACE_1( TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, ">>> START GKI_timer_update(), wake_lock_count:%d", ++wake_lock_count );
43051bd803fbdade51d674598ed45da3d54190a656cJohn McCall#endif
43151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
43251bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
43351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
43451bd803fbdade51d674598ed45da3d54190a656cJohn McCall
43551bd803fbdade51d674598ed45da3d54190a656cJohn McCall/*******************************************************************************
43651bd803fbdade51d674598ed45da3d54190a656cJohn McCall**
43751bd803fbdade51d674598ed45da3d54190a656cJohn McCall** Function         timer_thread
43851bd803fbdade51d674598ed45da3d54190a656cJohn McCall**
43951bd803fbdade51d674598ed45da3d54190a656cJohn McCall** Description      Timer thread
440b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara**
44151bd803fbdade51d674598ed45da3d54190a656cJohn McCall** Parameters:      id  - (input) timer ID
44251bd803fbdade51d674598ed45da3d54190a656cJohn McCall**
44351bd803fbdade51d674598ed45da3d54190a656cJohn McCall** Returns          void
44451bd803fbdade51d674598ed45da3d54190a656cJohn McCall**
44551bd803fbdade51d674598ed45da3d54190a656cJohn McCall*********************************************************************************/
44651bd803fbdade51d674598ed45da3d54190a656cJohn McCall#ifdef NO_GKI_RUN_RETURN
44751bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid timer_thread(signed long id)
44851bd803fbdade51d674598ed45da3d54190a656cJohn McCall{
44951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    GKI_TRACE_1("%s enter", __func__);
45051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    struct timespec delay;
45151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    int timeout = 1000;  /* 10  ms per system tick  */
45251bd803fbdade51d674598ed45da3d54190a656cJohn McCall    int err;
45351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
45451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    while(!shutdown_timer)
45551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    {
45651bd803fbdade51d674598ed45da3d54190a656cJohn McCall        delay.tv_sec = timeout / 1000;
45751bd803fbdade51d674598ed45da3d54190a656cJohn McCall        delay.tv_nsec = 1000 * 1000 * (timeout%1000);
45851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
45951bd803fbdade51d674598ed45da3d54190a656cJohn McCall        /* [u]sleep can't be used because it uses SIGALRM */
46051bd803fbdade51d674598ed45da3d54190a656cJohn McCall
46151bd803fbdade51d674598ed45da3d54190a656cJohn McCall        do
46251bd803fbdade51d674598ed45da3d54190a656cJohn McCall        {
46351bd803fbdade51d674598ed45da3d54190a656cJohn McCall            err = nanosleep(&delay, &delay);
46451bd803fbdade51d674598ed45da3d54190a656cJohn McCall        } while (err < 0 && errno ==EINTR);
46551bd803fbdade51d674598ed45da3d54190a656cJohn McCall
46651bd803fbdade51d674598ed45da3d54190a656cJohn McCall        GKI_timer_update(1);
46751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
46851bd803fbdade51d674598ed45da3d54190a656cJohn McCall    GKI_TRACE_1("%s exit", __func__);
46951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    pthread_exit(NULL);
47051bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
47151bd803fbdade51d674598ed45da3d54190a656cJohn McCall#endif
47251bd803fbdade51d674598ed45da3d54190a656cJohn McCall
473796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara/*******************************************************************************
474796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara**
475dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor** Function         GKI_run
47651bd803fbdade51d674598ed45da3d54190a656cJohn McCall**
47751bd803fbdade51d674598ed45da3d54190a656cJohn McCall** Description      This function runs a task
47851bd803fbdade51d674598ed45da3d54190a656cJohn McCall**
47951bd803fbdade51d674598ed45da3d54190a656cJohn McCall** Parameters:      p_task_id  - (input) pointer to task id
48051bd803fbdade51d674598ed45da3d54190a656cJohn McCall**
48151bd803fbdade51d674598ed45da3d54190a656cJohn McCall** Returns          void
48251bd803fbdade51d674598ed45da3d54190a656cJohn McCall**
48351bd803fbdade51d674598ed45da3d54190a656cJohn McCall** NOTE             This function is only needed for operating systems where
48451bd803fbdade51d674598ed45da3d54190a656cJohn McCall**                  starting a task is a 2-step process. Most OS's do it in
485ed97649e9574b9d854fa4d6109c9333ae0993554John McCall**                  one step, If your OS does it in one step, this function
486ed97649e9574b9d854fa4d6109c9333ae0993554John McCall**                  should be empty.
487ed97649e9574b9d854fa4d6109c9333ae0993554John McCall*********************************************************************************/
48851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid GKI_run (void *p_task_id)
48951bd803fbdade51d674598ed45da3d54190a656cJohn McCall{
49051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    GKI_TRACE_1("%s enter", __func__);
49151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    int retval = EACCES;
492cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    static pthread_t workerThreadId = NULL;
493cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall
494cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    retval = pthread_create (&workerThreadId, NULL, GKI_run_worker_thread, NULL);
49551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    if (retval != 0)
49651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    {
497cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall        GKI_TRACE_ERROR_2 ("%s: fail create thread %d", __func__, retval);
498cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    }
499cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    GKI_TRACE_1("%s exit", __func__);
500cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall}
50151bd803fbdade51d674598ed45da3d54190a656cJohn McCall
50251bd803fbdade51d674598ed45da3d54190a656cJohn McCall
50351bd803fbdade51d674598ed45da3d54190a656cJohn McCall/*******************************************************************************
504a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall**
505ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt** Function         GKI_run_worker_thread
506ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt**
507ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt** Description      This function runs a task
508ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt**
509ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt** Parameters:      None
510ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt**
51134b41d939a1328f484511c6002ba2456db879a29Richard Smith** Returns:         error code
51234b41d939a1328f484511c6002ba2456db879a29Richard Smith*********************************************************************************/
51334b41d939a1328f484511c6002ba2456db879a29Richard Smithvoid* GKI_run_worker_thread (void* dummy)
51451bd803fbdade51d674598ed45da3d54190a656cJohn McCall{
51551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    GKI_TRACE_1("%s: enter", __func__);
516a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    struct timespec delay;
51751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    int err = 0;
51851bd803fbdade51d674598ed45da3d54190a656cJohn McCall    volatile int * p_run_cond = &gki_cb.os.no_timer_suspend;
519a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
5209d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall#ifndef GKI_NO_TICK_STOP
5219d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    /* register start stop function which disable timer loop in GKI_run() when no timers are
5229d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall     * in any GKI/BTA/BTU this should save power when BTLD is idle! */
5239d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    GKI_timer_queue_register_callback( gki_system_tick_start_stop_cback );
5249d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    GKI_TRACE_1( "%s: Start/Stop GKI_timer_update_registered!", __func__ );
5259d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall#endif
5269d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
5279d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall#ifdef NO_GKI_RUN_RETURN
5289d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    GKI_TRACE_1("%s: GKI_run == NO_GKI_RUN_RETURN", __func__);
5299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    pthread_attr_t timer_attr;
5309d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
5319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    shutdown_timer = 0;
5329d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
5339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    pthread_attr_init(&timer_attr);
5349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    pthread_attr_setdetachstate(&timer_attr, PTHREAD_CREATE_DETACHED);
53551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    if (pthread_create( &timer_thread_id,
53651bd803fbdade51d674598ed45da3d54190a656cJohn McCall              &timer_attr,
537a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall              timer_thread,
53849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall              NULL) != 0 )
53949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    {
54049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall        GKI_TRACE_1("%s: pthread_create failed to create timer_thread!", __func__);
54149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall        return NULL;
542c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    }
543c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#else
544c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    GKI_TRACE_3("%s: run_cond(%x)=%d ", __func__, p_run_cond, *p_run_cond);
545c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    for (;GKI_TIMER_TICK_EXIT_COND != *p_run_cond;)
54651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    {
54751bd803fbdade51d674598ed45da3d54190a656cJohn McCall        do
548833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        {
549833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall            /* adjust hear bit tick in btld by changning TICKS_PER_SEC!!!!! this formula works only for
550833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall             * 1-1000ms heart beat units! */
551833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall            delay.tv_sec = LINUX_SEC / 1000;
55244f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis            delay.tv_nsec = 1000 * 1000 * (LINUX_SEC % 1000);
55344f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis
554a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall            /* [u]sleep can't be used because it uses SIGALRM */
555075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara            do
556075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara            {
557075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara                err = nanosleep(&delay, &delay);
558075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara            } while (err < 0 && errno == EINTR);
559465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
560e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara            /* the unit should be alsways 1 (1 tick). only if you vary for some reason heart beat tick
5619e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor             * e.g. power saving you may want to provide more ticks
562a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall             */
5633cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall            GKI_timer_update( 1 );
5643cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall            /* BT_TRACE_2( TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, "update: tv_sec: %d, tv_nsec: %d", delay.tv_sec, delay.tv_nsec ); */
5653cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall        } while ( GKI_TIMER_TICK_RUN_COND == *p_run_cond);
5664714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor
567e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        /* currently on reason to exit above loop is no_timer_suspend == GKI_TIMER_TICK_STOP_COND
5682494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor         * block timer main thread till re-armed by  */
56951bd803fbdade51d674598ed45da3d54190a656cJohn McCall#ifdef GKI_TICK_TIMER_DEBUG
570a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall        BT_TRACE_0( TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, ">>> SUSPENDED GKI_timer_update()" );
57133500955d731c73717af52088b7fc0e7a85681e7John McCall#endif
57233500955d731c73717af52088b7fc0e7a85681e7John McCall        if (GKI_TIMER_TICK_EXIT_COND != *p_run_cond) {
57333500955d731c73717af52088b7fc0e7a85681e7John McCall            GKI_TRACE_1("%s: waiting timer mutex", __func__);
57494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor            pthread_mutex_lock( &gki_cb.os.gki_timer_mutex );
57533500955d731c73717af52088b7fc0e7a85681e7John McCall            pthread_cond_wait( &gki_cb.os.gki_timer_cond, &gki_cb.os.gki_timer_mutex );
57633500955d731c73717af52088b7fc0e7a85681e7John McCall            pthread_mutex_unlock( &gki_cb.os.gki_timer_mutex );
57733500955d731c73717af52088b7fc0e7a85681e7John McCall            GKI_TRACE_1("%s: exited timer mutex", __func__);
57833500955d731c73717af52088b7fc0e7a85681e7John McCall        }
57944f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis        /* potentially we need to adjust os gki_cb.com.OSTicks */
58044f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis
58133500955d731c73717af52088b7fc0e7a85681e7John McCall#ifdef GKI_TICK_TIMER_DEBUG
5827536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor        BT_TRACE_1( TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, ">>> RESTARTED GKI_timer_update(): run_cond: %d",
5837536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor                    *p_run_cond );
5847536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor#endif
58551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    } /* for */
58651bd803fbdade51d674598ed45da3d54190a656cJohn McCall#endif
587c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    GKI_TRACE_1("%s: exit", __func__);
588c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return NULL;
589c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
59054e14c4db764c0636160d26c5bbf491637c83a76John McCall
59154e14c4db764c0636160d26c5bbf491637c83a76John McCall
59254e14c4db764c0636160d26c5bbf491637c83a76John McCall/*******************************************************************************
59354e14c4db764c0636160d26c5bbf491637c83a76John McCall**
594a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall** Function         GKI_stop
59551bd803fbdade51d674598ed45da3d54190a656cJohn McCall**
59651bd803fbdade51d674598ed45da3d54190a656cJohn McCall** Description      This function is called to stop
597a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall**                  the tasks and timers when the system is being stopped
598a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall**
5994dcf151a555ff51e4d643e8e6eeb80f121d11d1bChris Lattner** Returns          void
600a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl**
6012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor** NOTE             This function is NOT called by the Widcomm stack and
6022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor**                  profiles. If you want to use it in your own implementation,
603b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**                  put specific code here.
604b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**
60589eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis*******************************************************************************/
606b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnervoid GKI_stop (void)
607b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner{
608b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    UINT8 task_id;
609b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
610b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    /*  gki_queue_timer_cback(FALSE); */
611b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    /* TODO - add code here if needed*/
612b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
613b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    for(task_id = 0; task_id<GKI_MAX_TASKS; task_id++)
614b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    {
615b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner        if(gki_cb.com.OSRdyTbl[task_id] != TASK_DEAD)
616b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner        {
617b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner            GKI_exit_task(task_id);
618b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner        }
619b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    }
62089eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis}
621b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
622b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
623b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/*******************************************************************************
624b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**
625b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner** Function         GKI_wait
6260558df2da807646e65d4fa290f4e92114af1a746Chris Lattner**
6270558df2da807646e65d4fa290f4e92114af1a746Chris Lattner** Description      This function is called by tasks to wait for a specific
6280558df2da807646e65d4fa290f4e92114af1a746Chris Lattner**                  event or set of events. The task may specify the duration
62989eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis**                  that it wants to wait for, or 0 if infinite.
6308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl**
6310558df2da807646e65d4fa290f4e92114af1a746Chris Lattner** Parameters:      flag -    (input) the event or set of events to wait for
6320558df2da807646e65d4fa290f4e92114af1a746Chris Lattner**                  timeout - (input) the duration that the task wants to wait
6330558df2da807646e65d4fa290f4e92114af1a746Chris Lattner**                                    for the specific events (in system ticks)
6340558df2da807646e65d4fa290f4e92114af1a746Chris Lattner**
6350558df2da807646e65d4fa290f4e92114af1a746Chris Lattner**
6360558df2da807646e65d4fa290f4e92114af1a746Chris Lattner** Returns          the event mask of received events or zero if timeout
6370558df2da807646e65d4fa290f4e92114af1a746Chris Lattner**
6380558df2da807646e65d4fa290f4e92114af1a746Chris Lattner*******************************************************************************/
6390558df2da807646e65d4fa290f4e92114af1a746Chris LattnerUINT16 GKI_wait (UINT16 flag, UINT32 timeout)
6400558df2da807646e65d4fa290f4e92114af1a746Chris Lattner{
6410558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    UINT16 evt;
6420558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    UINT8 rtask;
6430558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    struct timespec abstime = { 0, 0 };
6440558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    int sec;
6450558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    int nano_sec;
6460558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6470558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    rtask = GKI_get_taskid();
6480558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    GKI_TRACE_3("GKI_wait %d %x %d", rtask, flag, timeout);
6490558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    if (rtask >= GKI_MAX_TASKS) {
6500558df2da807646e65d4fa290f4e92114af1a746Chris Lattner        pthread_exit(NULL);
6510558df2da807646e65d4fa290f4e92114af1a746Chris Lattner        return 0;
6520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    }
6530558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6540558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    gki_pthread_info_t* p_pthread_info = &gki_pthread_info[rtask];
6550558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    if (p_pthread_info->pCond != NULL && p_pthread_info->pMutex != NULL) {
6560558df2da807646e65d4fa290f4e92114af1a746Chris Lattner        int ret;
6570558df2da807646e65d4fa290f4e92114af1a746Chris Lattner        GKI_TRACE_3("GKI_wait task=%i, pCond/pMutex = %x/%x", rtask, p_pthread_info->pCond, p_pthread_info->pMutex);
6580558df2da807646e65d4fa290f4e92114af1a746Chris Lattner        ret = pthread_mutex_lock(p_pthread_info->pMutex);
6590558df2da807646e65d4fa290f4e92114af1a746Chris Lattner        ret = pthread_cond_signal(p_pthread_info->pCond);
6600558df2da807646e65d4fa290f4e92114af1a746Chris Lattner        ret = pthread_mutex_unlock(p_pthread_info->pMutex);
6610558df2da807646e65d4fa290f4e92114af1a746Chris Lattner        p_pthread_info->pMutex = NULL;
6620558df2da807646e65d4fa290f4e92114af1a746Chris Lattner        p_pthread_info->pCond = NULL;
6630558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    }
6640558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    gki_cb.com.OSWaitForEvt[rtask] = flag;
6650558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6660558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    /* protect OSWaitEvt[rtask] from modification from an other thread */
6670558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    pthread_mutex_lock(&gki_cb.os.thread_evt_mutex[rtask]);
6680558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6690558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#if 0 /* for clean scheduling we probably should always call pthread_cond_wait() */
6700558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    /* Check if anything in any of the mailboxes. There is a potential race condition where OSTaskQFirst[rtask]
6710558df2da807646e65d4fa290f4e92114af1a746Chris Lattner     has been modified. however this should only result in addtional call to  pthread_cond_wait() but as
6720558df2da807646e65d4fa290f4e92114af1a746Chris Lattner     the cond is met, it will exit immediately (depending on schedulling) */
6730558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    if (gki_cb.com.OSTaskQFirst[rtask][0])
6740558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_0_EVT_MASK;
6750558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    if (gki_cb.com.OSTaskQFirst[rtask][1])
6760558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_1_EVT_MASK;
6770558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    if (gki_cb.com.OSTaskQFirst[rtask][2])
6780558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_2_EVT_MASK;
6790558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    if (gki_cb.com.OSTaskQFirst[rtask][3])
6800558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_3_EVT_MASK;
681f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne#endif
6820558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6830558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    if (!(gki_cb.com.OSWaitEvt[rtask] & flag))
6840558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    {
6850558df2da807646e65d4fa290f4e92114af1a746Chris Lattner        if (timeout)
6860558df2da807646e65d4fa290f4e92114af1a746Chris Lattner        {
6870558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            //            timeout = GKI_MS_TO_TICKS(timeout);     /* convert from milliseconds to ticks */
6880558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6890558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            /* get current system time */
6900558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            //            clock_gettime(CLOCK_MONOTONIC, &currSysTime);
6910558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            //            abstime.tv_sec = currSysTime.time;
6920558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            //            abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
6930558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            clock_gettime(CLOCK_MONOTONIC, &abstime);
6940558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6950558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            /* add timeout */
696eb7f96141f754150a92433286fa385910a22f494Sam Weinig            sec = timeout / 1000;
697eb7f96141f754150a92433286fa385910a22f494Sam Weinig            nano_sec = (timeout % 1000) * NANOSEC_PER_MILLISEC;
698eb7f96141f754150a92433286fa385910a22f494Sam Weinig            abstime.tv_nsec += nano_sec;
699eb7f96141f754150a92433286fa385910a22f494Sam Weinig            if (abstime.tv_nsec > NSEC_PER_SEC)
700eb7f96141f754150a92433286fa385910a22f494Sam Weinig            {
701eb7f96141f754150a92433286fa385910a22f494Sam Weinig                abstime.tv_sec += (abstime.tv_nsec / NSEC_PER_SEC);
702eb7f96141f754150a92433286fa385910a22f494Sam Weinig                abstime.tv_nsec = abstime.tv_nsec % NSEC_PER_SEC;
703eb7f96141f754150a92433286fa385910a22f494Sam Weinig            }
704eb7f96141f754150a92433286fa385910a22f494Sam Weinig            abstime.tv_sec += sec;
705b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
706b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor#if defined(__LP64__)
707b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            // STOPSHIP need pthread_condattr_setclock(..., CLOCK_MONOTONIC)
708b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            pthread_cond_timedwait(&gki_cb.os.thread_evt_cond[rtask],
709b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                    &gki_cb.os.thread_evt_mutex[rtask], &abstime);
710b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor#else
711b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            pthread_cond_timedwait_monotonic(&gki_cb.os.thread_evt_cond[rtask],
712b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                    &gki_cb.os.thread_evt_mutex[rtask], &abstime);
713b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor#endif
714b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
715b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        }
716b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        else
717b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        {
718b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            pthread_cond_wait(&gki_cb.os.thread_evt_cond[rtask], &gki_cb.os.thread_evt_mutex[rtask]);
719b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        }
720b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
721b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        /* TODO: check, this is probably neither not needed depending on phtread_cond_wait() implmentation,
722b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         e.g. it looks like it is implemented as a counter in which case multiple cond_signal
723b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         should NOT be lost! */
724b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        // we are waking up after waiting for some events, so refresh variables
725b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        // no need to call GKI_disable() here as we know that we will have some events as we've been waking up after condition pending or timeout
726b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        if (gki_cb.com.OSTaskQFirst[rtask][0])
727b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_0_EVT_MASK;
728b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        if (gki_cb.com.OSTaskQFirst[rtask][1])
729b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_1_EVT_MASK;
730e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne        if (gki_cb.com.OSTaskQFirst[rtask][2])
7310558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_2_EVT_MASK;
732b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner        if (gki_cb.com.OSTaskQFirst[rtask][3])
7331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_3_EVT_MASK;
734a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
735b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner        if (gki_cb.com.OSRdyTbl[rtask] == TASK_DEAD)
736b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner        {
7371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            gki_cb.com.OSWaitEvt[rtask] = 0;
7388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl            /* unlock thread_evt_mutex as pthread_cond_wait() does auto lock when cond is met */
7398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl            pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[rtask]);
7401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            GKI_TRACE_1("GKI TASK_DEAD received. exit thread %d...", rtask );
7413397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
742f29f0a28c4d9599b389bbb6d186e14af753dc5a3Sebastian Redl            gki_cb.os.thread_id[rtask] = 0;
74351e774d42269e3b22d746184c0b9076fc13b32e6Zhongxing Xu            pthread_exit(NULL);
74431d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor            return (EVENT_MASK(GKI_SHUTDOWN_EVT));
745b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner        }
746b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    }
747b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
748ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor    /* Clear the wait for event mask */
749b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    gki_cb.com.OSWaitForEvt[rtask] = 0;
750b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
751b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    /* Return only those bits which user wants... */
752b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    evt = gki_cb.com.OSWaitEvt[rtask] & flag;
753b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
754b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    /* Clear only those bits which user wants... */
75549b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis    gki_cb.com.OSWaitEvt[rtask] &= ~flag;
756b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
757b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    /* unlock thread_evt_mutex as pthread_cond_wait() does auto lock mutex when cond is met */
758b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[rtask]);
759b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    GKI_TRACE_4("GKI_wait %d %x %d %x resumed", rtask, flag, timeout, evt);
7607f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
7617f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    return (evt);
7624fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor}
763b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor
7645b4ec636637c9d876102240127cc0dca9280e83aTed Kremenek
7656a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor/*******************************************************************************
766a93e3b5bde9f0a7b59215f19f176f7d69881b81cSebastian Redl**
767320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian** Function         GKI_delay
768b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**
769b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor** Description      This function is called by tasks to sleep unconditionally
770b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**                  for a specified amount of time. The duration is in milliseconds
771b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**
772b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor** Parameters:      timeout -    (input) the duration in milliseconds
773b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**
774b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor** Returns          void
775b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**
776b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor*******************************************************************************/
777b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
778b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregorvoid GKI_delay (UINT32 timeout)
77984bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne{
780cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    UINT8 rtask = GKI_get_taskid();
78184bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne    struct timespec delay;
78284bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne    int err;
783ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt
784cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    GKI_TRACE_2("GKI_delay %d %d", rtask, timeout);
785b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
7862f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner    delay.tv_sec = timeout / 1000;
787b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    delay.tv_nsec = 1000 * 1000 * (timeout%1000);
788b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
789b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    /* [u]sleep can't be used because it uses SIGALRM */
790b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
791b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    do {
7921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        err = nanosleep(&delay, &delay);
793b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    } while (err < 0 && errno ==EINTR);
7942f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner
795b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    /* Check if task was killed while sleeping */
796b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    /* NOTE
797b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    **      if you do not implement task killing, you do not
798b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    **      need this check.
79961d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor    */
80061d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor    if (rtask && gki_cb.com.OSRdyTbl[rtask] == TASK_DEAD)
801b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    {
802b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    }
803b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
804b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    GKI_TRACE_2("GKI_delay %d %d done", rtask, timeout);
805b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    return;
806b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
807b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
808b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
809b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/*******************************************************************************
810b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**
811b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner** Function         GKI_send_event
812b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**
813b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner** Description      This function is called by tasks to send events to other
814b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**                  tasks. Tasks can also send events to themselves.
815b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**
816b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner** Parameters:      task_id -  (input) The id of the task to which the event has to
817b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**                  be sent
818b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**                  event   -  (input) The event that has to be sent
819b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**
820b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**
821a53d2cbe37e4be0d95b9d3e09f74eafae31fc940John McCall** Returns          GKI_SUCCESS if all OK, else GKI_FAILURE
822d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff**
823b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor*******************************************************************************/
824b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorUINT8 GKI_send_event (UINT8 task_id, UINT16 event)
825b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor{
826b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    GKI_TRACE_2("GKI_send_event %d %x", task_id, event);
827b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
828b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    /* use efficient coding to avoid pipeline stalls */
829b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    if (task_id < GKI_MAX_TASKS)
830b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    {
831b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        /* protect OSWaitEvt[task_id] from manipulation in GKI_wait() */
832b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        pthread_mutex_lock(&gki_cb.os.thread_evt_mutex[task_id]);
833b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
834b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        /* Set the event bit */
835b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        gki_cb.com.OSWaitEvt[task_id] |= event;
836b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
837b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        pthread_cond_signal(&gki_cb.os.thread_evt_cond[task_id]);
8380ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8390ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner        pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[task_id]);
8400ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8410ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner        GKI_TRACE_2("GKI_send_event %d %x done", task_id, event);
8420ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner        return ( GKI_SUCCESS );
8430ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    }
8440ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    return (GKI_FAILURE);
8450ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner}
8460ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8470ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8480ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner/*******************************************************************************
8490ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner**
8500ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner** Function         GKI_isend_event
8510ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner**
8520ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner** Description      This function is called from ISRs to send events to other
8530ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner**                  tasks. The only difference between this function and GKI_send_event
8540ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner**                  is that this function assumes interrupts are already disabled.
8550ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner**
8560ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner** Parameters:      task_id -  (input) The destination task Id for the event.
857b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**                  event   -  (input) The event flag
858b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**
8590ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner** Returns          GKI_SUCCESS if all OK, else GKI_FAILURE
860b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner**
8610ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner** NOTE             This function is NOT called by the Widcomm stack and
8620ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner**                  profiles. If you want to use it in your own implementation,
8630ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner**                  put your code here, otherwise you can delete the entire
8640ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner**                  body of the function.
865b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**
866b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor*******************************************************************************/
867b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorUINT8 GKI_isend_event (UINT8 task_id, UINT16 event)
868b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor{
869b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
870b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    GKI_TRACE_2("GKI_isend_event %d %x", task_id, event);
871b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    GKI_TRACE_2("GKI_isend_event %d %x done", task_id, event);
872b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    return    GKI_send_event(task_id, event);
873b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
874b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
875b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
876b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor/*******************************************************************************
877b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**
878b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor** Function         GKI_get_taskid
879b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**
880b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor** Description      This function gets the currently running task ID.
881b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**
882b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor** Returns          task ID
883b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**
884b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor** NOTE             The Widcomm upper stack and profiles may run as a single task.
885b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**                  If you only have one GKI task, then you can hard-code this
886b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**                  function to return a '1'. Otherwise, you should have some
887b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**                  OS-specific method to determine the current task.
888b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor**
889b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor*******************************************************************************/
890b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorUINT8 GKI_get_taskid (void)
891b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor{
892b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    int i;
893a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor
894a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor    pthread_t thread_id = pthread_self( );
895a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor    for (i = 0; i < GKI_MAX_TASKS; i++) {
8964800a5c79023271408af49797e09be32aca93232Douglas Gregor        if (gki_cb.os.thread_id[i] == thread_id) {
8974800a5c79023271408af49797e09be32aca93232Douglas Gregor            GKI_TRACE_2("GKI_get_taskid %x %d done", thread_id, i);
8984800a5c79023271408af49797e09be32aca93232Douglas Gregor            return(i);
8994800a5c79023271408af49797e09be32aca93232Douglas Gregor        }
9004800a5c79023271408af49797e09be32aca93232Douglas Gregor    }
901b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
902b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    GKI_TRACE_1("GKI_get_taskid: thread id = %x, task id = -1", thread_id);
903b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
904b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    return(-1);
905b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
906e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
907e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/*******************************************************************************
9081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump**
909e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor** Function         GKI_map_taskname
910e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor**
911e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor** Description      This function gets the task name of the taskid passed as arg.
912e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor**                  If GKI_MAX_TASKS is passed as arg the currently running task
913e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor**                  name is returned
914e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor**
915e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor** Parameters:      task_id -  (input) The id of the task whose name is being
9161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump**                  sought. GKI_MAX_TASKS is passed to get the name of the
917e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor**                  currently running task.
918e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor**
9191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump** Returns          pointer to task name
920e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor**
921e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor** NOTE             this function needs no customization
9221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump**
923e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor*******************************************************************************/
924e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas GregorUINT8 *GKI_map_taskname (UINT8 task_id)
925e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor{
926e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    GKI_TRACE_1("GKI_map_taskname %d", task_id);
927e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (task_id < GKI_MAX_TASKS)
929e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    {
930e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor        GKI_TRACE_2("GKI_map_taskname %d %s done", task_id, gki_cb.com.OSTName[task_id]);
931e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         return (gki_cb.com.OSTName[task_id]);
9321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
933e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    else if (task_id == GKI_MAX_TASKS )
934e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    {
935e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor        return (gki_cb.com.OSTName[GKI_get_taskid()]);
936e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    }
937e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    else
9381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    {
939e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor        return (UINT8*) "BAD";
940e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    }
941b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
9423397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
9438e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
9448e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis/*******************************************************************************
9452bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor**
946b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor** Function         GKI_enable
947e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor**
948e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor** Description      This function enables interrupts.
949e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor**
95077f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl** Returns          void
9518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl**
9523397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl*******************************************************************************/
9533397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid GKI_enable (void)
954e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor{
955e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    GKI_TRACE_0("GKI_enable");
956e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    pthread_mutex_unlock(&gki_cb.os.GKI_mutex);
95777f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl/* 	pthread_mutex_xx is nesting save, no need for this: already_disabled = 0; */
95877f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl    GKI_TRACE_0("Leaving GKI_enable");
959e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    return;
9601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
961e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
9628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
9638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/*******************************************************************************
9648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl**
965e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor** Function         GKI_disable
966e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor**
967e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor** Description      This function disables interrupts.
96877f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl**
96977f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl** Returns          void
97077f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl**
9711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump*******************************************************************************/
97231d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor
973b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregorvoid GKI_disable (void)
974b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor{
975b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    //GKI_TRACE_0("GKI_disable");
9768538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
977b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor/*	pthread_mutex_xx is nesting save, no need for this: if (!already_disabled) {
978b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    already_disabled = 1; */
979b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    		pthread_mutex_lock(&gki_cb.os.GKI_mutex);
980fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer/*  } */
9811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    //GKI_TRACE_0("Leaving GKI_disable");
982fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer    return;
983b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor}
984aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam
9851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
986e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/*******************************************************************************
987b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor**
9888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl** Function         GKI_exception
989ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar**
99031d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor** Description      This function throws an exception.
99131d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor**                  This is normally only called for a nonrecoverable error.
99231d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor**
99331d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor** Parameters:      code    -  (input) The code for the error
994b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor**                  msg     -  (input) The message that has to be logged
99511a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam**
9968e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis** Returns          void
9978e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis**
9988e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis*******************************************************************************/
9998e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10008e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidisvoid GKI_exception (UINT16 code, char *msg)
10018e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis{
10028e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    UINT8 task_id;
10038e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    int i = 0;
10048e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10058e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    GKI_TRACE_ERROR_0( "GKI_exception(): Task State Table");
10068e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10078e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    for(task_id = 0; task_id < GKI_MAX_TASKS; task_id++)
10088e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    {
10098e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis        GKI_TRACE_ERROR_3( "TASK ID [%d] task name [%s] state [%d]",
10108e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                         task_id,
10118e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                         gki_cb.com.OSTName[task_id],
10128e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                         gki_cb.com.OSRdyTbl[task_id]);
1013f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek    }
1014f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek
10158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    GKI_TRACE_ERROR_2("GKI_exception %d %s", code, msg);
1016f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek    GKI_TRACE_ERROR_0( "********************************************************************");
1017f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek    GKI_TRACE_ERROR_2( "* GKI_exception(): %d %s", code, msg);
1018445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor    GKI_TRACE_ERROR_0( "********************************************************************");
10198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
1020f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek#if (GKI_DEBUG == TRUE)
1021f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek    GKI_disable();
10222bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor
10232bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor    if (gki_cb.com.ExceptionCnt < GKI_MAX_EXCEPTION)
10242bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor    {
1025a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl        EXCEPTION_T *pExp;
10260a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10270a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor        pExp =  &gki_cb.com.Exception[gki_cb.com.ExceptionCnt++];
10280a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor        pExp->type = code;
10290a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor        pExp->taskid = GKI_get_taskid();
10300a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor        strncpy((char *)pExp->msg, msg, GKI_MAX_EXCEPTION_MSGLEN - 1);
10310a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    }
1032eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth
10330a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    GKI_enable();
10340a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor#endif
10350a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10360a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    GKI_TRACE_ERROR_2("GKI_exception %d %s done", code, msg);
10377e7fbd05a5dfdb0addfc8b5af2fcbed8c7b5fb87Peter Collingbourne
10380a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
1039dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer    return;
1040dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer}
10410a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10420a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10430a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor/*******************************************************************************
10441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump**
10450a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor** Function         GKI_get_time_stamp
10460a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor**
104711a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam** Description      This function formats the time into a user area
1048412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian**
104911a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam** Parameters:      tbuf -  (output) the address to the memory containing the
1050412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian**                  formatted time
1051f84109ee6aeffb09366bd70c8593ce1b7818b1adFariborz Jahanian**
1052c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek** Returns          the address of the user area containing the formatted time
1053c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek**                  The format of the time is ????
105474da19fc3a52d7e3005eeb7a7833859da84fd12aDouglas Gregor**
10554c9d8d0eca5ca635d9a30222f690db9140e98325Fariborz Jahanian** NOTE             This function is only called by OBEX.
10561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump**
10570a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor*******************************************************************************/
10580a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas GregorINT8 *GKI_get_time_stamp (INT8 *tbuf)
10590a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor{
1060b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman    UINT32 ms_time;
10610a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    UINT32 s_time;
1062da4b7cf09ebfd4e4098b516081fa9dae2f5c99e0Anders Carlsson    UINT32 m_time;
10637da99b05aa9482e76b2954223b5652469004aec2Anders Carlsson    UINT32 h_time;
10647da99b05aa9482e76b2954223b5652469004aec2Anders Carlsson    INT8   *p_out = tbuf;
10650a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10666f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor    gki_cb.com.OSTicks = times(0);
10670a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    ms_time = GKI_TICKS_TO_MS(gki_cb.com.OSTicks);
10680a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    s_time  = ms_time/100;   /* 100 Ticks per second */
10690a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    m_time  = s_time/60;
10700a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    h_time  = m_time/60;
1071ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner
1072ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner    ms_time -= s_time*100;
1073972d954bd216c86a961bb7f81c53af85de17c2f0Douglas Gregor    s_time  -= m_time*60;
10740a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    m_time  -= h_time*60;
10750a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10760a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    *p_out++ = (INT8)((h_time / 10) + '0');
10770a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    *p_out++ = (INT8)((h_time % 10) + '0');
10780a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    *p_out++ = ':';
10790a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    *p_out++ = (INT8)((m_time / 10) + '0');
1080a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    *p_out++ = (INT8)((m_time % 10) + '0');
1081a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    *p_out++ = ':';
10820a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    *p_out++ = (INT8)((s_time / 10) + '0');
10830a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    *p_out++ = (INT8)((s_time % 10) + '0');
10841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    *p_out++ = ':';
10850a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    *p_out++ = (INT8)((ms_time / 10) + '0');
10860a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    *p_out++ = (INT8)((ms_time % 10) + '0');
10870a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    *p_out++ = ':';
10880a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    *p_out   = 0;
10890a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10900a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    return (tbuf);
10910a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor}
10920a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10930d2d1bcef51993ca3fd957e45fb7ec85e45016e5Chandler Carruth
1094a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson/*******************************************************************************
1095a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson**
109615b91764d08e886391c865c4a444d7b51141c284Eli Friedman** Function         GKI_register_mempool
109715b91764d08e886391c865c4a444d7b51141c284Eli Friedman**
1098a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson** Description      This function registers a specific memory pool.
1099b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis**
1100b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis** Parameters:      p_mem -  (input) pointer to the memory pool
1101b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis**
11020a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor** Returns          void
11030a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor**
1104ab8e281b32a3d3b9b18257d26844362bf806ecdcDaniel Dunbar** NOTE             This function is NOT called by the Widcomm stack and
11050a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor**                  profiles. If your OS has different memory pools, you
1106b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman**                  can tell GKI the pool to use by calling this function.
110708a53269b1f8241e2e6797e845abbe640fb18253Peter Collingbourne**
11089c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump*******************************************************************************/
110984bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbournevoid GKI_register_mempool (void *p_mem)
111092f5822df6a0d7571df44b5d279ed4f017fbb0e6Anders Carlsson{
1111a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor    gki_cb.com.p_user_mempool = p_mem;
1112cfe9af250f466e7e38becea4428990448ae07737Roman Divacky
1113f85e193739c953358c865005855253af4f68a497John McCall    return;
1114f85e193739c953358c865005855253af4f68a497John McCall}
11158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
11160a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor/*******************************************************************************
11170a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor**
111814f79002e58556798e86168c63e48d533287eda5Douglas Gregor** Function         GKI_os_malloc
11194fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11204fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Description      This function allocates memory
11214fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11224fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Parameters:      size -  (input) The size of the memory that has to be
11234fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**                  allocated
11243397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl**
11254fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Returns          the address of the memory allocated, or NULL if failed
11264fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** NOTE             This function is called by the Widcomm stack when
11281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump**                  dynamic memory allocation is used. (see dyn_mem.h)
112974e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner**
113074e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner*******************************************************************************/
11314fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorvoid *GKI_os_malloc (UINT32 size)
11324fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor{
11332596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar    return (malloc(size));
11344fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor}
11351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/*******************************************************************************
11374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Function         GKI_os_free
11394fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Description      This function frees memory
114174e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner**
11424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Parameters:      size -  (input) The address of the memory that has to be
11434fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**                  freed
11444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump** Returns          void
11464fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11474fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** NOTE             This function is NOT called by the Widcomm stack and
11484fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**                  profiles. It is only called from within GKI if dynamic
11491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump**
115074e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner*******************************************************************************/
11514fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorvoid GKI_os_free (void *p_mem)
11524fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor{
11534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    if(p_mem != NULL)
11541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump		free(p_mem);
115574e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner    return;
115674e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner}
115774e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner
115874e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner
115974e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner/*******************************************************************************
11604fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11614fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Function         GKI_suspend_task()
11624fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11634fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Description      This function suspends the task specified in the argument.
11644fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11654fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Parameters:      task_id  - (input) the id of the task that has to suspended
11663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl**
1167a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl** Returns          GKI_SUCCESS if all OK, else GKI_FAILURE
11684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11694fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** NOTE             This function is NOT called by the Widcomm stack and
11703397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl**                  profiles. If you want to implement task suspension capability,
11714fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**                  put specific code here.
11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump**
11734fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor*******************************************************************************/
1174e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas GregorUINT8 GKI_suspend_task (UINT8 task_id)
1175e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor{
1176e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    GKI_TRACE_1("GKI_suspend_task %d - NOT implemented", task_id);
1177e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
11781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11794fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    GKI_TRACE_1("GKI_suspend_task %d done", task_id);
11801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11814fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    return (GKI_SUCCESS);
11824fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor}
11834fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11844fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11854fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor/*******************************************************************************
11864fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11874fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Function         GKI_resume_task()
11884fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11894fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Description      This function resumes the task specified in the argument.
11904fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11914fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Parameters:      task_id  - (input) the id of the task that has to resumed
11928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl**
11934fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** Returns          GKI_SUCCESS if all OK
11944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor** NOTE             This function is NOT called by the Widcomm stack and
11964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**                  profiles. If you want to implement task suspension capability,
11974fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**                  put specific code here.
11984fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor**
11994fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor*******************************************************************************/
12008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlUINT8 GKI_resume_task (UINT8 task_id)
12014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor{
12024fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    GKI_TRACE_1("GKI_resume_task %d - NOT implemented", task_id);
1203ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar
12044fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
12054fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    GKI_TRACE_1("GKI_resume_task %d done", task_id);
12064fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
120714f79002e58556798e86168c63e48d533287eda5Douglas Gregor    return (GKI_SUCCESS);
120814f79002e58556798e86168c63e48d533287eda5Douglas Gregor}
120914f79002e58556798e86168c63e48d533287eda5Douglas Gregor
121014f79002e58556798e86168c63e48d533287eda5Douglas Gregor
121114f79002e58556798e86168c63e48d533287eda5Douglas Gregor/*******************************************************************************
1212c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor**
121314f79002e58556798e86168c63e48d533287eda5Douglas Gregor** Function         GKI_exit_task
121414f79002e58556798e86168c63e48d533287eda5Douglas Gregor**
12158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl** Description      This function is called to stop a GKI task.
121614f79002e58556798e86168c63e48d533287eda5Douglas Gregor**
121714f79002e58556798e86168c63e48d533287eda5Douglas Gregor** Parameters:      task_id  - (input) the id of the task that has to be stopped
121814f79002e58556798e86168c63e48d533287eda5Douglas Gregor**
121914f79002e58556798e86168c63e48d533287eda5Douglas Gregor** Returns          void
12202d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor**
12212d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor** NOTE             This function is NOT called by the Widcomm stack and
12222d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor**                  profiles. If you want to use it in your own implementation,
122314f79002e58556798e86168c63e48d533287eda5Douglas Gregor**                  put specific code here to kill a task.
1224c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor**
122514f79002e58556798e86168c63e48d533287eda5Douglas Gregor*******************************************************************************/
122614f79002e58556798e86168c63e48d533287eda5Douglas Gregorvoid GKI_exit_task (UINT8 task_id)
122714f79002e58556798e86168c63e48d533287eda5Douglas Gregor{
122814f79002e58556798e86168c63e48d533287eda5Douglas Gregor    GKI_disable();
1229c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor    gki_cb.com.OSRdyTbl[task_id] = TASK_DEAD;
123014f79002e58556798e86168c63e48d533287eda5Douglas Gregor
123114f79002e58556798e86168c63e48d533287eda5Douglas Gregor    /* Destroy mutex and condition variable objects */
12328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    pthread_mutex_destroy(&gki_cb.os.thread_evt_mutex[task_id]);
123314f79002e58556798e86168c63e48d533287eda5Douglas Gregor    pthread_cond_destroy (&gki_cb.os.thread_evt_cond[task_id]);
123414f79002e58556798e86168c63e48d533287eda5Douglas Gregor    pthread_mutex_destroy(&gki_cb.os.thread_timeout_mutex[task_id]);
123514f79002e58556798e86168c63e48d533287eda5Douglas Gregor    pthread_cond_destroy (&gki_cb.os.thread_timeout_cond[task_id]);
123614f79002e58556798e86168c63e48d533287eda5Douglas Gregor
123714f79002e58556798e86168c63e48d533287eda5Douglas Gregor    GKI_enable();
1238c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
123914f79002e58556798e86168c63e48d533287eda5Douglas Gregor	//GKI_send_event(task_id, EVENT_MASK(GKI_SHUTDOWN_EVT));
124014f79002e58556798e86168c63e48d533287eda5Douglas Gregor
124114f79002e58556798e86168c63e48d533287eda5Douglas Gregor    GKI_TRACE_1("GKI_exit_task %d done", task_id);
124214f79002e58556798e86168c63e48d533287eda5Douglas Gregor    return;
1243c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor}
124414f79002e58556798e86168c63e48d533287eda5Douglas Gregor
124514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
12468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/*******************************************************************************
124714f79002e58556798e86168c63e48d533287eda5Douglas Gregor**
1248c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor** Function         GKI_sched_lock
124914f79002e58556798e86168c63e48d533287eda5Douglas Gregor**
125014f79002e58556798e86168c63e48d533287eda5Douglas Gregor** Description      This function is called by tasks to disable scheduler
125114f79002e58556798e86168c63e48d533287eda5Douglas Gregor**                  task context switching.
125214f79002e58556798e86168c63e48d533287eda5Douglas Gregor**
1253c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor** Returns          void
125414f79002e58556798e86168c63e48d533287eda5Douglas Gregor**
125514f79002e58556798e86168c63e48d533287eda5Douglas Gregor** NOTE             This function is NOT called by the Widcomm stack and
12568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl**                  profiles. If you want to use it in your own implementation,
125714f79002e58556798e86168c63e48d533287eda5Douglas Gregor**                  put code here to tell the OS to disable context switching.
125814f79002e58556798e86168c63e48d533287eda5Douglas Gregor**
125914f79002e58556798e86168c63e48d533287eda5Douglas Gregor*******************************************************************************/
126014f79002e58556798e86168c63e48d533287eda5Douglas Gregorvoid GKI_sched_lock(void)
1261f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor{
1262c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor    GKI_TRACE_0("GKI_sched_lock");
126314f79002e58556798e86168c63e48d533287eda5Douglas Gregor    GKI_disable ();
126414f79002e58556798e86168c63e48d533287eda5Douglas Gregor    return;
1265cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1266cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1267cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1268cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/*******************************************************************************
1269cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**
1270cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor** Function         GKI_sched_unlock
1271cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**
1272cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor** Description      This function is called by tasks to enable scheduler switching.
1273cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**
1274cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor** Returns          void
1275cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**
1276cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor** NOTE             This function is NOT called by the Widcomm stack and
1277cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**                  profiles. If you want to use it in your own implementation,
1278cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**                  put code here to tell the OS to re-enable context switching.
1279cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**
1280cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor*******************************************************************************/
1281cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregorvoid GKI_sched_unlock(void)
1282cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor{
1283cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    GKI_TRACE_0("GKI_sched_unlock");
1284cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    GKI_enable ();
1285cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1286cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1287cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/*******************************************************************************
1288cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**
1289cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor** Function         GKI_shiftdown
1290cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**
1291cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor** Description      shift memory down (to make space to insert a record)
1292cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**
1293cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor*******************************************************************************/
1294cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregorvoid GKI_shiftdown (UINT8 *p_mem, UINT32 len, UINT32 shift_amount)
1295cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor{
1296cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    register UINT8 *ps = p_mem + len - 1;
1297cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    register UINT8 *pd = ps + shift_amount;
1298cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    register UINT32 xx;
1299cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1300cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    for (xx = 0; xx < len; xx++)
1301cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor        *pd-- = *ps--;
1302cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1303cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1304cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/*******************************************************************************
1305cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**
1306cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor** Function         GKI_shiftup
1307cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor**
1308dd3e5549e3c11e217078938aacf72f042eea5343Douglas Gregor** Description      shift memory up (to delete a record)
1309dd3e5549e3c11e217078938aacf72f042eea5343Douglas Gregor**
1310cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor*******************************************************************************/
1311cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregorvoid GKI_shiftup (UINT8 *p_dest, UINT8 *p_src, UINT32 len)
1312cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor{
1313cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    register UINT8 *ps = p_src;
1314cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    register UINT8 *pd = p_dest;
1315cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    register UINT32 xx;
1316cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1317cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    for (xx = 0; xx < len; xx++)
1318cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor        *pd++ = *ps++;
1319cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1320cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1321cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1322cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor