Annotation of sys/dev/isa/if_lc_isa.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: if_lc_isa.c,v 1.7 2005/11/21 18:16:40 millert Exp $ */
2: /* $NetBSD: if_lc_isa.c,v 1.10 2001/06/13 10:46:03 wiz Exp $ */
3:
4: /*-
5: * Copyright (c) 1994, 1995, 1997 Matt Thomas <matt@3am-software.com>
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. The name of the author may not be used to endorse or promote products
14: * derived from this software without specific prior written permission
15: *
16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26: */
27:
28: /*
29: * DEC EtherWORKS 3 Ethernet Controllers
30: *
31: * Written by Matt Thomas
32: *
33: * This driver supports the LEMAC (DE203, DE204, and DE205) cards.
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: * Disallow wildcarded i/o addresses.
97: */
98: if (ia->ia_iobase == IOBASEUNK)
99: return 0;
100:
101: /*
102: * Make sure this is a valid LEMAC address.
103: */
104: if (ia->ia_iobase & (LEMAC_IOSIZE - 1))
105: return 0;
106:
107: sc->sc_iot = ia->ia_iot;
108:
109: /*
110: * Map the LEMAC's port space for the probe sequence.
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: * Read the Ethernet address from the EEPROM.
123: * It must start with one of the DEC OUIs and pass the
124: * DEC ethernet checksum test.
125: */
126: if (lemac_port_check(sc->sc_iot, sc->sc_ioh) == 0)
127: goto outio;
128:
129: /*
130: * Get information about memory space and attempt to map it.
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: * Double-check IRQ configuration.
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: * I guess we've found one.
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: }
CVSweb