binutils/ld: Don't add /usr/lib to the library search path twice.
[dragonfly.git] / sys / net / 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  *      i4b_iwic - isdn4bsd Winbond W6692 driver
28  *      ----------------------------------------
29  *
30  * $FreeBSD: src/sys/i4b/layer1/iwic/i4b_iwic_fsm.c,v 1.4.2.1 2001/08/10 14:08:40 obrien Exp $
31  * $DragonFly: src/sys/net/i4b/layer1/iwic/i4b_iwic_fsm.c,v 1.4 2006/12/22 23:44:56 swildner Exp $
32  *
33  *      last edit-date: [Sun Jan 21 11:09:24 2001]
34  *
35  *---------------------------------------------------------------------------*/
36
37 #include "use_iwic.h"
38 #include "use_pci.h"
39 #include "opt_i4b.h"
40
41 #if (NIWIC > 0) && (NPCI > 0)
42
43 #include <sys/param.h>
44 #include <sys/systm.h>
45 #include <sys/socket.h>
46 #include <net/if.h>
47
48 #include <net/i4b/include/machine/i4b_debug.h>
49 #include <net/i4b/include/machine/i4b_ioctl.h>
50 #include <net/i4b/include/machine/i4b_trace.h>
51
52 #include "../i4b_l1.h"
53
54 #include "../../include/i4b_l3l4.h"
55
56 #include "i4b_iwic.h"
57 #include "i4b_w6692.h"
58
59 #if DO_I4B_DEBUG
60 static char *state_names[] = {
61         "F3N",
62         "F3",
63         "F4",
64         "F5",
65         "F6",
66         "F7",
67         "F8",
68         "ILLEGAL",
69 };
70
71 static char *event_names[] = {
72         "PHAR",
73         "CE",
74         "T3",
75         "INFO0",
76         "RSY",
77         "INFO2",
78         "INFO48",
79         "INFO410",
80         "DR",
81         "PU",
82         "DIS",
83         "EI",
84         "ILLEGAL"
85 };
86 #endif
87
88 /*---------------------------------------------------------------------------*
89  *
90  *---------------------------------------------------------------------------*/
91 static void
92 F_NULL(struct iwic_softc *sc)
93 {
94         NDBGL1(L1_F_MSG, "FSM function F_NULL executing");
95 }
96
97 /*---------------------------------------------------------------------------*
98  *
99  *---------------------------------------------------------------------------*/
100 static void
101 F_AR(struct iwic_softc *sc)
102 {
103         NDBGL1(L1_F_MSG, "FSM function F_AR executing");
104         IWIC_WRITE(sc, CIX, CIX_ECK);
105 }
106
107 /*---------------------------------------------------------------------------*
108  *
109  *---------------------------------------------------------------------------*/
110 static void
111 F_AR3(struct iwic_softc *sc)
112 {
113         NDBGL1(L1_F_MSG, "FSM function F_AR3 executing");
114         IWIC_WRITE(sc, CIX, CIX_AR8);
115 }
116
117 /*---------------------------------------------------------------------------*
118  *
119  *---------------------------------------------------------------------------*/
120 static void
121 F_I0I(struct iwic_softc *sc)
122 {
123         NDBGL1(L1_F_MSG, "FSM function F_IOI executing");
124 }
125
126 /*---------------------------------------------------------------------------*
127  *
128  *---------------------------------------------------------------------------*/
129 static void
130 F_I0A(struct iwic_softc *sc)
131 {
132         NDBGL1(L1_F_MSG, "FSM function F_IOA executing");
133         iwic_dchan_disable(sc);
134         i4b_l1_ph_deactivate_ind(L0IWICUNIT(sc->sc_unit));
135 }
136
137 /*---------------------------------------------------------------------------*
138  *
139  *---------------------------------------------------------------------------*/
140 static void
141 F_AI8(struct iwic_softc *sc)
142 {
143         NDBGL1(L1_F_MSG, "FSM function F_AI8 executing");
144         iwic_dchan_transmit(sc);
145         i4b_l1_ph_activate_ind(L0IWICUNIT(sc->sc_unit));
146 }
147
148 /*---------------------------------------------------------------------------*
149  *
150  *---------------------------------------------------------------------------*/
151 static void
152 F_AI10(struct iwic_softc *sc)
153 {
154         NDBGL1(L1_F_MSG, "FSM function F_AI10 executing");
155         iwic_dchan_transmit(sc);
156         i4b_l1_ph_activate_ind(L0IWICUNIT(sc->sc_unit));
157 }
158
159 /*---------------------------------------------------------------------------*
160  *
161  *---------------------------------------------------------------------------*/
162 struct iwic_state_tab {
163         void (*func) (struct iwic_softc *sc);   /* function to execute */
164         int newstate;                           /* next state */
165 } iwic_state_tab[N_EVENTS][N_STATES] = {
166
167 /* STATE:       F3N                  F3                  F4                  F5                  F6                  F7                  F8                  ILLEGAL STATE        */
168 /* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ */
169 /* 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 }},
170 /* 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 }},
171 /* 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 }},
172 /* 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 }},
173 /* 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 }},
174 /* 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 }},
175 /* 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 }},
176 /* 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 }},
177 /* 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 }},
178 /* 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 }},
179 /* 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 }},
180 /* 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 }},
181 /* 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 }},
182 };
183
184 /*---------------------------------------------------------------------------*
185  *
186  *---------------------------------------------------------------------------*/
187 void
188 iwic_next_state(struct iwic_softc *sc, int event)
189 {
190         int currstate, newstate;
191
192         NDBGL1(L1_F_MSG, "event %s", event_names[event]);
193
194         if (event >= N_EVENTS)
195         {
196                 kprintf("iwic_next_state: event >= N_EVENTS\n");
197                 return;
198         }
199
200         currstate = sc->sc_I430state;
201
202         newstate = iwic_state_tab[event][currstate].newstate;
203         if (newstate >= N_STATES)
204         {
205                 kprintf("iwic_next_state: newstate >= N_STATES\n");
206                 return;
207         }
208
209         NDBGL1(L1_F_MSG, "state %s -> %s",
210                 state_names[currstate], state_names[newstate]);
211
212         sc->sc_I430state = newstate;
213
214         (*iwic_state_tab[event][currstate].func) (sc);
215 }
216
217 #if DO_I4B_DEBUG
218 /*---------------------------------------------------------------------------*
219  *      return pointer to current state description
220  *---------------------------------------------------------------------------*/
221 char *
222 iwic_printstate(struct iwic_softc *sc)
223 {
224         return((char *)state_names[sc->sc_I430state]);
225 }
226 #endif
227   
228 #endif