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, ¶m)==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, ¶m); 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