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