xref: /aosp_15_r20/system/nfc/src/gki/common/gki_time.cc (revision 7eba2f3b06c51ae21384f6a4f14577b668a869b3)
1*7eba2f3bSAndroid Build Coastguard Worker /******************************************************************************
2*7eba2f3bSAndroid Build Coastguard Worker  *
3*7eba2f3bSAndroid Build Coastguard Worker  *  Copyright (C) 1999-2012 Broadcom Corporation
4*7eba2f3bSAndroid Build Coastguard Worker  *
5*7eba2f3bSAndroid Build Coastguard Worker  *  Licensed under the Apache License, Version 2.0 (the "License");
6*7eba2f3bSAndroid Build Coastguard Worker  *  you may not use this file except in compliance with the License.
7*7eba2f3bSAndroid Build Coastguard Worker  *  You may obtain a copy of the License at:
8*7eba2f3bSAndroid Build Coastguard Worker  *
9*7eba2f3bSAndroid Build Coastguard Worker  *  http://www.apache.org/licenses/LICENSE-2.0
10*7eba2f3bSAndroid Build Coastguard Worker  *
11*7eba2f3bSAndroid Build Coastguard Worker  *  Unless required by applicable law or agreed to in writing, software
12*7eba2f3bSAndroid Build Coastguard Worker  *  distributed under the License is distributed on an "AS IS" BASIS,
13*7eba2f3bSAndroid Build Coastguard Worker  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*7eba2f3bSAndroid Build Coastguard Worker  *  See the License for the specific language governing permissions and
15*7eba2f3bSAndroid Build Coastguard Worker  *  limitations under the License.
16*7eba2f3bSAndroid Build Coastguard Worker  *
17*7eba2f3bSAndroid Build Coastguard Worker  ******************************************************************************/
18*7eba2f3bSAndroid Build Coastguard Worker #include <android-base/logging.h>
19*7eba2f3bSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
20*7eba2f3bSAndroid Build Coastguard Worker 
21*7eba2f3bSAndroid Build Coastguard Worker #include "gki_int.h"
22*7eba2f3bSAndroid Build Coastguard Worker 
23*7eba2f3bSAndroid Build Coastguard Worker /* Make sure that this has been defined in target.h */
24*7eba2f3bSAndroid Build Coastguard Worker #ifndef GKI_NUM_TIMERS
25*7eba2f3bSAndroid Build Coastguard Worker #error NO TIMERS: Must define at least 1 timer in the system!
26*7eba2f3bSAndroid Build Coastguard Worker #endif
27*7eba2f3bSAndroid Build Coastguard Worker 
28*7eba2f3bSAndroid Build Coastguard Worker /* Largest signed positive timer count */
29*7eba2f3bSAndroid Build Coastguard Worker #define GKI_NO_NEW_TMRS_STARTED (0x7fffffffL)
30*7eba2f3bSAndroid Build Coastguard Worker /* Marks an unused timer list entry (initial value) */
31*7eba2f3bSAndroid Build Coastguard Worker #define GKI_UNUSED_LIST_ENTRY (0x80000000L)
32*7eba2f3bSAndroid Build Coastguard Worker #define GKI_MAX_INT32 (0x7fffffffL)
33*7eba2f3bSAndroid Build Coastguard Worker 
34*7eba2f3bSAndroid Build Coastguard Worker using android::base::StringPrintf;
35*7eba2f3bSAndroid Build Coastguard Worker 
36*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
37*7eba2f3bSAndroid Build Coastguard Worker **
38*7eba2f3bSAndroid Build Coastguard Worker ** Function         gki_timers_init
39*7eba2f3bSAndroid Build Coastguard Worker **
40*7eba2f3bSAndroid Build Coastguard Worker ** Description      This internal function is called once at startup to
41*7eba2f3bSAndroid Build Coastguard Worker **                  initialize all the timer structures.
42*7eba2f3bSAndroid Build Coastguard Worker **
43*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
44*7eba2f3bSAndroid Build Coastguard Worker **
45*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
gki_timers_init(void)46*7eba2f3bSAndroid Build Coastguard Worker void gki_timers_init(void) {
47*7eba2f3bSAndroid Build Coastguard Worker   uint8_t tt;
48*7eba2f3bSAndroid Build Coastguard Worker 
49*7eba2f3bSAndroid Build Coastguard Worker   gki_cb.com.OSTicksTilExp =
50*7eba2f3bSAndroid Build Coastguard Worker       0; /* Remaining time (of OSTimeCurTimeout) before next timer expires */
51*7eba2f3bSAndroid Build Coastguard Worker   gki_cb.com.OSNumOrigTicks = 0;
52*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_DELAY_STOP_SYS_TICK > 0)
53*7eba2f3bSAndroid Build Coastguard Worker   gki_cb.com.OSTicksTilStop = 0; /* clear inactivity delay timer */
54*7eba2f3bSAndroid Build Coastguard Worker #endif
55*7eba2f3bSAndroid Build Coastguard Worker 
56*7eba2f3bSAndroid Build Coastguard Worker   for (tt = 0; tt < GKI_MAX_TASKS; tt++) {
57*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSWaitTmr[tt] = 0;
58*7eba2f3bSAndroid Build Coastguard Worker 
59*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 0)
60*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSTaskTmr0[tt] = 0;
61*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSTaskTmr0R[tt] = 0;
62*7eba2f3bSAndroid Build Coastguard Worker #endif
63*7eba2f3bSAndroid Build Coastguard Worker 
64*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 1)
65*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSTaskTmr1[tt] = 0;
66*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSTaskTmr1R[tt] = 0;
67*7eba2f3bSAndroid Build Coastguard Worker #endif
68*7eba2f3bSAndroid Build Coastguard Worker 
69*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 2)
70*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSTaskTmr2[tt] = 0;
71*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSTaskTmr2R[tt] = 0;
72*7eba2f3bSAndroid Build Coastguard Worker #endif
73*7eba2f3bSAndroid Build Coastguard Worker 
74*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 3)
75*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSTaskTmr3[tt] = 0;
76*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSTaskTmr3R[tt] = 0;
77*7eba2f3bSAndroid Build Coastguard Worker #endif
78*7eba2f3bSAndroid Build Coastguard Worker   }
79*7eba2f3bSAndroid Build Coastguard Worker 
80*7eba2f3bSAndroid Build Coastguard Worker   for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++) {
81*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.timer_queues[tt] = nullptr;
82*7eba2f3bSAndroid Build Coastguard Worker   }
83*7eba2f3bSAndroid Build Coastguard Worker 
84*7eba2f3bSAndroid Build Coastguard Worker   gki_cb.com.p_tick_cb = nullptr;
85*7eba2f3bSAndroid Build Coastguard Worker   gki_cb.com.system_tick_running = false;
86*7eba2f3bSAndroid Build Coastguard Worker 
87*7eba2f3bSAndroid Build Coastguard Worker   return;
88*7eba2f3bSAndroid Build Coastguard Worker }
89*7eba2f3bSAndroid Build Coastguard Worker 
90*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
91*7eba2f3bSAndroid Build Coastguard Worker **
92*7eba2f3bSAndroid Build Coastguard Worker ** Function         gki_timers_is_timer_running
93*7eba2f3bSAndroid Build Coastguard Worker **
94*7eba2f3bSAndroid Build Coastguard Worker ** Description      This internal function is called to test if any gki timer
95*7eba2f3bSAndroid Build Coastguard Worker **                  are running
96*7eba2f3bSAndroid Build Coastguard Worker **
97*7eba2f3bSAndroid Build Coastguard Worker **
98*7eba2f3bSAndroid Build Coastguard Worker ** Returns          TRUE if at least one time is running in the system, FALSE
99*7eba2f3bSAndroid Build Coastguard Worker **                  else.
100*7eba2f3bSAndroid Build Coastguard Worker **
101*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
gki_timers_is_timer_running(void)102*7eba2f3bSAndroid Build Coastguard Worker bool gki_timers_is_timer_running(void) {
103*7eba2f3bSAndroid Build Coastguard Worker   uint8_t tt;
104*7eba2f3bSAndroid Build Coastguard Worker   for (tt = 0; tt < GKI_MAX_TASKS; tt++) {
105*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 0)
106*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr0[tt]) {
107*7eba2f3bSAndroid Build Coastguard Worker       return true;
108*7eba2f3bSAndroid Build Coastguard Worker     }
109*7eba2f3bSAndroid Build Coastguard Worker #endif
110*7eba2f3bSAndroid Build Coastguard Worker 
111*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 1)
112*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr1[tt]) {
113*7eba2f3bSAndroid Build Coastguard Worker       return true;
114*7eba2f3bSAndroid Build Coastguard Worker     }
115*7eba2f3bSAndroid Build Coastguard Worker #endif
116*7eba2f3bSAndroid Build Coastguard Worker 
117*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 2)
118*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr2[tt]) {
119*7eba2f3bSAndroid Build Coastguard Worker       return true;
120*7eba2f3bSAndroid Build Coastguard Worker     }
121*7eba2f3bSAndroid Build Coastguard Worker #endif
122*7eba2f3bSAndroid Build Coastguard Worker 
123*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 3)
124*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr3[tt]) {
125*7eba2f3bSAndroid Build Coastguard Worker       return true;
126*7eba2f3bSAndroid Build Coastguard Worker     }
127*7eba2f3bSAndroid Build Coastguard Worker #endif
128*7eba2f3bSAndroid Build Coastguard Worker   }
129*7eba2f3bSAndroid Build Coastguard Worker 
130*7eba2f3bSAndroid Build Coastguard Worker   return false;
131*7eba2f3bSAndroid Build Coastguard Worker }
132*7eba2f3bSAndroid Build Coastguard Worker 
133*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
134*7eba2f3bSAndroid Build Coastguard Worker **
135*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_get_tick_count
136*7eba2f3bSAndroid Build Coastguard Worker **
137*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function returns the current system ticks
138*7eba2f3bSAndroid Build Coastguard Worker **
139*7eba2f3bSAndroid Build Coastguard Worker ** Returns          The current number of system ticks
140*7eba2f3bSAndroid Build Coastguard Worker **
141*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_get_tick_count(void)142*7eba2f3bSAndroid Build Coastguard Worker uint32_t GKI_get_tick_count(void) { return gki_cb.com.OSTicks; }
143*7eba2f3bSAndroid Build Coastguard Worker 
144*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
145*7eba2f3bSAndroid Build Coastguard Worker **
146*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_ready_to_sleep
147*7eba2f3bSAndroid Build Coastguard Worker **
148*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function returns the number of system ticks until the
149*7eba2f3bSAndroid Build Coastguard Worker **                  next timer will expire.  It is typically called by a power
150*7eba2f3bSAndroid Build Coastguard Worker **                  savings manager to find out how long it can have the system
151*7eba2f3bSAndroid Build Coastguard Worker **                  sleep before it needs to service the next entry.
152*7eba2f3bSAndroid Build Coastguard Worker **
153*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      None
154*7eba2f3bSAndroid Build Coastguard Worker **
155*7eba2f3bSAndroid Build Coastguard Worker ** Returns          Number of ticks til the next timer expires
156*7eba2f3bSAndroid Build Coastguard Worker **                  Note: The value is a signed  value.  This value should be
157*7eba2f3bSAndroid Build Coastguard Worker **                      compared to x > 0, to avoid misinterpreting negative
158*7eba2f3bSAndroid Build Coastguard Worker **                      tick values.
159*7eba2f3bSAndroid Build Coastguard Worker **
160*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_ready_to_sleep(void)161*7eba2f3bSAndroid Build Coastguard Worker int32_t GKI_ready_to_sleep(void) { return (gki_cb.com.OSTicksTilExp); }
162*7eba2f3bSAndroid Build Coastguard Worker 
163*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
164*7eba2f3bSAndroid Build Coastguard Worker **
165*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_start_timer
166*7eba2f3bSAndroid Build Coastguard Worker **
167*7eba2f3bSAndroid Build Coastguard Worker ** Description      An application can call this function to start one of
168*7eba2f3bSAndroid Build Coastguard Worker **                  it's four general purpose timers. Any of the four timers
169*7eba2f3bSAndroid Build Coastguard Worker **                  can be 1-shot or continuous. If a timer is already running,
170*7eba2f3bSAndroid Build Coastguard Worker **                  it will be reset to the new parameters.
171*7eba2f3bSAndroid Build Coastguard Worker **
172*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       tnum            - (input) timer number to be started
173*7eba2f3bSAndroid Build Coastguard Worker **                                            (TIMER_0, TIMER_1, TIMER_2, or
174*7eba2f3bSAndroid Build Coastguard Worker **                                            TIMER_3)
175*7eba2f3bSAndroid Build Coastguard Worker **                  ticks           - (input) the number of system ticks til the
176*7eba2f3bSAndroid Build Coastguard Worker **                                            timer expires.
177*7eba2f3bSAndroid Build Coastguard Worker **                  is_continuous   - (input) TRUE if timer restarts
178*7eba2f3bSAndroid Build Coastguard Worker **                                            automatically, else FALSE if it is
179*7eba2f3bSAndroid Build Coastguard Worker **                                            a 'one-shot'.
180*7eba2f3bSAndroid Build Coastguard Worker **
181*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
182*7eba2f3bSAndroid Build Coastguard Worker **
183*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_start_timer(uint8_t tnum,int32_t ticks,bool is_continuous)184*7eba2f3bSAndroid Build Coastguard Worker void GKI_start_timer(uint8_t tnum, int32_t ticks, bool is_continuous) {
185*7eba2f3bSAndroid Build Coastguard Worker   int32_t reload;
186*7eba2f3bSAndroid Build Coastguard Worker   int32_t orig_ticks;
187*7eba2f3bSAndroid Build Coastguard Worker   uint8_t task_id = GKI_get_taskid();
188*7eba2f3bSAndroid Build Coastguard Worker   bool bad_timer = false;
189*7eba2f3bSAndroid Build Coastguard Worker 
190*7eba2f3bSAndroid Build Coastguard Worker   if (task_id >= GKI_MAX_TASKS) {
191*7eba2f3bSAndroid Build Coastguard Worker     LOG(ERROR) << StringPrintf("%s: invalid task_id:0x%02x. start timer failed",
192*7eba2f3bSAndroid Build Coastguard Worker                                __func__, task_id);
193*7eba2f3bSAndroid Build Coastguard Worker     return;
194*7eba2f3bSAndroid Build Coastguard Worker   }
195*7eba2f3bSAndroid Build Coastguard Worker 
196*7eba2f3bSAndroid Build Coastguard Worker   if (ticks <= 0) ticks = 1;
197*7eba2f3bSAndroid Build Coastguard Worker 
198*7eba2f3bSAndroid Build Coastguard Worker   orig_ticks = ticks; /* save the ticks in case adjustment is necessary */
199*7eba2f3bSAndroid Build Coastguard Worker 
200*7eba2f3bSAndroid Build Coastguard Worker   /* If continuous timer, set reload, else set it to 0 */
201*7eba2f3bSAndroid Build Coastguard Worker   if (is_continuous)
202*7eba2f3bSAndroid Build Coastguard Worker     reload = ticks;
203*7eba2f3bSAndroid Build Coastguard Worker   else
204*7eba2f3bSAndroid Build Coastguard Worker     reload = 0;
205*7eba2f3bSAndroid Build Coastguard Worker 
206*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
207*7eba2f3bSAndroid Build Coastguard Worker 
208*7eba2f3bSAndroid Build Coastguard Worker   if (gki_timers_is_timer_running() == false) {
209*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_DELAY_STOP_SYS_TICK > 0)
210*7eba2f3bSAndroid Build Coastguard Worker     /* if inactivity delay timer is not running, start system tick */
211*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTicksTilStop == 0) {
212*7eba2f3bSAndroid Build Coastguard Worker #endif
213*7eba2f3bSAndroid Build Coastguard Worker       if (gki_cb.com.p_tick_cb) {
214*7eba2f3bSAndroid Build Coastguard Worker         /* start system tick */
215*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.system_tick_running = true;
216*7eba2f3bSAndroid Build Coastguard Worker         (gki_cb.com.p_tick_cb)(true);
217*7eba2f3bSAndroid Build Coastguard Worker       }
218*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_DELAY_STOP_SYS_TICK > 0)
219*7eba2f3bSAndroid Build Coastguard Worker     } else {
220*7eba2f3bSAndroid Build Coastguard Worker       /* clear inactivity delay timer */
221*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTicksTilStop = 0;
222*7eba2f3bSAndroid Build Coastguard Worker     }
223*7eba2f3bSAndroid Build Coastguard Worker #endif
224*7eba2f3bSAndroid Build Coastguard Worker   }
225*7eba2f3bSAndroid Build Coastguard Worker   /* Add the time since the last task timer update.
226*7eba2f3bSAndroid Build Coastguard Worker   ** Note that this works when no timers are active since
227*7eba2f3bSAndroid Build Coastguard Worker   ** both OSNumOrigTicks and OSTicksTilExp are 0.
228*7eba2f3bSAndroid Build Coastguard Worker   */
229*7eba2f3bSAndroid Build Coastguard Worker   if (GKI_MAX_INT32 - (gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp) >
230*7eba2f3bSAndroid Build Coastguard Worker       ticks) {
231*7eba2f3bSAndroid Build Coastguard Worker     ticks += gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp;
232*7eba2f3bSAndroid Build Coastguard Worker   } else
233*7eba2f3bSAndroid Build Coastguard Worker     ticks = GKI_MAX_INT32;
234*7eba2f3bSAndroid Build Coastguard Worker 
235*7eba2f3bSAndroid Build Coastguard Worker   switch (tnum) {
236*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 0)
237*7eba2f3bSAndroid Build Coastguard Worker     case TIMER_0:
238*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr0R[task_id] = reload;
239*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr0[task_id] = ticks;
240*7eba2f3bSAndroid Build Coastguard Worker       break;
241*7eba2f3bSAndroid Build Coastguard Worker #endif
242*7eba2f3bSAndroid Build Coastguard Worker 
243*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 1)
244*7eba2f3bSAndroid Build Coastguard Worker     case TIMER_1:
245*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr1R[task_id] = reload;
246*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr1[task_id] = ticks;
247*7eba2f3bSAndroid Build Coastguard Worker       break;
248*7eba2f3bSAndroid Build Coastguard Worker #endif
249*7eba2f3bSAndroid Build Coastguard Worker 
250*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 2)
251*7eba2f3bSAndroid Build Coastguard Worker     case TIMER_2:
252*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr2R[task_id] = reload;
253*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr2[task_id] = ticks;
254*7eba2f3bSAndroid Build Coastguard Worker       break;
255*7eba2f3bSAndroid Build Coastguard Worker #endif
256*7eba2f3bSAndroid Build Coastguard Worker 
257*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 3)
258*7eba2f3bSAndroid Build Coastguard Worker     case TIMER_3:
259*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr3R[task_id] = reload;
260*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr3[task_id] = ticks;
261*7eba2f3bSAndroid Build Coastguard Worker       break;
262*7eba2f3bSAndroid Build Coastguard Worker #endif
263*7eba2f3bSAndroid Build Coastguard Worker     default:
264*7eba2f3bSAndroid Build Coastguard Worker       bad_timer = true; /* Timer number is bad, so do not use */
265*7eba2f3bSAndroid Build Coastguard Worker   }
266*7eba2f3bSAndroid Build Coastguard Worker 
267*7eba2f3bSAndroid Build Coastguard Worker   /* Update the expiration timeout if a legitimate timer */
268*7eba2f3bSAndroid Build Coastguard Worker   if (!bad_timer) {
269*7eba2f3bSAndroid Build Coastguard Worker     /* Only update the timeout value if it is less than any other newly started
270*7eba2f3bSAndroid Build Coastguard Worker      * timers */
271*7eba2f3bSAndroid Build Coastguard Worker     gki_adjust_timer_count(orig_ticks);
272*7eba2f3bSAndroid Build Coastguard Worker   }
273*7eba2f3bSAndroid Build Coastguard Worker 
274*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
275*7eba2f3bSAndroid Build Coastguard Worker }
276*7eba2f3bSAndroid Build Coastguard Worker 
277*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
278*7eba2f3bSAndroid Build Coastguard Worker **
279*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_stop_timer
280*7eba2f3bSAndroid Build Coastguard Worker **
281*7eba2f3bSAndroid Build Coastguard Worker ** Description      An application can call this function to stop one of
282*7eba2f3bSAndroid Build Coastguard Worker **                  it's four general purpose timers. There is no harm in
283*7eba2f3bSAndroid Build Coastguard Worker **                  stopping a timer that is already stopped.
284*7eba2f3bSAndroid Build Coastguard Worker **
285*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       tnum - (input) timer number to be started (TIMER_0,
286*7eba2f3bSAndroid Build Coastguard Worker **                                 TIMER_1, TIMER_2, or TIMER_3)
287*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
288*7eba2f3bSAndroid Build Coastguard Worker **
289*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_stop_timer(uint8_t tnum)290*7eba2f3bSAndroid Build Coastguard Worker void GKI_stop_timer(uint8_t tnum) {
291*7eba2f3bSAndroid Build Coastguard Worker   uint8_t task_id = GKI_get_taskid();
292*7eba2f3bSAndroid Build Coastguard Worker 
293*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
294*7eba2f3bSAndroid Build Coastguard Worker   if (task_id < GKI_MAX_TASKS) {
295*7eba2f3bSAndroid Build Coastguard Worker     switch (tnum) {
296*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 0)
297*7eba2f3bSAndroid Build Coastguard Worker       case TIMER_0:
298*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr0R[task_id] = 0;
299*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr0[task_id] = 0;
300*7eba2f3bSAndroid Build Coastguard Worker         break;
301*7eba2f3bSAndroid Build Coastguard Worker #endif
302*7eba2f3bSAndroid Build Coastguard Worker 
303*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 1)
304*7eba2f3bSAndroid Build Coastguard Worker       case TIMER_1:
305*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr1R[task_id] = 0;
306*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr1[task_id] = 0;
307*7eba2f3bSAndroid Build Coastguard Worker         break;
308*7eba2f3bSAndroid Build Coastguard Worker #endif
309*7eba2f3bSAndroid Build Coastguard Worker 
310*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 2)
311*7eba2f3bSAndroid Build Coastguard Worker       case TIMER_2:
312*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr2R[task_id] = 0;
313*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr2[task_id] = 0;
314*7eba2f3bSAndroid Build Coastguard Worker         break;
315*7eba2f3bSAndroid Build Coastguard Worker #endif
316*7eba2f3bSAndroid Build Coastguard Worker 
317*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 3)
318*7eba2f3bSAndroid Build Coastguard Worker       case TIMER_3:
319*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr3R[task_id] = 0;
320*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr3[task_id] = 0;
321*7eba2f3bSAndroid Build Coastguard Worker         break;
322*7eba2f3bSAndroid Build Coastguard Worker #endif
323*7eba2f3bSAndroid Build Coastguard Worker     }
324*7eba2f3bSAndroid Build Coastguard Worker   }
325*7eba2f3bSAndroid Build Coastguard Worker 
326*7eba2f3bSAndroid Build Coastguard Worker   if (gki_timers_is_timer_running() == false) {
327*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.p_tick_cb) {
328*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_DELAY_STOP_SYS_TICK > 0)
329*7eba2f3bSAndroid Build Coastguard Worker       /* if inactivity delay timer is not running */
330*7eba2f3bSAndroid Build Coastguard Worker       if ((gki_cb.com.system_tick_running) &&
331*7eba2f3bSAndroid Build Coastguard Worker           (gki_cb.com.OSTicksTilStop == 0)) {
332*7eba2f3bSAndroid Build Coastguard Worker         /* set inactivity delay timer */
333*7eba2f3bSAndroid Build Coastguard Worker         /* when timer expires, system tick will be stopped */
334*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTicksTilStop = GKI_DELAY_STOP_SYS_TICK;
335*7eba2f3bSAndroid Build Coastguard Worker       }
336*7eba2f3bSAndroid Build Coastguard Worker #else
337*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.system_tick_running = false;
338*7eba2f3bSAndroid Build Coastguard Worker       (gki_cb.com.p_tick_cb)(false); /* stop system tick */
339*7eba2f3bSAndroid Build Coastguard Worker #endif
340*7eba2f3bSAndroid Build Coastguard Worker     }
341*7eba2f3bSAndroid Build Coastguard Worker   }
342*7eba2f3bSAndroid Build Coastguard Worker 
343*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
344*7eba2f3bSAndroid Build Coastguard Worker }
345*7eba2f3bSAndroid Build Coastguard Worker 
346*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
347*7eba2f3bSAndroid Build Coastguard Worker **
348*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_timer_update
349*7eba2f3bSAndroid Build Coastguard Worker **
350*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called by an OS to drive the GKI's timers.
351*7eba2f3bSAndroid Build Coastguard Worker **                  It is typically called at every system tick to
352*7eba2f3bSAndroid Build Coastguard Worker **                  update the timers for all tasks, and check for timeouts.
353*7eba2f3bSAndroid Build Coastguard Worker **
354*7eba2f3bSAndroid Build Coastguard Worker **                  Note: It has been designed to also allow for variable tick
355*7eba2f3bSAndroid Build Coastguard Worker **                        updates so that systems with strict power savings
356*7eba2f3bSAndroid Build Coastguard Worker **                        requirements can have the update occur at variable
357*7eba2f3bSAndroid Build Coastguard Worker **                        intervals.
358*7eba2f3bSAndroid Build Coastguard Worker **
359*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      ticks_since_last_update - (input) This is the number of
360*7eba2f3bSAndroid Build Coastguard Worker **                  TICKS that have occurred since the last time
361*7eba2f3bSAndroid Build Coastguard Worker **                  GKI_timer_update was called.
362*7eba2f3bSAndroid Build Coastguard Worker **
363*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
364*7eba2f3bSAndroid Build Coastguard Worker **
365*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_timer_update(int32_t ticks_since_last_update)366*7eba2f3bSAndroid Build Coastguard Worker void GKI_timer_update(int32_t ticks_since_last_update) {
367*7eba2f3bSAndroid Build Coastguard Worker   uint8_t task_id;
368*7eba2f3bSAndroid Build Coastguard Worker   long next_expiration; /* Holds the next soonest expiration time after this
369*7eba2f3bSAndroid Build Coastguard Worker                            update */
370*7eba2f3bSAndroid Build Coastguard Worker 
371*7eba2f3bSAndroid Build Coastguard Worker   /* Increment the number of ticks used for time stamps */
372*7eba2f3bSAndroid Build Coastguard Worker   gki_cb.com.OSTicks += ticks_since_last_update;
373*7eba2f3bSAndroid Build Coastguard Worker 
374*7eba2f3bSAndroid Build Coastguard Worker   /* If any timers are running in any tasks, decrement the remaining time til
375*7eba2f3bSAndroid Build Coastguard Worker    * the timer updates need to take place (next expiration occurs)
376*7eba2f3bSAndroid Build Coastguard Worker    */
377*7eba2f3bSAndroid Build Coastguard Worker   gki_cb.com.OSTicksTilExp -= ticks_since_last_update;
378*7eba2f3bSAndroid Build Coastguard Worker 
379*7eba2f3bSAndroid Build Coastguard Worker   /* Don't allow timer interrupt nesting */
380*7eba2f3bSAndroid Build Coastguard Worker   if (gki_cb.com.timer_nesting) return;
381*7eba2f3bSAndroid Build Coastguard Worker 
382*7eba2f3bSAndroid Build Coastguard Worker   gki_cb.com.timer_nesting = 1;
383*7eba2f3bSAndroid Build Coastguard Worker 
384*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_DELAY_STOP_SYS_TICK > 0)
385*7eba2f3bSAndroid Build Coastguard Worker   /* if inactivity delay timer is set and expired */
386*7eba2f3bSAndroid Build Coastguard Worker   if (gki_cb.com.OSTicksTilStop) {
387*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTicksTilStop <= (uint32_t)ticks_since_last_update) {
388*7eba2f3bSAndroid Build Coastguard Worker       if (gki_cb.com.p_tick_cb) {
389*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.system_tick_running = false;
390*7eba2f3bSAndroid Build Coastguard Worker         (gki_cb.com.p_tick_cb)(false); /* stop system tick */
391*7eba2f3bSAndroid Build Coastguard Worker       }
392*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTicksTilStop = 0; /* clear inactivity delay timer */
393*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.timer_nesting = 0;
394*7eba2f3bSAndroid Build Coastguard Worker       return;
395*7eba2f3bSAndroid Build Coastguard Worker     } else
396*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTicksTilStop -= ticks_since_last_update;
397*7eba2f3bSAndroid Build Coastguard Worker   }
398*7eba2f3bSAndroid Build Coastguard Worker #endif
399*7eba2f3bSAndroid Build Coastguard Worker 
400*7eba2f3bSAndroid Build Coastguard Worker   /* No need to update the ticks if no timeout has occurred */
401*7eba2f3bSAndroid Build Coastguard Worker   if (gki_cb.com.OSTicksTilExp > 0) {
402*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.timer_nesting = 0;
403*7eba2f3bSAndroid Build Coastguard Worker     return;
404*7eba2f3bSAndroid Build Coastguard Worker   }
405*7eba2f3bSAndroid Build Coastguard Worker 
406*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
407*7eba2f3bSAndroid Build Coastguard Worker 
408*7eba2f3bSAndroid Build Coastguard Worker   next_expiration = GKI_NO_NEW_TMRS_STARTED;
409*7eba2f3bSAndroid Build Coastguard Worker 
410*7eba2f3bSAndroid Build Coastguard Worker   /* If here then gki_cb.com.OSTicksTilExp <= 0. If negative, then increase
411*7eba2f3bSAndroid Build Coastguard Worker      gki_cb.com.OSNumOrigTicks
412*7eba2f3bSAndroid Build Coastguard Worker      to account for the difference so timer updates below are decremented by the
413*7eba2f3bSAndroid Build Coastguard Worker      full number
414*7eba2f3bSAndroid Build Coastguard Worker      of ticks. gki_cb.com.OSNumOrigTicks is reset at the bottom of this function
415*7eba2f3bSAndroid Build Coastguard Worker      so changing this
416*7eba2f3bSAndroid Build Coastguard Worker      value only affects the timer updates below
417*7eba2f3bSAndroid Build Coastguard Worker    */
418*7eba2f3bSAndroid Build Coastguard Worker   gki_cb.com.OSNumOrigTicks -= gki_cb.com.OSTicksTilExp;
419*7eba2f3bSAndroid Build Coastguard Worker 
420*7eba2f3bSAndroid Build Coastguard Worker   /* Check for OS Task Timers */
421*7eba2f3bSAndroid Build Coastguard Worker   for (task_id = 0; task_id < GKI_MAX_TASKS; task_id++) {
422*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSRdyTbl[task_id] == TASK_DEAD) {
423*7eba2f3bSAndroid Build Coastguard Worker       // task is shutdown do not try to service timers
424*7eba2f3bSAndroid Build Coastguard Worker       continue;
425*7eba2f3bSAndroid Build Coastguard Worker     }
426*7eba2f3bSAndroid Build Coastguard Worker 
427*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSWaitTmr[task_id] > 0) /* If timer is running */
428*7eba2f3bSAndroid Build Coastguard Worker     {
429*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSWaitTmr[task_id] -= gki_cb.com.OSNumOrigTicks;
430*7eba2f3bSAndroid Build Coastguard Worker       if (gki_cb.com.OSWaitTmr[task_id] <= 0) {
431*7eba2f3bSAndroid Build Coastguard Worker         /* Timer Expired */
432*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSRdyTbl[task_id] = TASK_READY;
433*7eba2f3bSAndroid Build Coastguard Worker       }
434*7eba2f3bSAndroid Build Coastguard Worker     }
435*7eba2f3bSAndroid Build Coastguard Worker 
436*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 0)
437*7eba2f3bSAndroid Build Coastguard Worker     /* If any timer is running, decrement */
438*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr0[task_id] > 0) {
439*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr0[task_id] -= gki_cb.com.OSNumOrigTicks;
440*7eba2f3bSAndroid Build Coastguard Worker 
441*7eba2f3bSAndroid Build Coastguard Worker       if (gki_cb.com.OSTaskTmr0[task_id] <= 0) {
442*7eba2f3bSAndroid Build Coastguard Worker /* Set Timer 0 Expired event mask and reload timer */
443*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_TIMER_UPDATES_FROM_ISR == TRUE)
444*7eba2f3bSAndroid Build Coastguard Worker         GKI_isend_event(task_id, TIMER_0_EVT_MASK);
445*7eba2f3bSAndroid Build Coastguard Worker #else
446*7eba2f3bSAndroid Build Coastguard Worker         GKI_send_event(task_id, TIMER_0_EVT_MASK);
447*7eba2f3bSAndroid Build Coastguard Worker #endif
448*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr0[task_id] = gki_cb.com.OSTaskTmr0R[task_id];
449*7eba2f3bSAndroid Build Coastguard Worker       }
450*7eba2f3bSAndroid Build Coastguard Worker     }
451*7eba2f3bSAndroid Build Coastguard Worker 
452*7eba2f3bSAndroid Build Coastguard Worker     /* Check to see if this timer is the next one to expire */
453*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr0[task_id] > 0 &&
454*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr0[task_id] < next_expiration)
455*7eba2f3bSAndroid Build Coastguard Worker       next_expiration = gki_cb.com.OSTaskTmr0[task_id];
456*7eba2f3bSAndroid Build Coastguard Worker #endif
457*7eba2f3bSAndroid Build Coastguard Worker 
458*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 1)
459*7eba2f3bSAndroid Build Coastguard Worker     /* If any timer is running, decrement */
460*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr1[task_id] > 0) {
461*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr1[task_id] -= gki_cb.com.OSNumOrigTicks;
462*7eba2f3bSAndroid Build Coastguard Worker 
463*7eba2f3bSAndroid Build Coastguard Worker       if (gki_cb.com.OSTaskTmr1[task_id] <= 0) {
464*7eba2f3bSAndroid Build Coastguard Worker /* Set Timer 1 Expired event mask and reload timer */
465*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_TIMER_UPDATES_FROM_ISR == TRUE)
466*7eba2f3bSAndroid Build Coastguard Worker         GKI_isend_event(task_id, TIMER_1_EVT_MASK);
467*7eba2f3bSAndroid Build Coastguard Worker #else
468*7eba2f3bSAndroid Build Coastguard Worker         GKI_send_event(task_id, TIMER_1_EVT_MASK);
469*7eba2f3bSAndroid Build Coastguard Worker #endif
470*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr1[task_id] = gki_cb.com.OSTaskTmr1R[task_id];
471*7eba2f3bSAndroid Build Coastguard Worker       }
472*7eba2f3bSAndroid Build Coastguard Worker     }
473*7eba2f3bSAndroid Build Coastguard Worker 
474*7eba2f3bSAndroid Build Coastguard Worker     /* Check to see if this timer is the next one to expire */
475*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr1[task_id] > 0 &&
476*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr1[task_id] < next_expiration)
477*7eba2f3bSAndroid Build Coastguard Worker       next_expiration = gki_cb.com.OSTaskTmr1[task_id];
478*7eba2f3bSAndroid Build Coastguard Worker #endif
479*7eba2f3bSAndroid Build Coastguard Worker 
480*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 2)
481*7eba2f3bSAndroid Build Coastguard Worker     /* If any timer is running, decrement */
482*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr2[task_id] > 0) {
483*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr2[task_id] -= gki_cb.com.OSNumOrigTicks;
484*7eba2f3bSAndroid Build Coastguard Worker 
485*7eba2f3bSAndroid Build Coastguard Worker       if (gki_cb.com.OSTaskTmr2[task_id] <= 0) {
486*7eba2f3bSAndroid Build Coastguard Worker /* Set Timer 2 Expired event mask and reload timer */
487*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_TIMER_UPDATES_FROM_ISR == TRUE)
488*7eba2f3bSAndroid Build Coastguard Worker         GKI_isend_event(task_id, TIMER_2_EVT_MASK);
489*7eba2f3bSAndroid Build Coastguard Worker #else
490*7eba2f3bSAndroid Build Coastguard Worker         GKI_send_event(task_id, TIMER_2_EVT_MASK);
491*7eba2f3bSAndroid Build Coastguard Worker #endif
492*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr2[task_id] = gki_cb.com.OSTaskTmr2R[task_id];
493*7eba2f3bSAndroid Build Coastguard Worker       }
494*7eba2f3bSAndroid Build Coastguard Worker     }
495*7eba2f3bSAndroid Build Coastguard Worker 
496*7eba2f3bSAndroid Build Coastguard Worker     /* Check to see if this timer is the next one to expire */
497*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr2[task_id] > 0 &&
498*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr2[task_id] < next_expiration)
499*7eba2f3bSAndroid Build Coastguard Worker       next_expiration = gki_cb.com.OSTaskTmr2[task_id];
500*7eba2f3bSAndroid Build Coastguard Worker #endif
501*7eba2f3bSAndroid Build Coastguard Worker 
502*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TIMERS > 3)
503*7eba2f3bSAndroid Build Coastguard Worker     /* If any timer is running, decrement */
504*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr3[task_id] > 0) {
505*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTaskTmr3[task_id] -= gki_cb.com.OSNumOrigTicks;
506*7eba2f3bSAndroid Build Coastguard Worker 
507*7eba2f3bSAndroid Build Coastguard Worker       if (gki_cb.com.OSTaskTmr3[task_id] <= 0) {
508*7eba2f3bSAndroid Build Coastguard Worker /* Set Timer 3 Expired event mask and reload timer */
509*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_TIMER_UPDATES_FROM_ISR == TRUE)
510*7eba2f3bSAndroid Build Coastguard Worker         GKI_isend_event(task_id, TIMER_3_EVT_MASK);
511*7eba2f3bSAndroid Build Coastguard Worker #else
512*7eba2f3bSAndroid Build Coastguard Worker         GKI_send_event(task_id, TIMER_3_EVT_MASK);
513*7eba2f3bSAndroid Build Coastguard Worker #endif
514*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr3[task_id] = gki_cb.com.OSTaskTmr3R[task_id];
515*7eba2f3bSAndroid Build Coastguard Worker       }
516*7eba2f3bSAndroid Build Coastguard Worker     }
517*7eba2f3bSAndroid Build Coastguard Worker 
518*7eba2f3bSAndroid Build Coastguard Worker     /* Check to see if this timer is the next one to expire */
519*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSTaskTmr3[task_id] > 0 &&
520*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.OSTaskTmr3[task_id] < next_expiration)
521*7eba2f3bSAndroid Build Coastguard Worker       next_expiration = gki_cb.com.OSTaskTmr3[task_id];
522*7eba2f3bSAndroid Build Coastguard Worker #endif
523*7eba2f3bSAndroid Build Coastguard Worker   }
524*7eba2f3bSAndroid Build Coastguard Worker 
525*7eba2f3bSAndroid Build Coastguard Worker   /* Set the next timer experation value if there is one to start */
526*7eba2f3bSAndroid Build Coastguard Worker   if (next_expiration < GKI_NO_NEW_TMRS_STARTED) {
527*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSTicksTilExp = gki_cb.com.OSNumOrigTicks = next_expiration;
528*7eba2f3bSAndroid Build Coastguard Worker   } else {
529*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSTicksTilExp = gki_cb.com.OSNumOrigTicks = 0;
530*7eba2f3bSAndroid Build Coastguard Worker   }
531*7eba2f3bSAndroid Build Coastguard Worker 
532*7eba2f3bSAndroid Build Coastguard Worker   gki_cb.com.timer_nesting = 0;
533*7eba2f3bSAndroid Build Coastguard Worker 
534*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
535*7eba2f3bSAndroid Build Coastguard Worker 
536*7eba2f3bSAndroid Build Coastguard Worker   return;
537*7eba2f3bSAndroid Build Coastguard Worker }
538*7eba2f3bSAndroid Build Coastguard Worker 
539*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
540*7eba2f3bSAndroid Build Coastguard Worker **
541*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_timer_queue_empty
542*7eba2f3bSAndroid Build Coastguard Worker **
543*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called by applications to see whether the
544*7eba2f3bSAndroid Build Coastguard Worker **                  timer queue is empty
545*7eba2f3bSAndroid Build Coastguard Worker **
546*7eba2f3bSAndroid Build Coastguard Worker ** Parameters
547*7eba2f3bSAndroid Build Coastguard Worker **
548*7eba2f3bSAndroid Build Coastguard Worker ** Returns          bool
549*7eba2f3bSAndroid Build Coastguard Worker **
550*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_timer_queue_empty(void)551*7eba2f3bSAndroid Build Coastguard Worker bool GKI_timer_queue_empty(void) {
552*7eba2f3bSAndroid Build Coastguard Worker   uint8_t tt;
553*7eba2f3bSAndroid Build Coastguard Worker 
554*7eba2f3bSAndroid Build Coastguard Worker   for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++) {
555*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.timer_queues[tt]) return false;
556*7eba2f3bSAndroid Build Coastguard Worker   }
557*7eba2f3bSAndroid Build Coastguard Worker 
558*7eba2f3bSAndroid Build Coastguard Worker   return true;
559*7eba2f3bSAndroid Build Coastguard Worker }
560*7eba2f3bSAndroid Build Coastguard Worker 
561*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
562*7eba2f3bSAndroid Build Coastguard Worker **
563*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_timer_queue_register_callback
564*7eba2f3bSAndroid Build Coastguard Worker **
565*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called by applications to register system
566*7eba2f3bSAndroid Build Coastguard Worker **                  tick start/stop callback for time queues
567*7eba2f3bSAndroid Build Coastguard Worker **
568*7eba2f3bSAndroid Build Coastguard Worker **
569*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       p_callback - (input) pointer to the system tick callback
570*7eba2f3bSAndroid Build Coastguard Worker **
571*7eba2f3bSAndroid Build Coastguard Worker ** Returns          bool
572*7eba2f3bSAndroid Build Coastguard Worker **
573*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_timer_queue_register_callback(SYSTEM_TICK_CBACK * p_callback)574*7eba2f3bSAndroid Build Coastguard Worker void GKI_timer_queue_register_callback(SYSTEM_TICK_CBACK* p_callback) {
575*7eba2f3bSAndroid Build Coastguard Worker   gki_cb.com.p_tick_cb = p_callback;
576*7eba2f3bSAndroid Build Coastguard Worker 
577*7eba2f3bSAndroid Build Coastguard Worker   return;
578*7eba2f3bSAndroid Build Coastguard Worker }
579*7eba2f3bSAndroid Build Coastguard Worker 
580*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
581*7eba2f3bSAndroid Build Coastguard Worker **
582*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_init_timer_list
583*7eba2f3bSAndroid Build Coastguard Worker **
584*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called by applications when they
585*7eba2f3bSAndroid Build Coastguard Worker **                  want to initialize a timer list.
586*7eba2f3bSAndroid Build Coastguard Worker **
587*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       p_timer_listq - (input) pointer to the timer list queue
588*7eba2f3bSAndroid Build Coastguard Worker **                                          object
589*7eba2f3bSAndroid Build Coastguard Worker **
590*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
591*7eba2f3bSAndroid Build Coastguard Worker **
592*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_init_timer_list(TIMER_LIST_Q * p_timer_listq)593*7eba2f3bSAndroid Build Coastguard Worker void GKI_init_timer_list(TIMER_LIST_Q* p_timer_listq) {
594*7eba2f3bSAndroid Build Coastguard Worker   p_timer_listq->p_first = nullptr;
595*7eba2f3bSAndroid Build Coastguard Worker   p_timer_listq->p_last = nullptr;
596*7eba2f3bSAndroid Build Coastguard Worker   p_timer_listq->last_ticks = 0;
597*7eba2f3bSAndroid Build Coastguard Worker 
598*7eba2f3bSAndroid Build Coastguard Worker   return;
599*7eba2f3bSAndroid Build Coastguard Worker }
600*7eba2f3bSAndroid Build Coastguard Worker 
601*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
602*7eba2f3bSAndroid Build Coastguard Worker **
603*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_init_timer_list_entry
604*7eba2f3bSAndroid Build Coastguard Worker **
605*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called by the applications when they
606*7eba2f3bSAndroid Build Coastguard Worker **                  want to initialize a timer list entry. This must be
607*7eba2f3bSAndroid Build Coastguard Worker **                  done prior to first use of the entry.
608*7eba2f3bSAndroid Build Coastguard Worker **
609*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       p_tle - (input) pointer to a timer list queue entry
610*7eba2f3bSAndroid Build Coastguard Worker **
611*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
612*7eba2f3bSAndroid Build Coastguard Worker **
613*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_init_timer_list_entry(TIMER_LIST_ENT * p_tle)614*7eba2f3bSAndroid Build Coastguard Worker void GKI_init_timer_list_entry(TIMER_LIST_ENT* p_tle) {
615*7eba2f3bSAndroid Build Coastguard Worker   p_tle->p_next = nullptr;
616*7eba2f3bSAndroid Build Coastguard Worker   p_tle->p_prev = nullptr;
617*7eba2f3bSAndroid Build Coastguard Worker   p_tle->ticks = GKI_UNUSED_LIST_ENTRY;
618*7eba2f3bSAndroid Build Coastguard Worker   p_tle->in_use = false;
619*7eba2f3bSAndroid Build Coastguard Worker }
620*7eba2f3bSAndroid Build Coastguard Worker 
621*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
622*7eba2f3bSAndroid Build Coastguard Worker **
623*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_update_timer_list
624*7eba2f3bSAndroid Build Coastguard Worker **
625*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called by the applications when they
626*7eba2f3bSAndroid Build Coastguard Worker **                  want to update a timer list. This should be at every
627*7eba2f3bSAndroid Build Coastguard Worker **                  timer list unit tick, e.g. once per sec, once per minute
628*7eba2f3bSAndroid Build Coastguard Worker **                  etc.
629*7eba2f3bSAndroid Build Coastguard Worker **
630*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       p_timer_listq - (input) pointer to the timer list queue
631*7eba2f3bSAndroid Build Coastguard Worker **                  object
632*7eba2f3bSAndroid Build Coastguard Worker **                  num_units_since_last_update - (input) number of units since
633*7eba2f3bSAndroid Build Coastguard Worker **                  the last update (allows for variable unit update)
634*7eba2f3bSAndroid Build Coastguard Worker **
635*7eba2f3bSAndroid Build Coastguard Worker ** NOTE: The following timer list update routines should not be used for exact
636*7eba2f3bSAndroid Build Coastguard Worker **       time critical purposes.  The timer tasks should be used when exact
637*7eba2f3bSAndroid Build Coastguard Worker **       timing is needed.
638*7eba2f3bSAndroid Build Coastguard Worker **
639*7eba2f3bSAndroid Build Coastguard Worker ** Returns          the number of timers that have expired
640*7eba2f3bSAndroid Build Coastguard Worker **
641*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_update_timer_list(TIMER_LIST_Q * p_timer_listq,int32_t num_units_since_last_update)642*7eba2f3bSAndroid Build Coastguard Worker uint16_t GKI_update_timer_list(TIMER_LIST_Q* p_timer_listq,
643*7eba2f3bSAndroid Build Coastguard Worker                                int32_t num_units_since_last_update) {
644*7eba2f3bSAndroid Build Coastguard Worker   TIMER_LIST_ENT* p_tle;
645*7eba2f3bSAndroid Build Coastguard Worker   uint16_t num_time_out = 0;
646*7eba2f3bSAndroid Build Coastguard Worker   int32_t rem_ticks;
647*7eba2f3bSAndroid Build Coastguard Worker   int32_t temp_ticks;
648*7eba2f3bSAndroid Build Coastguard Worker 
649*7eba2f3bSAndroid Build Coastguard Worker   p_tle = p_timer_listq->p_first;
650*7eba2f3bSAndroid Build Coastguard Worker 
651*7eba2f3bSAndroid Build Coastguard Worker   /* First, get the guys who have previously timed out */
652*7eba2f3bSAndroid Build Coastguard Worker   /* Note that the tick value of the timers should always be '0' */
653*7eba2f3bSAndroid Build Coastguard Worker   while ((p_tle) && (p_tle->ticks <= 0)) {
654*7eba2f3bSAndroid Build Coastguard Worker     num_time_out++;
655*7eba2f3bSAndroid Build Coastguard Worker     p_tle = p_tle->p_next;
656*7eba2f3bSAndroid Build Coastguard Worker   }
657*7eba2f3bSAndroid Build Coastguard Worker 
658*7eba2f3bSAndroid Build Coastguard Worker   /* Timer entriy tick values are relative to the preceeding entry */
659*7eba2f3bSAndroid Build Coastguard Worker   rem_ticks = num_units_since_last_update;
660*7eba2f3bSAndroid Build Coastguard Worker 
661*7eba2f3bSAndroid Build Coastguard Worker   /* Now, adjust remaining timer entries */
662*7eba2f3bSAndroid Build Coastguard Worker   while ((p_tle != nullptr) && (rem_ticks > 0)) {
663*7eba2f3bSAndroid Build Coastguard Worker     temp_ticks = p_tle->ticks;
664*7eba2f3bSAndroid Build Coastguard Worker     p_tle->ticks -= rem_ticks;
665*7eba2f3bSAndroid Build Coastguard Worker 
666*7eba2f3bSAndroid Build Coastguard Worker     /* See if this timer has just timed out */
667*7eba2f3bSAndroid Build Coastguard Worker     if (p_tle->ticks <= 0) {
668*7eba2f3bSAndroid Build Coastguard Worker       /* We set the number of ticks to '0' so that the legacy code
669*7eba2f3bSAndroid Build Coastguard Worker        * that assumes a '0' or nonzero value will still work as coded. */
670*7eba2f3bSAndroid Build Coastguard Worker       p_tle->ticks = 0;
671*7eba2f3bSAndroid Build Coastguard Worker 
672*7eba2f3bSAndroid Build Coastguard Worker       num_time_out++;
673*7eba2f3bSAndroid Build Coastguard Worker     }
674*7eba2f3bSAndroid Build Coastguard Worker 
675*7eba2f3bSAndroid Build Coastguard Worker     rem_ticks -= temp_ticks; /* Decrement the remaining ticks to process */
676*7eba2f3bSAndroid Build Coastguard Worker     p_tle = p_tle->p_next;
677*7eba2f3bSAndroid Build Coastguard Worker   }
678*7eba2f3bSAndroid Build Coastguard Worker 
679*7eba2f3bSAndroid Build Coastguard Worker   if (p_timer_listq->last_ticks > 0) {
680*7eba2f3bSAndroid Build Coastguard Worker     p_timer_listq->last_ticks -= num_units_since_last_update;
681*7eba2f3bSAndroid Build Coastguard Worker 
682*7eba2f3bSAndroid Build Coastguard Worker     /* If the last timer has expired set last_ticks to 0 so that other list
683*7eba2f3bSAndroid Build Coastguard Worker      * update
684*7eba2f3bSAndroid Build Coastguard Worker      * functions will calculate correctly
685*7eba2f3bSAndroid Build Coastguard Worker      */
686*7eba2f3bSAndroid Build Coastguard Worker     if (p_timer_listq->last_ticks < 0) p_timer_listq->last_ticks = 0;
687*7eba2f3bSAndroid Build Coastguard Worker   }
688*7eba2f3bSAndroid Build Coastguard Worker 
689*7eba2f3bSAndroid Build Coastguard Worker   return (num_time_out);
690*7eba2f3bSAndroid Build Coastguard Worker }
691*7eba2f3bSAndroid Build Coastguard Worker 
GKI_timer_list_empty(TIMER_LIST_Q * p_timer_listq)692*7eba2f3bSAndroid Build Coastguard Worker bool GKI_timer_list_empty(TIMER_LIST_Q* p_timer_listq) {
693*7eba2f3bSAndroid Build Coastguard Worker   return p_timer_listq->p_first == nullptr;
694*7eba2f3bSAndroid Build Coastguard Worker }
695*7eba2f3bSAndroid Build Coastguard Worker 
GKI_timer_list_first(TIMER_LIST_Q * p_timer_listq)696*7eba2f3bSAndroid Build Coastguard Worker TIMER_LIST_ENT* GKI_timer_list_first(TIMER_LIST_Q* p_timer_listq) {
697*7eba2f3bSAndroid Build Coastguard Worker   return p_timer_listq->p_first;
698*7eba2f3bSAndroid Build Coastguard Worker }
699*7eba2f3bSAndroid Build Coastguard Worker 
700*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
701*7eba2f3bSAndroid Build Coastguard Worker **
702*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_get_remaining_ticks
703*7eba2f3bSAndroid Build Coastguard Worker **
704*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called by an application to get remaining
705*7eba2f3bSAndroid Build Coastguard Worker **                  ticks to expire
706*7eba2f3bSAndroid Build Coastguard Worker **
707*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       p_timer_listq - (input) pointer to the timer list queue
708*7eba2f3bSAndroid Build Coastguard Worker **                                          object
709*7eba2f3bSAndroid Build Coastguard Worker **                  p_target_tle - (input) pointer to a timer list queue entry
710*7eba2f3bSAndroid Build Coastguard Worker **
711*7eba2f3bSAndroid Build Coastguard Worker ** Returns          0 if timer is not used or timer is not in the list
712*7eba2f3bSAndroid Build Coastguard Worker **                  remaining ticks if success
713*7eba2f3bSAndroid Build Coastguard Worker **
714*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_get_remaining_ticks(TIMER_LIST_Q * p_timer_listq,TIMER_LIST_ENT * p_target_tle)715*7eba2f3bSAndroid Build Coastguard Worker uint32_t GKI_get_remaining_ticks(TIMER_LIST_Q* p_timer_listq,
716*7eba2f3bSAndroid Build Coastguard Worker                                  TIMER_LIST_ENT* p_target_tle) {
717*7eba2f3bSAndroid Build Coastguard Worker   TIMER_LIST_ENT* p_tle;
718*7eba2f3bSAndroid Build Coastguard Worker   uint32_t rem_ticks = 0;
719*7eba2f3bSAndroid Build Coastguard Worker 
720*7eba2f3bSAndroid Build Coastguard Worker   if (p_target_tle->in_use) {
721*7eba2f3bSAndroid Build Coastguard Worker     p_tle = p_timer_listq->p_first;
722*7eba2f3bSAndroid Build Coastguard Worker 
723*7eba2f3bSAndroid Build Coastguard Worker     /* adding up all of ticks in previous entries */
724*7eba2f3bSAndroid Build Coastguard Worker     while ((p_tle) && (p_tle != p_target_tle)) {
725*7eba2f3bSAndroid Build Coastguard Worker       rem_ticks += p_tle->ticks;
726*7eba2f3bSAndroid Build Coastguard Worker       p_tle = p_tle->p_next;
727*7eba2f3bSAndroid Build Coastguard Worker     }
728*7eba2f3bSAndroid Build Coastguard Worker 
729*7eba2f3bSAndroid Build Coastguard Worker     /* if found target entry */
730*7eba2f3bSAndroid Build Coastguard Worker     if ((p_tle != nullptr) && (p_tle == p_target_tle)) {
731*7eba2f3bSAndroid Build Coastguard Worker       rem_ticks += p_tle->ticks;
732*7eba2f3bSAndroid Build Coastguard Worker     } else {
733*7eba2f3bSAndroid Build Coastguard Worker       LOG(ERROR) << StringPrintf(
734*7eba2f3bSAndroid Build Coastguard Worker           "GKI_get_remaining_ticks: No timer entry in the list");
735*7eba2f3bSAndroid Build Coastguard Worker       return (0);
736*7eba2f3bSAndroid Build Coastguard Worker     }
737*7eba2f3bSAndroid Build Coastguard Worker   } else {
738*7eba2f3bSAndroid Build Coastguard Worker     LOG(ERROR) << StringPrintf(
739*7eba2f3bSAndroid Build Coastguard Worker         "GKI_get_remaining_ticks: timer entry is not active");
740*7eba2f3bSAndroid Build Coastguard Worker   }
741*7eba2f3bSAndroid Build Coastguard Worker 
742*7eba2f3bSAndroid Build Coastguard Worker   return (rem_ticks);
743*7eba2f3bSAndroid Build Coastguard Worker }
744*7eba2f3bSAndroid Build Coastguard Worker 
745*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
746*7eba2f3bSAndroid Build Coastguard Worker **
747*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_add_to_timer_list
748*7eba2f3bSAndroid Build Coastguard Worker **
749*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called by an application to add a timer
750*7eba2f3bSAndroid Build Coastguard Worker **                  entry to a timer list.
751*7eba2f3bSAndroid Build Coastguard Worker **
752*7eba2f3bSAndroid Build Coastguard Worker **                  Note: A timer value of '0' will effectively insert an
753*7eba2f3bSAndroid Build Coastguard Worker **                        already expired event.  Negative tick values will be
754*7eba2f3bSAndroid Build Coastguard Worker **                        ignored.
755*7eba2f3bSAndroid Build Coastguard Worker **
756*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       p_timer_listq - (input) pointer to the timer list queue
757*7eba2f3bSAndroid Build Coastguard Worker **                                          object
758*7eba2f3bSAndroid Build Coastguard Worker **                  p_tle - (input) pointer to a timer list queue entry
759*7eba2f3bSAndroid Build Coastguard Worker **
760*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
761*7eba2f3bSAndroid Build Coastguard Worker **
762*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_add_to_timer_list(TIMER_LIST_Q * p_timer_listq,TIMER_LIST_ENT * p_tle)763*7eba2f3bSAndroid Build Coastguard Worker void GKI_add_to_timer_list(TIMER_LIST_Q* p_timer_listq, TIMER_LIST_ENT* p_tle) {
764*7eba2f3bSAndroid Build Coastguard Worker   uint32_t nr_ticks_total;
765*7eba2f3bSAndroid Build Coastguard Worker   uint8_t tt;
766*7eba2f3bSAndroid Build Coastguard Worker   TIMER_LIST_ENT* p_temp;
767*7eba2f3bSAndroid Build Coastguard Worker   if (p_tle == nullptr || p_timer_listq == nullptr) {
768*7eba2f3bSAndroid Build Coastguard Worker     LOG(VERBOSE) << StringPrintf(
769*7eba2f3bSAndroid Build Coastguard Worker         "%s: invalid argument %p, %p****************************<<", __func__,
770*7eba2f3bSAndroid Build Coastguard Worker         p_timer_listq, p_tle);
771*7eba2f3bSAndroid Build Coastguard Worker     return;
772*7eba2f3bSAndroid Build Coastguard Worker   }
773*7eba2f3bSAndroid Build Coastguard Worker 
774*7eba2f3bSAndroid Build Coastguard Worker   /* Only process valid tick values */
775*7eba2f3bSAndroid Build Coastguard Worker   if (p_tle->ticks >= 0) {
776*7eba2f3bSAndroid Build Coastguard Worker     /* If this entry is the last in the list */
777*7eba2f3bSAndroid Build Coastguard Worker     if (p_tle->ticks >= p_timer_listq->last_ticks) {
778*7eba2f3bSAndroid Build Coastguard Worker       /* If this entry is the only entry in the list */
779*7eba2f3bSAndroid Build Coastguard Worker       if (p_timer_listq->p_first == nullptr)
780*7eba2f3bSAndroid Build Coastguard Worker         p_timer_listq->p_first = p_tle;
781*7eba2f3bSAndroid Build Coastguard Worker       else {
782*7eba2f3bSAndroid Build Coastguard Worker         /* Insert the entry onto the end of the list */
783*7eba2f3bSAndroid Build Coastguard Worker         if (p_timer_listq->p_last != nullptr)
784*7eba2f3bSAndroid Build Coastguard Worker           p_timer_listq->p_last->p_next = p_tle;
785*7eba2f3bSAndroid Build Coastguard Worker 
786*7eba2f3bSAndroid Build Coastguard Worker         p_tle->p_prev = p_timer_listq->p_last;
787*7eba2f3bSAndroid Build Coastguard Worker       }
788*7eba2f3bSAndroid Build Coastguard Worker 
789*7eba2f3bSAndroid Build Coastguard Worker       p_tle->p_next = nullptr;
790*7eba2f3bSAndroid Build Coastguard Worker       p_timer_listq->p_last = p_tle;
791*7eba2f3bSAndroid Build Coastguard Worker       nr_ticks_total = p_tle->ticks;
792*7eba2f3bSAndroid Build Coastguard Worker       p_tle->ticks -= p_timer_listq->last_ticks;
793*7eba2f3bSAndroid Build Coastguard Worker 
794*7eba2f3bSAndroid Build Coastguard Worker       p_timer_listq->last_ticks = nr_ticks_total;
795*7eba2f3bSAndroid Build Coastguard Worker     } else /* This entry needs to be inserted before the last entry */
796*7eba2f3bSAndroid Build Coastguard Worker     {
797*7eba2f3bSAndroid Build Coastguard Worker       /* Find the entry that the new one needs to be inserted in front of */
798*7eba2f3bSAndroid Build Coastguard Worker       p_temp = p_timer_listq->p_first;
799*7eba2f3bSAndroid Build Coastguard Worker       while (p_tle->ticks > p_temp->ticks) {
800*7eba2f3bSAndroid Build Coastguard Worker         /* Update the tick value if looking at an unexpired entry */
801*7eba2f3bSAndroid Build Coastguard Worker         if (p_temp->ticks > 0) p_tle->ticks -= p_temp->ticks;
802*7eba2f3bSAndroid Build Coastguard Worker 
803*7eba2f3bSAndroid Build Coastguard Worker         p_temp = p_temp->p_next;
804*7eba2f3bSAndroid Build Coastguard Worker       }
805*7eba2f3bSAndroid Build Coastguard Worker 
806*7eba2f3bSAndroid Build Coastguard Worker       /* The new entry is the first in the list */
807*7eba2f3bSAndroid Build Coastguard Worker       if (p_temp == p_timer_listq->p_first) {
808*7eba2f3bSAndroid Build Coastguard Worker         p_tle->p_next = p_timer_listq->p_first;
809*7eba2f3bSAndroid Build Coastguard Worker         p_timer_listq->p_first->p_prev = p_tle;
810*7eba2f3bSAndroid Build Coastguard Worker         p_timer_listq->p_first = p_tle;
811*7eba2f3bSAndroid Build Coastguard Worker       } else {
812*7eba2f3bSAndroid Build Coastguard Worker         p_temp->p_prev->p_next = p_tle;
813*7eba2f3bSAndroid Build Coastguard Worker         p_tle->p_prev = p_temp->p_prev;
814*7eba2f3bSAndroid Build Coastguard Worker         p_temp->p_prev = p_tle;
815*7eba2f3bSAndroid Build Coastguard Worker         p_tle->p_next = p_temp;
816*7eba2f3bSAndroid Build Coastguard Worker       }
817*7eba2f3bSAndroid Build Coastguard Worker       p_temp->ticks -= p_tle->ticks;
818*7eba2f3bSAndroid Build Coastguard Worker     }
819*7eba2f3bSAndroid Build Coastguard Worker 
820*7eba2f3bSAndroid Build Coastguard Worker     p_tle->in_use = true;
821*7eba2f3bSAndroid Build Coastguard Worker 
822*7eba2f3bSAndroid Build Coastguard Worker     /* if we already add this timer queue to the array */
823*7eba2f3bSAndroid Build Coastguard Worker     for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++) {
824*7eba2f3bSAndroid Build Coastguard Worker       if (gki_cb.com.timer_queues[tt] == p_timer_listq) return;
825*7eba2f3bSAndroid Build Coastguard Worker     }
826*7eba2f3bSAndroid Build Coastguard Worker     /* add this timer queue to the array */
827*7eba2f3bSAndroid Build Coastguard Worker     for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++) {
828*7eba2f3bSAndroid Build Coastguard Worker       if (gki_cb.com.timer_queues[tt] == nullptr) break;
829*7eba2f3bSAndroid Build Coastguard Worker     }
830*7eba2f3bSAndroid Build Coastguard Worker     if (tt < GKI_MAX_TIMER_QUEUES) {
831*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.timer_queues[tt] = p_timer_listq;
832*7eba2f3bSAndroid Build Coastguard Worker     }
833*7eba2f3bSAndroid Build Coastguard Worker   }
834*7eba2f3bSAndroid Build Coastguard Worker 
835*7eba2f3bSAndroid Build Coastguard Worker   return;
836*7eba2f3bSAndroid Build Coastguard Worker }
837*7eba2f3bSAndroid Build Coastguard Worker 
838*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
839*7eba2f3bSAndroid Build Coastguard Worker **
840*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_remove_from_timer_list
841*7eba2f3bSAndroid Build Coastguard Worker **
842*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called by an application to remove a timer
843*7eba2f3bSAndroid Build Coastguard Worker **                  entry from a timer list.
844*7eba2f3bSAndroid Build Coastguard Worker **
845*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       p_timer_listq  - (input) pointer to the timer list queue
846*7eba2f3bSAndroid Build Coastguard Worker **                                            object
847*7eba2f3bSAndroid Build Coastguard Worker **                  p_tle - (input) pointer to a timer list queue entry
848*7eba2f3bSAndroid Build Coastguard Worker **
849*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
850*7eba2f3bSAndroid Build Coastguard Worker **
851*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_remove_from_timer_list(TIMER_LIST_Q * p_timer_listq,TIMER_LIST_ENT * p_tle)852*7eba2f3bSAndroid Build Coastguard Worker void GKI_remove_from_timer_list(TIMER_LIST_Q* p_timer_listq,
853*7eba2f3bSAndroid Build Coastguard Worker                                 TIMER_LIST_ENT* p_tle) {
854*7eba2f3bSAndroid Build Coastguard Worker   uint8_t tt;
855*7eba2f3bSAndroid Build Coastguard Worker 
856*7eba2f3bSAndroid Build Coastguard Worker   /* Verify that the entry is valid */
857*7eba2f3bSAndroid Build Coastguard Worker   if (p_tle == nullptr || p_tle->in_use == false ||
858*7eba2f3bSAndroid Build Coastguard Worker       p_timer_listq->p_first == nullptr) {
859*7eba2f3bSAndroid Build Coastguard Worker     return;
860*7eba2f3bSAndroid Build Coastguard Worker   }
861*7eba2f3bSAndroid Build Coastguard Worker 
862*7eba2f3bSAndroid Build Coastguard Worker   /* Add the ticks remaining in this timer (if any) to the next guy in the list.
863*7eba2f3bSAndroid Build Coastguard Worker   ** Note: Expired timers have a tick value of '0'.
864*7eba2f3bSAndroid Build Coastguard Worker   */
865*7eba2f3bSAndroid Build Coastguard Worker   if (p_tle->p_next != nullptr) {
866*7eba2f3bSAndroid Build Coastguard Worker     p_tle->p_next->ticks += p_tle->ticks;
867*7eba2f3bSAndroid Build Coastguard Worker   } else {
868*7eba2f3bSAndroid Build Coastguard Worker     p_timer_listq->last_ticks -= p_tle->ticks;
869*7eba2f3bSAndroid Build Coastguard Worker   }
870*7eba2f3bSAndroid Build Coastguard Worker 
871*7eba2f3bSAndroid Build Coastguard Worker   /* Unlink timer from the list. */
872*7eba2f3bSAndroid Build Coastguard Worker   if (p_timer_listq->p_first == p_tle) {
873*7eba2f3bSAndroid Build Coastguard Worker     p_timer_listq->p_first = p_tle->p_next;
874*7eba2f3bSAndroid Build Coastguard Worker 
875*7eba2f3bSAndroid Build Coastguard Worker     if (p_timer_listq->p_first != nullptr)
876*7eba2f3bSAndroid Build Coastguard Worker       p_timer_listq->p_first->p_prev = nullptr;
877*7eba2f3bSAndroid Build Coastguard Worker 
878*7eba2f3bSAndroid Build Coastguard Worker     if (p_timer_listq->p_last == p_tle) p_timer_listq->p_last = nullptr;
879*7eba2f3bSAndroid Build Coastguard Worker   } else {
880*7eba2f3bSAndroid Build Coastguard Worker     if (p_timer_listq->p_last == p_tle) {
881*7eba2f3bSAndroid Build Coastguard Worker       p_timer_listq->p_last = p_tle->p_prev;
882*7eba2f3bSAndroid Build Coastguard Worker 
883*7eba2f3bSAndroid Build Coastguard Worker       if (p_timer_listq->p_last != nullptr)
884*7eba2f3bSAndroid Build Coastguard Worker         p_timer_listq->p_last->p_next = nullptr;
885*7eba2f3bSAndroid Build Coastguard Worker     } else {
886*7eba2f3bSAndroid Build Coastguard Worker       if (p_tle->p_next != nullptr && p_tle->p_next->p_prev == p_tle)
887*7eba2f3bSAndroid Build Coastguard Worker         p_tle->p_next->p_prev = p_tle->p_prev;
888*7eba2f3bSAndroid Build Coastguard Worker       else {
889*7eba2f3bSAndroid Build Coastguard Worker         /* Error case - chain messed up ?? */
890*7eba2f3bSAndroid Build Coastguard Worker         return;
891*7eba2f3bSAndroid Build Coastguard Worker       }
892*7eba2f3bSAndroid Build Coastguard Worker 
893*7eba2f3bSAndroid Build Coastguard Worker       if (p_tle->p_prev != nullptr && p_tle->p_prev->p_next == p_tle)
894*7eba2f3bSAndroid Build Coastguard Worker         p_tle->p_prev->p_next = p_tle->p_next;
895*7eba2f3bSAndroid Build Coastguard Worker       else {
896*7eba2f3bSAndroid Build Coastguard Worker         /* Error case - chain messed up ?? */
897*7eba2f3bSAndroid Build Coastguard Worker         return;
898*7eba2f3bSAndroid Build Coastguard Worker       }
899*7eba2f3bSAndroid Build Coastguard Worker     }
900*7eba2f3bSAndroid Build Coastguard Worker   }
901*7eba2f3bSAndroid Build Coastguard Worker 
902*7eba2f3bSAndroid Build Coastguard Worker   p_tle->p_next = p_tle->p_prev = nullptr;
903*7eba2f3bSAndroid Build Coastguard Worker   p_tle->ticks = GKI_UNUSED_LIST_ENTRY;
904*7eba2f3bSAndroid Build Coastguard Worker   p_tle->in_use = false;
905*7eba2f3bSAndroid Build Coastguard Worker 
906*7eba2f3bSAndroid Build Coastguard Worker   /* if timer queue is empty */
907*7eba2f3bSAndroid Build Coastguard Worker   if (p_timer_listq->p_first == nullptr && p_timer_listq->p_last == nullptr) {
908*7eba2f3bSAndroid Build Coastguard Worker     for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++) {
909*7eba2f3bSAndroid Build Coastguard Worker       if (gki_cb.com.timer_queues[tt] == p_timer_listq) {
910*7eba2f3bSAndroid Build Coastguard Worker         gki_cb.com.timer_queues[tt] = nullptr;
911*7eba2f3bSAndroid Build Coastguard Worker         break;
912*7eba2f3bSAndroid Build Coastguard Worker       }
913*7eba2f3bSAndroid Build Coastguard Worker     }
914*7eba2f3bSAndroid Build Coastguard Worker     /* Recovering from unexpected state.
915*7eba2f3bSAndroid Build Coastguard Worker        e.g. when TIMER_LIST_ENT is cleared before stop */
916*7eba2f3bSAndroid Build Coastguard Worker     if (p_timer_listq->last_ticks) p_timer_listq->last_ticks = 0;
917*7eba2f3bSAndroid Build Coastguard Worker   }
918*7eba2f3bSAndroid Build Coastguard Worker 
919*7eba2f3bSAndroid Build Coastguard Worker   return;
920*7eba2f3bSAndroid Build Coastguard Worker }
921*7eba2f3bSAndroid Build Coastguard Worker 
922*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
923*7eba2f3bSAndroid Build Coastguard Worker **
924*7eba2f3bSAndroid Build Coastguard Worker ** Function         gki_adjust_timer_count
925*7eba2f3bSAndroid Build Coastguard Worker **
926*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called whenever a new timer or GKI_wait
927*7eba2f3bSAndroid Build Coastguard Worker **                  occurs to adjust (if necessary) the current time til the
928*7eba2f3bSAndroid Build Coastguard Worker **                  first expiration. This only needs to make an adjustment if
929*7eba2f3bSAndroid Build Coastguard Worker **                  the new timer (in ticks) is less than the number of ticks
930*7eba2f3bSAndroid Build Coastguard Worker **                  remaining on the current timer.
931*7eba2f3bSAndroid Build Coastguard Worker **
932*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      ticks - (input) number of system ticks of the new timer
933*7eba2f3bSAndroid Build Coastguard Worker **                                  entry
934*7eba2f3bSAndroid Build Coastguard Worker **
935*7eba2f3bSAndroid Build Coastguard Worker **                  NOTE:  This routine MUST be called while interrupts are
936*7eba2f3bSAndroid Build Coastguard Worker **                         disabled to avoid updates while adjusting the timer
937*7eba2f3bSAndroid Build Coastguard Worker **                         variables.
938*7eba2f3bSAndroid Build Coastguard Worker **
939*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
940*7eba2f3bSAndroid Build Coastguard Worker **
941*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
gki_adjust_timer_count(int32_t ticks)942*7eba2f3bSAndroid Build Coastguard Worker void gki_adjust_timer_count(int32_t ticks) {
943*7eba2f3bSAndroid Build Coastguard Worker   if (ticks > 0) {
944*7eba2f3bSAndroid Build Coastguard Worker     /* See if the new timer expires before the current first expiration */
945*7eba2f3bSAndroid Build Coastguard Worker     if (gki_cb.com.OSNumOrigTicks == 0 ||
946*7eba2f3bSAndroid Build Coastguard Worker         (ticks < gki_cb.com.OSTicksTilExp && gki_cb.com.OSTicksTilExp > 0)) {
947*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSNumOrigTicks =
948*7eba2f3bSAndroid Build Coastguard Worker           (gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp) + ticks;
949*7eba2f3bSAndroid Build Coastguard Worker       gki_cb.com.OSTicksTilExp = ticks;
950*7eba2f3bSAndroid Build Coastguard Worker     }
951*7eba2f3bSAndroid Build Coastguard Worker   }
952*7eba2f3bSAndroid Build Coastguard Worker 
953*7eba2f3bSAndroid Build Coastguard Worker   return;
954*7eba2f3bSAndroid Build Coastguard Worker }
955