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