OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [before_ORP/] [uclinux/] [uClinux-2.0.x/] [drivers/] [isdn/] [hisax/] [fsm.c] - Blame information for rev 199

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 199 simons
/* $Id: fsm.c,v 1.1.1.1 2001-09-10 07:44:18 simons Exp $
2
 
3
 * Author       Karsten Keil (keil@temic-ech.spacenet.de)
4
 *              based on the teles driver from Jan den Ouden
5
 *
6
 * Thanks to    Jan den Ouden
7
 *              Fritz Elfert
8
 *
9
 * $Log: not supported by cvs2svn $
10
 * Revision 1.1.1.1  2001/07/02 17:58:32  simons
11
 * Initial revision
12
 *
13
 * Revision 1.4.2.5  1998/11/03 00:06:23  keil
14
 * certification related changes
15
 * fixed logging for smaller stack use
16
 *
17
 * Revision 1.4.2.4  1998/05/27 18:05:21  keil
18
 * HiSax 3.0
19
 *
20
 * Revision 1.4.2.3  1998/03/07 23:15:20  tsbogend
21
 * made HiSax working on Linux/Alpha
22
 *
23
 * Revision 1.4.2.2  1997/11/15 18:54:29  keil
24
 * cosmetics
25
 *
26
 * Revision 1.4.2.1  1997/10/17 22:13:49  keil
27
 * update to last hisax version
28
 *
29
 * Revision 1.6  1997/07/27 21:42:25  keil
30
 * proof Fsm routines
31
 *
32
 * Revision 1.5  1997/06/26 11:10:05  keil
33
 * Restart timer function added
34
 *
35
 * Revision 1.4  1997/04/06 22:56:42  keil
36
 * Some cosmetic changes
37
 *
38
 * Revision 1.3  1997/02/16 01:04:08  fritz
39
 * Bugfix: Changed timer handling caused hang with 2.1.X
40
 *
41
 * Revision 1.2  1997/01/09 20:57:27  keil
42
 * cleanup & FSM_TIMER_DEBUG
43
 *
44
 * Revision 1.1  1996/10/13 20:04:52  keil
45
 * Initial revision
46
 *
47
 *
48
 */
49
#define __NO_VERSION__
50
#include "hisax.h"
51
 
52
#define FSM_TIMER_DEBUG 0
53
 
54
HISAX_INITFUNC(void
55
FsmNew(struct Fsm *fsm,
56
       struct FsmNode *fnlist, int fncount))
57
{
58
        int i;
59
 
60
        fsm->jumpmatrix = (FSMFNPTR *)
61
                kmalloc(sizeof (FSMFNPTR) * fsm->state_count * fsm->event_count, GFP_KERNEL);
62
        memset(fsm->jumpmatrix, 0, sizeof (FSMFNPTR) * fsm->state_count * fsm->event_count);
63
 
64
        for (i = 0; i < fncount; i++)
65
                if ((fnlist[i].state>=fsm->state_count) || (fnlist[i].event>=fsm->event_count)) {
66
                        printk(KERN_ERR "FsmNew Error line %d st(%ld/%ld) ev(%ld/%ld)\n",
67
                                i,(long)fnlist[i].state,(long)fsm->state_count,
68
                                (long)fnlist[i].event,(long)fsm->event_count);
69
                } else
70
                        fsm->jumpmatrix[fsm->state_count * fnlist[i].event +
71
                                fnlist[i].state] = (FSMFNPTR) fnlist[i].routine;
72
}
73
 
74
void
75
FsmFree(struct Fsm *fsm)
76
{
77
        kfree((void *) fsm->jumpmatrix);
78
}
79
 
