1*4e1bc9a0SAchim Leubner /*******************************************************************************
2*4e1bc9a0SAchim Leubner **
3*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
4*4e1bc9a0SAchim Leubner *
5*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
6*4e1bc9a0SAchim Leubner *that the following conditions are met:
7*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
8*4e1bc9a0SAchim Leubner *following disclaimer.
9*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
10*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
11*4e1bc9a0SAchim Leubner *with the distribution.
12*4e1bc9a0SAchim Leubner *
13*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
14*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
15*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
17*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
18*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
19*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
20*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
21*4e1bc9a0SAchim Leubner
22*4e1bc9a0SAchim Leubner **
23*4e1bc9a0SAchim Leubner ********************************************************************************/
24*4e1bc9a0SAchim Leubner #include <sys/cdefs.h>
25*4e1bc9a0SAchim Leubner #include <dev/pms/config.h>
26*4e1bc9a0SAchim Leubner
27*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osenv.h>
28*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/ostypes.h>
29*4e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osdebug.h>
30*4e1bc9a0SAchim Leubner
31*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/sa.h>
32*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
33*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
34*4e1bc9a0SAchim Leubner
35*4e1bc9a0SAchim Leubner #ifdef FDS_DM
36*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dm.h>
37*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dmapi.h>
38*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
39*4e1bc9a0SAchim Leubner
40*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/dm/dmdefs.h>
41*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/dm/dmtypes.h>
42*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/dm/dmproto.h>
43*4e1bc9a0SAchim Leubner
44*4e1bc9a0SAchim Leubner osGLOBAL void
dmTimerTick(dmRoot_t * dmRoot)45*4e1bc9a0SAchim Leubner dmTimerTick(dmRoot_t *dmRoot )
46*4e1bc9a0SAchim Leubner {
47*4e1bc9a0SAchim Leubner DM_DBG6(("dmTimerTick: start\n"));
48*4e1bc9a0SAchim Leubner
49*4e1bc9a0SAchim Leubner dmProcessTimers(dmRoot);
50*4e1bc9a0SAchim Leubner
51*4e1bc9a0SAchim Leubner return;
52*4e1bc9a0SAchim Leubner }
53*4e1bc9a0SAchim Leubner
54*4e1bc9a0SAchim Leubner osGLOBAL void
dmInitTimerRequest(dmRoot_t * dmRoot,dmTimerRequest_t * timerRequest)55*4e1bc9a0SAchim Leubner dmInitTimerRequest(
56*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
57*4e1bc9a0SAchim Leubner dmTimerRequest_t *timerRequest
58*4e1bc9a0SAchim Leubner )
59*4e1bc9a0SAchim Leubner {
60*4e1bc9a0SAchim Leubner timerRequest->timeout = 0;
61*4e1bc9a0SAchim Leubner timerRequest->timerCBFunc = agNULL;
62*4e1bc9a0SAchim Leubner timerRequest->timerData1 = agNULL;
63*4e1bc9a0SAchim Leubner timerRequest->timerData2 = agNULL;
64*4e1bc9a0SAchim Leubner timerRequest->timerData3 = agNULL;
65*4e1bc9a0SAchim Leubner DMLIST_INIT_ELEMENT((&timerRequest->timerLink));
66*4e1bc9a0SAchim Leubner }
67*4e1bc9a0SAchim Leubner
68*4e1bc9a0SAchim Leubner osGLOBAL void
dmSetTimerRequest(dmRoot_t * dmRoot,dmTimerRequest_t * timerRequest,bit32 timeout,dmTimerCBFunc_t CBFunc,void * timerData1,void * timerData2,void * timerData3)69*4e1bc9a0SAchim Leubner dmSetTimerRequest(
70*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
71*4e1bc9a0SAchim Leubner dmTimerRequest_t *timerRequest,
72*4e1bc9a0SAchim Leubner bit32 timeout,
73*4e1bc9a0SAchim Leubner dmTimerCBFunc_t CBFunc,
74*4e1bc9a0SAchim Leubner void *timerData1,
75*4e1bc9a0SAchim Leubner void *timerData2,
76*4e1bc9a0SAchim Leubner void *timerData3
77*4e1bc9a0SAchim Leubner )
78*4e1bc9a0SAchim Leubner {
79*4e1bc9a0SAchim Leubner timerRequest->timeout = timeout;
80*4e1bc9a0SAchim Leubner timerRequest->timerCBFunc = CBFunc;
81*4e1bc9a0SAchim Leubner timerRequest->timerData1 = timerData1;
82*4e1bc9a0SAchim Leubner timerRequest->timerData2 = timerData2;
83*4e1bc9a0SAchim Leubner timerRequest->timerData3 = timerData3;
84*4e1bc9a0SAchim Leubner }
85*4e1bc9a0SAchim Leubner
86*4e1bc9a0SAchim Leubner osGLOBAL void
dmAddTimer(dmRoot_t * dmRoot,dmList_t * timerListHdr,dmTimerRequest_t * timerRequest)87*4e1bc9a0SAchim Leubner dmAddTimer(
88*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
89*4e1bc9a0SAchim Leubner dmList_t *timerListHdr,
90*4e1bc9a0SAchim Leubner dmTimerRequest_t *timerRequest
91*4e1bc9a0SAchim Leubner )
92*4e1bc9a0SAchim Leubner {
93*4e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
94*4e1bc9a0SAchim Leubner DMLIST_ENQUEUE_AT_TAIL(&(timerRequest->timerLink), timerListHdr);
95*4e1bc9a0SAchim Leubner timerRequest->timerRunning = agTRUE;
96*4e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
97*4e1bc9a0SAchim Leubner }
98*4e1bc9a0SAchim Leubner
99*4e1bc9a0SAchim Leubner osGLOBAL void
dmKillTimer(dmRoot_t * dmRoot,dmTimerRequest_t * timerRequest)100*4e1bc9a0SAchim Leubner dmKillTimer(
101*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot,
102*4e1bc9a0SAchim Leubner dmTimerRequest_t *timerRequest
103*4e1bc9a0SAchim Leubner )
104*4e1bc9a0SAchim Leubner {
105*4e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
106*4e1bc9a0SAchim Leubner timerRequest->timerRunning = agFALSE;
107*4e1bc9a0SAchim Leubner DMLIST_DEQUEUE_THIS(&(timerRequest->timerLink));
108*4e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
109*4e1bc9a0SAchim Leubner }
110*4e1bc9a0SAchim Leubner
111*4e1bc9a0SAchim Leubner
112*4e1bc9a0SAchim Leubner osGLOBAL void
dmProcessTimers(dmRoot_t * dmRoot)113*4e1bc9a0SAchim Leubner dmProcessTimers(
114*4e1bc9a0SAchim Leubner dmRoot_t *dmRoot
115*4e1bc9a0SAchim Leubner )
116*4e1bc9a0SAchim Leubner {
117*4e1bc9a0SAchim Leubner dmIntRoot_t *dmIntRoot = (dmIntRoot_t *)dmRoot->dmData;
118*4e1bc9a0SAchim Leubner dmIntContext_t *dmAllShared = (dmIntContext_t *)&dmIntRoot->dmAllShared;
119*4e1bc9a0SAchim Leubner dmTimerRequest_t *timerRequest_to_process = agNULL;
120*4e1bc9a0SAchim Leubner dmList_t *timerlist_to_process, *nexttimerlist = agNULL;
121*4e1bc9a0SAchim Leubner
122*4e1bc9a0SAchim Leubner
123*4e1bc9a0SAchim Leubner timerlist_to_process = &dmAllShared->timerlist;
124*4e1bc9a0SAchim Leubner
125*4e1bc9a0SAchim Leubner timerlist_to_process = timerlist_to_process->flink;
126*4e1bc9a0SAchim Leubner
127*4e1bc9a0SAchim Leubner while ((timerlist_to_process != agNULL) && (timerlist_to_process != &dmAllShared->timerlist))
128*4e1bc9a0SAchim Leubner {
129*4e1bc9a0SAchim Leubner nexttimerlist = timerlist_to_process->flink;
130*4e1bc9a0SAchim Leubner
131*4e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
132*4e1bc9a0SAchim Leubner timerRequest_to_process = DMLIST_OBJECT_BASE(dmTimerRequest_t, timerLink, timerlist_to_process);
133*4e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
134*4e1bc9a0SAchim Leubner
135*4e1bc9a0SAchim Leubner if (timerRequest_to_process == agNULL)
136*4e1bc9a0SAchim Leubner {
137*4e1bc9a0SAchim Leubner DM_DBG1(("dmProcessTimers: timerRequest_to_process is NULL! Error!!!\n"));
138*4e1bc9a0SAchim Leubner return;
139*4e1bc9a0SAchim Leubner }
140*4e1bc9a0SAchim Leubner
141*4e1bc9a0SAchim Leubner timerRequest_to_process->timeout--;
142*4e1bc9a0SAchim Leubner
143*4e1bc9a0SAchim Leubner if (timerRequest_to_process->timeout == 0)
144*4e1bc9a0SAchim Leubner {
145*4e1bc9a0SAchim Leubner tddmSingleThreadedEnter(dmRoot, DM_TIMER_LOCK);
146*4e1bc9a0SAchim Leubner timerRequest_to_process->timerRunning = agFALSE;
147*4e1bc9a0SAchim Leubner DMLIST_DEQUEUE_THIS(timerlist_to_process);
148*4e1bc9a0SAchim Leubner tddmSingleThreadedLeave(dmRoot, DM_TIMER_LOCK);
149*4e1bc9a0SAchim Leubner /* calling call back function */
150*4e1bc9a0SAchim Leubner (timerRequest_to_process->timerCBFunc)(dmRoot,
151*4e1bc9a0SAchim Leubner timerRequest_to_process->timerData1,
152*4e1bc9a0SAchim Leubner timerRequest_to_process->timerData2,
153*4e1bc9a0SAchim Leubner timerRequest_to_process->timerData3
154*4e1bc9a0SAchim Leubner );
155*4e1bc9a0SAchim Leubner }
156*4e1bc9a0SAchim Leubner timerlist_to_process = nexttimerlist;
157*4e1bc9a0SAchim Leubner }
158*4e1bc9a0SAchim Leubner
159*4e1bc9a0SAchim Leubner return;
160*4e1bc9a0SAchim Leubner }
161*4e1bc9a0SAchim Leubner #endif /* FDS_ DM */
162*4e1bc9a0SAchim Leubner
163