This source file includes following definitions.
- lemac_isa_find
- lemac_isa_probe
- lemac_isa_attach
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #include "bpfilter.h"
37
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/mbuf.h>
41 #include <sys/socket.h>
42 #include <sys/ioctl.h>
43 #include <sys/errno.h>
44 #include <sys/syslog.h>
45 #include <sys/selinfo.h>
46 #include <sys/device.h>
47 #include <sys/queue.h>
48
49 #include <net/if.h>
50 #include <net/if_dl.h>
51 #include <net/if_media.h>
52
53 #ifdef INET
54 #include <netinet/in.h>
55 #include <netinet/in_systm.h>
56 #include <netinet/in_var.h>
57 #include <netinet/ip.h>
58 #include <netinet/if_ether.h>
59 #endif
60
61 #if NBPFILTER > 0
62 #include <net/bpf.h>
63 #endif
64
65 #include <machine/cpu.h>
66 #include <machine/bus.h>
67 #include <machine/intr.h>
68
69 #include <dev/ic/lemacreg.h>
70 #include <dev/ic/lemacvar.h>
71
72 #include <dev/isa/isavar.h>
73
74 extern struct cfdriver lc_cd;
75
76 int lemac_isa_find(struct lemac_softc *, struct isa_attach_args *,
77 int);
78 int lemac_isa_probe(struct device *, void *, void *);
79 void lemac_isa_attach(struct device *, struct device *, void *);
80
81 struct cfattach lc_isa_ca = {
82 sizeof(struct lemac_softc), lemac_isa_probe, lemac_isa_attach
83 };
84
85 int
86 lemac_isa_find(sc, ia, attach)
87 struct lemac_softc *sc;
88 struct isa_attach_args *ia;
89 int attach;
90 {
91 bus_addr_t maddr;
92 bus_size_t msize;
93 int rv = 0, irq;
94
95
96
97
98 if (ia->ia_iobase == IOBASEUNK)
99 return 0;
100
101
102
103
104 if (ia->ia_iobase & (LEMAC_IOSIZE - 1))
105 return 0;
106
107 sc->sc_iot = ia->ia_iot;
108
109
110
111
112 ia->ia_iosize = LEMAC_IOSIZE;
113
114 if (bus_space_map(sc->sc_iot, ia->ia_iobase, ia->ia_iosize, 0,
115 &sc->sc_ioh)) {
116 if (attach)
117 printf(": can't map i/o space\n");
118 return (0);
119 }
120
121
122
123
124
125
126 if (lemac_port_check(sc->sc_iot, sc->sc_ioh) == 0)
127 goto outio;
128
129
130
131
132 lemac_info_get(sc->sc_iot, sc->sc_ioh, &maddr, &msize, &irq);
133
134 if (ia->ia_maddr != maddr && ia->ia_maddr != MADDRUNK)
135 goto outio;
136
137 if (maddr != 0 && msize != 0) {
138 sc->sc_memt = ia->ia_memt;
139 if (bus_space_map(ia->ia_memt, maddr, msize, 0,
140 &sc->sc_memh)) {
141 if (attach)
142 printf(": can't map mem space\n");
143 goto outio;
144 }
145 }
146
147
148
149
150 if (ia->ia_irq != irq && ia->ia_irq != IRQUNK)
151 printf("%s: overriding IRQ %d to %d\n", sc->sc_dv.dv_xname,
152 ia->ia_irq, irq);
153
154 if (attach) {
155 sc->sc_ats = shutdownhook_establish(lemac_shutdown, sc);
156 if (sc->sc_ats == NULL)
157 printf(
158 "\n%s: warning: can't establish shutdown hook\n",
159 sc->sc_dv.dv_xname);
160
161 lemac_ifattach(sc);
162
163 sc->sc_ih = isa_intr_establish(ia->ia_ic, irq, IST_EDGE,
164 IPL_NET, lemac_intr, sc, sc->sc_dv.dv_xname);
165 }
166
167
168
169
170 rv = 1;
171
172 ia->ia_maddr = maddr;
173 ia->ia_msize = msize;
174 ia->ia_irq = irq;
175
176 if (maddr != 0 && msize != 0 && (rv == 0 || !attach))
177 bus_space_unmap(sc->sc_memt, sc->sc_memh, msize);
178 outio:
179 if (rv == 0 || !attach)
180 bus_space_unmap(sc->sc_iot, sc->sc_ioh, LEMAC_IOSIZE);
181 return (rv);
182 }
183
184 int
185 lemac_isa_probe(parent, match, aux)
186 struct device *parent;
187 void *match;
188 void *aux;
189 {
190 struct isa_attach_args *ia = aux;
191 struct cfdata *cf = match;
192 struct lemac_softc sc;
193
194 snprintf(sc.sc_dv.dv_xname, sizeof sc.sc_dv.dv_xname, "%s%d",
195 lc_cd.cd_name, cf->cf_unit);
196
197 return (lemac_isa_find(&sc, ia, 0));
198 }
199
200 void
201 lemac_isa_attach(parent, self, aux)
202 struct device *parent;
203 struct device *self;
204 void *aux;
205 {
206 struct lemac_softc *sc = (void *)self;
207 struct isa_attach_args *ia = aux;
208
209 lemac_isa_find(sc, ia, 1);
210 }