80
int
81
FsmEvent(struct FsmInst *fi, int event, void *arg)
82
{
83
        FSMFNPTR r;
84
 
85
        if ((fi->state>=fi->fsm->state_count) || (event >= fi->fsm->event_count)) {
86
                printk(KERN_ERR "FsmEvent Error st(%ld/%ld) ev(%d/%ld)\n",
87
                        (long)fi->state,(long)fi->fsm->state_count,event,(long)fi->fsm->event_count);
88
                return(1);
89
        }
90
        r = fi->fsm->jumpmatrix[fi->fsm->state_count * event + fi->state];
91
        if (r) {
92
                if (fi->debug)
93
                        fi->printdebug(fi, "State %s Event %s",
94
                                fi->fsm->strState[fi->state],
95
                                fi->fsm->strEvent[event]);
96
                r(fi, event, arg);
97
                return (0);
98
        } else {
99
                if (fi->debug)
100
                        fi->printdebug(fi, "State %s Event %s no routine",
101
                                fi->fsm->strState[fi->state],
102
                                fi->fsm->strEvent[event]);
103
                return (!0);
104
        }
105
}
106
 
107
void
108
FsmChangeState(struct FsmInst *fi, int newstate)
109
{
110
        fi->state = newstate;
111
        if (fi->debug)
112
                fi->printdebug(fi, "ChangeState %s",
113
                        fi->fsm->strState[newstate]);
114
}
115
 
116
static void
117
FsmExpireTimer(struct FsmTimer *ft)
118
{
119
#if FSM_TIMER_DEBUG
120
        if (ft->fi->debug)
121
                ft->fi->printdebug(ft->fi, "FsmExpireTimer %lx", (long) ft);
122
#endif
123
        FsmEvent(ft->fi, ft->event, ft->arg);
124
}
125
 
126
void
127
FsmInitTimer(struct FsmInst *fi, struct FsmTimer *ft)
128
{
129
        ft->fi = fi;
130
        ft->tl.function = (void *) FsmExpireTimer;
131
        ft->tl.data = (long) ft;
132
#if FSM_TIMER_DEBUG
133
        if (ft->fi->debug)
134
                ft->fi->printdebug(ft->fi, "FsmInitTimer %lx", (long) ft);
135
#endif
136
        init_timer(&ft->tl);
137
}
138
 
139
void
140
FsmDelTimer(struct FsmTimer *ft, int where)
141
{
142
#if FSM_TIMER_DEBUG
143
        if (ft->fi->debug)
144
                ft->fi->printdebug(ft->fi, "FsmDelTimer %lx %d", (long) ft, where);
145
#endif
146
        del_timer(&ft->tl);
147
}
148
 
149
int
150
FsmAddTimer(struct FsmTimer *ft,
151
            int millisec, int event, void *arg, int where)
152
{
153
 
154
#if FSM_TIMER_DEBUG
155
        if (ft->fi->debug)
156
                ft->fi->printdebug(ft->fi, "FsmAddTimer %lx %d %d",
157
                        (long) ft, millisec, where);
158
#endif
159
 
160
        if (ft->tl.next || ft->tl.prev) {
161
                printk(KERN_WARNING "FsmAddTimer: timer already active!\n");
162
                ft->fi->printdebug(ft->fi, "FsmAddTimer already active!");
163
                return -1;
164
        }
165
        init_timer(&ft->tl);
166
        ft->event = event;
167
        ft->arg = arg;
168
        ft->tl.expires = jiffies + (millisec * HZ) / 1000;
169
        add_timer(&ft->tl);
170
        return 0;
171
}
172
 
173
void
174
FsmRestartTimer(struct FsmTimer *ft,
175
            int millisec, int event, void *arg, int where)
176
{
177
 
178
#if FSM_TIMER_DEBUG
179
        if (ft->fi->debug)
180
                ft->fi->printdebug(ft->fi, "FsmRestartTimer %lx %d %d",
181
                        (long) ft, millisec, where);
182
#endif
183
 
184
        if (ft->tl.next || ft->tl.prev)
185
                del_timer(&ft->tl);
186
        init_timer(&ft->tl);
187
        ft->event = event;
188
        ft->arg = arg;
189
        ft->tl.expires = jiffies + (millisec * HZ) / 1000;
190
        add_timer(&ft->tl);
191
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.