xref: /freebsd/sys/dev/pms/RefTisa/discovery/dm/dmtimer.c (revision 685dc743dc3b5645e34836464128e1c0558b404b)
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