1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /********************************************************************20**
21 Name: common functions - 5
25 Desc: C source code for common timer routines;
29 *********************************************************************21*/
32 /* header include files -- defines (.h) */
34 #include "envopt.h" /* environment options */
35 #include "envdep.h" /* environment dependent */
36 #include "envind.h" /* environment independent */
38 #include "gen.h" /* general */
39 #include "ssi.h" /* system services */
40 #include "cm5.h" /* common functions */
42 /* header/extern include files (.x) */
44 #include "gen.x" /* general */
45 #include "ssi.x" /* system services */
46 #include "cm5.x" /* common functions */
51 #define CM_RMV_TQCP(tqEnt, tgt) \
53 ((tgt)->prev) ? ((tgt)->prev->next = (tgt)->next): \
54 ((tqEnt)->first = (tgt)->next); \
55 ((tgt)->next) ? ((tgt)->next->prev = (tgt)->prev): \
56 ((tqEnt)->tail = (tgt)->prev); \
57 (tgt)->prev = NULLP; \
58 (tgt)->next = NULLP; \
59 (tgt)->ent2bUpd = FALSE; \
62 #define CM_PLC_TQCP(tqEnt, tgt) \
66 (tqEnt)->tail->next = tgt; \
67 (tgt)->prev = (tqEnt)->tail; \
68 (tqEnt)->tail = tgt; \
72 (tqEnt)->first = (tqEnt)->tail = tgt; \
78 /* forward references */
80 /* functions in other modules */
87 * Desc: Handle a timer entry
100 CmTqCp *tqCp, /* timing que control point */
101 CmTqType *tq, /* timing queue */
102 PFV func /* function */
117 Txt prntBuf[PRNTSZE];
120 /* Here the year was being printed as 2 letter value and hence did
121 * not represent accurate information. It has been modified as
122 * recommended to include the offset of year 1900 used in all Trillium
123 * SSI implementations. Patch cmbdy5c_001.113
125 sprintf(prntBuf,"%s: date: %02d/%02d/%04d time: %02d:%02d:%02d\n",
126 msArgv[0],dt.month,dt.day,(int)(dt.year + 1900), dt.hour,
133 expire = tqCp->nxtEnt;
134 /* cm_bdy5_c_002.113 - Modification for SRegCfgTmr support */
135 entry = (uint32_t) (expire % (uint32_t)(tqCp->tmrLen));
137 tmp2 = &tq[entry].first;
138 while ((tmp1 = *tmp2) != NULLP)
140 if (tmp1->tqExpire == expire)
142 event = tmp1->tmrEvnt;
144 /* remove and reset this timer control block */
145 (*tmp2) = tmp1->next;
146 tmp1->tmrEvnt = TMR_NONE;
156 } /* end of cmPrcTmr */
158 #else /* not defined SS_FAP */
162 CmTqCp *tqCp, /* timing que control point */
163 CmTqType *tq, /* timing queue */
164 PFV func /* function */
169 uint32_t entry, entry1;
171 CmTqType *tqEnt, *tqEnt1;
174 volatile uint32_t startTime = 0;
178 SStartTask(&startTime, PID_CM_PRC_TMR);
183 Txt prntBuf[PRNTSZE];
186 /* Here the year was being printed as 2 letter value and hence did
187 * not represent accurate information. It has been modified as
188 * recommended to include the offset of year 1900 used in all Trillium
189 * SSI implementations.
191 sprintf(prntBuf,"%s: date: %02d/%02d/%04d time: %02d:%02d:%02d\n",
192 msArgv[0],dt.month,dt.day,(int)(dt.year + 1900), dt.hour,
199 expire = tqCp->nxtEnt;
200 entry = (uint32_t) (expire % (uint32_t)(tqCp->tmrLen));
202 tqCp->tmp = (tqEnt = &tq[entry])->first;
203 while ((tmp1 = tqCp->tmp) != NULLP)
205 tqCp->tmp = tmp1->next;
206 /* SRIKY - Temp Fix to overcome timer not firing. Need to take */
207 /* care of wrap around case */
208 if ((tmp1->tqExpire <= expire) || (tmp1->ent2bUpd))
210 event = tmp1->tmrEvnt;
213 if (!(tmp1->ent2bUpd))
215 CM_RMV_TQCP(tqEnt, tmp1);
216 tmp1->tmrEvnt = TMR_NONE;
224 entry1 = (uint32_t) (tmp1->tqExpire % (uint32_t)(tqCp->tmrLen));
225 tqEnt1 = &tq[entry1];
226 CM_RMV_TQCP(tqEnt, tmp1);
227 tmp1->entIdx = entry1;
228 CM_PLC_TQCP(tqEnt1, tmp1);
234 SStopTask(startTime, PID_CM_PRC_TMR);
236 } /* end of cmPrcTmr */
245 * Desc: initialize timers
249 * Notes: Connection Oriented Control
256 CmTimer *timers, /* timer list */
257 uint8_t max /* maximum tmrs */
264 for (i = 0, tPtr = timers; i < max; i++, tPtr++)
266 tPtr->tmrEvnt = TMR_NONE;
269 tPtr->next = (struct cmTimer *)NULLP;
270 tPtr->prev = (struct cmTimer *)NULLP;
271 tPtr->ent2bUpd = FALSE;
274 } /* end of cmInitTimers */
280 * Desc: Places Control Block on Timing Queue
290 Void cmPlcCbTq(CmTmrArg *arg)
292 /*added FAP modifications*/
295 /* cm_bdy5_c_001.main_20 - Modification for SRegCfgTmr support */
301 expire = (arg->tqCp->nxtEnt + arg->wait);
302 /* cm_bdy5_c_002.113 - Modification for SRegCfgTmr support */
303 ent = (uint32_t)(expire % (uint32_t)(arg->tqCp->tmrLen));
305 for (tmrNum = 0; tmrNum < arg->max; tmrNum++)
307 if (arg->timers[tmrNum].tmrEvnt == TMR_NONE)
309 arg->timers[tmrNum].tmrEvnt = arg->evnt;
310 arg->timers[tmrNum].tqExpire = expire;
311 arg->timers[tmrNum].cb = arg->cb;
312 arg->timers[tmrNum].next = NULLP;
314 tmp = &(arg->tq[ent].first);
316 tmp = &((*tmp)->next);
317 *tmp = &arg->timers[tmrNum];
330 expire = (arg->tqCp->nxtEnt + arg->wait);
331 ent = (uint32_t)(expire % (uint32_t)(arg->tqCp->tmrLen));
333 for (tmrNum = 0; tmrNum < arg->max; tmrNum++)
335 if (arg->timers[tmrNum].tmrEvnt == TMR_NONE)
337 target = &arg->timers[tmrNum];
340 target->tmrEvnt = arg->evnt;
341 target->tqExpire = expire;
342 target->cb = arg->cb;
343 target->ent2bUpd = FALSE;
344 target->entIdx = ent;
346 /* Place the timer block in the timer list */
347 CM_PLC_TQCP(tq, target);
354 } /* end of cmPlcCbTq */
360 * Desc: Places Control Block on Timing Queue
370 Void cmRstCbTq(CmTmrArg *arg)
373 arg->timers[arg->tNum].tqExpire = arg->tqCp->nxtEnt + arg->wait;
374 arg->timers[arg->tNum].ent2bUpd = TRUE;
377 } /* end of cmRstCbTq */
383 * Desc: Removes control block from Timing Queue
393 Void cmRmvCbTq(CmTmrArg *arg)
395 /*Added FAP modifications*/
397 /* cm_bdy5_c_002.113 - Modification for SRegCfgTmr support */
404 target = &arg->timers[arg->tNum];
405 if (target->tmrEvnt != TMR_NONE)
407 /* cm_bdy5_c_002.113 - Modification for SRegCfgTmr support */
408 ent = (uint32_t) (target->tqExpire % (uint32_t)(arg->tqCp->tmrLen));
409 tmp2 = &arg->tq[ent].first;
411 while ((tmp1 = *tmp2) != NULLP)
415 /* find the timer control block to be removed */
416 (*tmp2) = tmp1->next;
417 tmp1->tmrEvnt = TMR_NONE;
424 /* find the next timer control block */
434 target = &arg->timers[arg->tNum];
435 if (target->tmrEvnt != TMR_NONE)
437 ent = (uint32_t) (target->entIdx);
441 * Update the timer pointer in the for correct processing in
444 if (target == arg->tqCp->tmp)
445 arg->tqCp->tmp = target->next;
447 /* Remove the entru from the list */
448 CM_RMV_TQCP( tq , target);
449 target->tmrEvnt = TMR_NONE;
450 target->tqExpire = 0;
456 } /* end of cmRmvCbTq */
458 /**********************************************************************
460 **********************************************************************/