Annotation of sys/dev/isa/if_lc_isa.c, Revision 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