1 /* ISDN4BSD code */
2 /* $NetBSD: iwic_fsm.c,v 1.1 2002/09/24 22:05:19 pooka Exp $ */
3
4 /*
5 * Copyright (c) 1999, 2000 Dave Boyce. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 *---------------------------------------------------------------------------
29 *
30 * i4b_iwic - isdn4bsd Winbond W6692 driver
31 * ----------------------------------------
32 *
33 * $FreeBSD$
34 *
35 * last edit-date: [Sun Jan 21 11:09:24 2001]
36 *
37 *---------------------------------------------------------------------------*/
38
39 #include <sys/cdefs.h>
40 __KERNEL_RCSID(0, "$NetBSD: iwic_fsm.c,v 1.1 2002/09/24 22:05:19 pooka Exp $");
41
42 #include <sys/param.h>
43 #include <sys/kernel.h>
44 #include <sys/systm.h>
45 #include <sys/mbuf.h>
46 #include <sys/timeout.h>
47 #include <sys/socket.h>
48 #include <sys/device.h>
49 #include <net/if.h>
50
51 #include <machine/bus.h>
52
53 #include <dev/pci/pcireg.h>
54 #include <dev/pci/pcivar.h>
55 #include <dev/pci/pcidevs.h>
56
57 #include <dev/pci/iwicreg.h>
58 #include <dev/pci/iwicvar.h>
59
60 #if DO_I4B_DEBUG
61 static char *state_names[] = {
62 "F3N",
63 "F3",
64 "F4",
65 "F5",
66 "F6",
67 "F7",
68 "F8",
69 "ILLEGAL",
70 };
71
72 static char *event_names[] = {
73 "PHAR",
74 "CE",
75 "T3",
76 "INFO0",
77 "RSY",
78 "INFO2",
79 "INFO48",
80 "INFO410",
81 "DR",
82 "PU",
83 "DIS",
84 "EI",
85 "ILLEGAL"
86 };
87 #endif
88
89 /*---------------------------------------------------------------------------*
90 *
91 *---------------------------------------------------------------------------*/
92 static void
F_NULL(struct iwic_softc * sc)93 F_NULL(struct iwic_softc *sc)
94 {
95 NDBGL1(L1_F_MSG, "FSM function F_NULL executing");
96 }
97
98 /*---------------------------------------------------------------------------*
99 *
100 *---------------------------------------------------------------------------*/
101 static void
F_AR(struct iwic_softc * sc)102 F_AR(struct iwic_softc *sc)
103 {
104 NDBGL1(L1_F_MSG, "FSM function F_AR executing");
105 IWIC_WRITE(sc, CIX, CIX_ECK);
106 }
107
108 /*---------------------------------------------------------------------------*
109 *
110 *---------------------------------------------------------------------------*/
111 static void
F_AR3(struct iwic_softc * sc)112 F_AR3(struct iwic_softc *sc)
113 {
114 NDBGL1(L1_F_MSG, "FSM function F_AR3 executing");
115 IWIC_WRITE(sc, CIX, CIX_AR8);
116 }
117
118 /*---------------------------------------------------------------------------*
119 *
120 *---------------------------------------------------------------------------*/
121 static void
F_I0I(struct iwic_softc * sc)122 F_I0I(struct iwic_softc *sc)
123 {
124 NDBGL1(L1_F_MSG, "FSM function F_IOI executing");
125 }
126
127 /*---------------------------------------------------------------------------*
128 *
129 *---------------------------------------------------------------------------*/
130 static void
F_I0A(struct iwic_softc * sc)131 F_I0A(struct iwic_softc *sc)
132 {
133 NDBGL1(L1_F_MSG, "FSM function F_IOA executing");
134 iwic_dchan_disable(sc);
135 isdn_layer2_activate_ind(&sc->sc_l2, sc->sc_l3token, 0);
136 }
137
138 /*---------------------------------------------------------------------------*
139 *
140 *---------------------------------------------------------------------------*/
141 static void
F_AI8(struct iwic_softc * sc)142 F_AI8(struct iwic_softc *sc)
143 {
144 NDBGL1(L1_F_MSG, "FSM function F_AI8 executing");
145 iwic_dchan_transmit(sc);
146 isdn_layer2_activate_ind(&sc->sc_l2, sc->sc_l3token, 1);
147 }
148
149 /*---------------------------------------------------------------------------*
150 *
151 *---------------------------------------------------------------------------*/
152 static void
F_AI10(struct iwic_softc * sc)153 F_AI10(struct iwic_softc *sc)
154 {
155 NDBGL1(L1_F_MSG, "FSM function F_AI10 executing");
156 iwic_dchan_transmit(sc);
157 isdn_layer2_activate_ind(&sc->sc_l2, sc->sc_l3token, 1);
158 }
159
160 /*---------------------------------------------------------------------------*
161 *
162 *---------------------------------------------------------------------------*/
163 struct iwic_state_tab {
164 void (*func) (struct iwic_softc *sc); /* function to execute */
165 int newstate; /* next state */
166 } iwic_state_tab[N_EVENTS][N_STATES] = {
167
168 /* STATE: F3N F3 F4 F5 F6 F7 F8 ILLEGAL STATE */
169 /* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */
170 /* EV_PHAR */ {{F_AR, ST_F3 }, {F_AR3, ST_F4 }, {F_NULL, ST_F4 }, {F_NULL, ST_F5 }, {F_NULL, ST_F6 }, {F_NULL, ST_F7 }, {F_NULL, ST_F8 }, {F_NULL, ST_ILL }},
171 /* EV_CE */ {{F_NULL, ST_F3 }, {F_AR3, ST_F4 }, {F_NULL, ST_F4 }, {F_NULL, ST_F4 }, {F_NULL, ST_F4 }, {F_NULL, ST_F4 }, {F_NULL, ST_F4 }, {F_NULL, ST_ILL }},
172 /* EV_T3 */ {{F_NULL, ST_F3N }, {F_NULL, ST_F3 }, {F_NULL, ST_F3 }, {F_NULL, ST_F3 }, {F_NULL, ST_F3 }, {F_NULL, ST_F7 }, {F_NULL, ST_F8 }, {F_NULL, ST_ILL }},
173 /* EV_INFO0 */ {{F_I0I, ST_F3 }, {F_I0I, ST_F3 }, {F_I0I, ST_F3 }, {F_I0I, ST_F3 }, {F_I0A, ST_F3 }, {F_I0A, ST_F3 }, {F_I0A, ST_F3 }, {F_NULL, ST_ILL }},
174 /* EV_RSY */ {{F_NULL, ST_F3 }, {F_NULL, ST_F5 }, {F_NULL, ST_F5 }, {F_NULL, ST_F5 }, {F_NULL, ST_F8 }, {F_NULL, ST_F8 }, {F_NULL, ST_F8 }, {F_NULL, ST_ILL }},
175 /* EV_INFO2 */ {{F_NULL, ST_F6 }, {F_NULL, ST_F6 }, {F_NULL, ST_F6 }, {F_NULL, ST_F6 }, {F_NULL, ST_F6 }, {F_NULL, ST_F6 }, {F_NULL, ST_F6 }, {F_NULL, ST_ILL }},
176 /* EV_INFO48 */ {{F_AI8 , ST_F7 }, {F_AI8, ST_F7 }, {F_AI8, ST_F7 }, {F_AI8, ST_F7 }, {F_AI8, ST_F7 }, {F_AI8, ST_F7 }, {F_AI8, ST_F7 }, {F_NULL, ST_ILL }},
177 /* EV_INFO410*/ {{F_AI10, ST_F7 }, {F_AI10, ST_F7 }, {F_AI10, ST_F7 }, {F_AI10, ST_F7 }, {F_AI10, ST_F7 }, {F_AI10, ST_F7 }, {F_AI10, ST_F7 }, {F_NULL, ST_ILL }},
178 /* EV_DR */ {{F_NULL, ST_F3 }, {F_NULL, ST_F3 }, {F_NULL, ST_F4 }, {F_NULL, ST_F5 }, {F_NULL, ST_F6 }, {F_NULL, ST_F7 }, {F_NULL, ST_F8 }, {F_NULL, ST_ILL }},
179 /* EV_PU */ {{F_NULL, ST_F3 }, {F_NULL, ST_F3 }, {F_NULL, ST_F4 }, {F_NULL, ST_F5 }, {F_NULL, ST_F6 }, {F_NULL, ST_F7 }, {F_NULL, ST_F8 }, {F_NULL, ST_ILL }},
180 /* EV_DIS */ {{F_NULL, ST_F3N }, {F_NULL, ST_F3N }, {F_NULL, ST_F3N }, {F_NULL, ST_F3N }, {F_NULL, ST_F3N }, {F_I0A, ST_F3N }, {F_I0A, ST_F3N }, {F_NULL, ST_ILL }},
181 /* EV_EI */ {{F_NULL, ST_F3 }, {F_NULL, ST_F3 }, {F_NULL, ST_F3 }, {F_NULL, ST_F3 }, {F_NULL, ST_F3 }, {F_NULL, ST_F3 }, {F_NULL, ST_F3 }, {F_NULL, ST_ILL }},
182 /* EV_ILL */ {{F_NULL, ST_ILL }, {F_NULL, ST_ILL }, {F_NULL, ST_ILL }, {F_NULL, ST_ILL }, {F_NULL, ST_ILL }, {F_NULL, ST_ILL }, {F_NULL, ST_ILL }, {F_NULL, ST_ILL }},
183 };
184
185 /*---------------------------------------------------------------------------*
186 *
187 *---------------------------------------------------------------------------*/
188 void
iwic_next_state(struct iwic_softc * sc,int event)189 iwic_next_state(struct iwic_softc *sc, int event)
190 {
191 int currstate, newstate;
192
193 NDBGL1(L1_F_MSG, "event %s", event_names[event]);
194
195 if (event >= N_EVENTS)
196 {
197 printf("iwic_next_state: event >= N_EVENTS\n");
198 return;
199 }
200
201 currstate = sc->sc_I430state;
202
203 newstate = iwic_state_tab[event][currstate].newstate;
204 if (newstate >= N_STATES)
205 {
206 printf("iwic_next_state: newstate >= N_STATES\n");
207 return;
208 }
209
210 NDBGL1(L1_F_MSG, "state %s -> %s",
211 state_names[currstate], state_names[newstate]);
212
213 sc->sc_I430state = newstate;
214
215 (*iwic_state_tab[event][currstate].func) (sc);
216 }
217
218 #if DO_I4B_DEBUG
219 /*---------------------------------------------------------------------------*
220 * return pointer to current state description
221 *---------------------------------------------------------------------------*/
222 char *
iwic_printstate(struct iwic_softc * sc)223 iwic_printstate(struct iwic_softc *sc)
224 {
225 return((char *)state_names[sc->sc_I430state]);
226 }
227 #endif
228