Annotation of sys/dev/pci/if_fpa.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: if_fpa.c,v 1.24 2005/09/11 18:17:08 mickey Exp $ */
! 2: /* $NetBSD: if_fpa.c,v 1.15 1996/10/21 22:56:40 thorpej Exp $ */
! 3:
! 4: /*-
! 5: * Copyright (c) 1995, 1996 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: * Id: if_fpa.c,v 1.8 1996/05/17 01:15:18 thomas Exp
! 28: *
! 29: */
! 30:
! 31: /*
! 32: * DEC PDQ FDDI Controller; code for BSD derived operating systems
! 33: *
! 34: * This module supports the DEC DEFPA PCI FDDI Controller
! 35: */
! 36:
! 37:
! 38: #include <sys/param.h>
! 39: #include <sys/kernel.h>
! 40: #include <sys/mbuf.h>
! 41: #include <sys/protosw.h>
! 42: #include <sys/socket.h>
! 43: #include <sys/ioctl.h>
! 44: #include <sys/errno.h>
! 45: #include <sys/malloc.h>
! 46: #include <sys/device.h>
! 47:
! 48: #include <net/if.h>
! 49: #include <net/if_types.h>
! 50: #include <net/if_dl.h>
! 51: #include <net/route.h>
! 52:
! 53: #include "bpfilter.h"
! 54: #if NBPFILTER > 0
! 55: #include <net/bpf.h>
! 56: #endif
! 57:
! 58: #ifdef INET
! 59: #include <netinet/in.h>
! 60: #include <netinet/if_ether.h>
! 61: #endif
! 62: #include <net/if_fddi.h>
! 63:
! 64: #include <dev/pci/pcidevs.h>
! 65: #include <dev/pci/pcivar.h>
! 66: #include <dev/ic/pdqvar.h>
! 67: #include <dev/ic/pdqreg.h>
! 68:
! 69: #define DEFPA_LATENCY 0x88
! 70: #define DEFPA_CBMA (PCI_MAPREG_START + 0) /* Config Base Memory Address */
! 71: #define DEFPA_CBIO (PCI_MAPREG_START + 4) /* Config Base I/O Address */
! 72:
! 73: int pdq_pci_ifintr(void *);
! 74: int pdq_pci_match(struct device *, void *, void *);
! 75: void pdq_pci_attach(struct device *, struct device *, void *aux);
! 76:
! 77: int
! 78: pdq_pci_ifintr(arg)
! 79: void *arg;
! 80: {
! 81: pdq_softc_t *sc = (pdq_softc_t *)arg;
! 82: (void) pdq_interrupt(sc->sc_pdq);
! 83: return (1);
! 84: }
! 85:
! 86: int
! 87: pdq_pci_match(parent, match, aux)
! 88: struct device *parent;
! 89: void *match;
! 90: void *aux;
! 91: {
! 92: struct pci_attach_args *pa = (struct pci_attach_args *)aux;
! 93:
! 94: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_DEC &&
! 95: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_DEC_DEFPA)
! 96: return (1);
! 97: return (0);
! 98: }
! 99:
! 100: void
! 101: pdq_pci_attach(parent, self, aux)
! 102: struct device *parent;
! 103: struct device *self;
! 104: void *aux;
! 105: {
! 106: pdq_softc_t *sc = (pdq_softc_t *)self;
! 107: struct pci_attach_args *pa = (struct pci_attach_args *)aux;
! 108: u_int32_t data;
! 109: pci_intr_handle_t intrhandle;
! 110: const char *intrstr;
! 111: bus_size_t csrsize;
! 112:
! 113: data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG);
! 114: if (PCI_LATTIMER(data) < DEFPA_LATENCY) {
! 115: data &= ~(PCI_LATTIMER_MASK << PCI_LATTIMER_SHIFT);
! 116: data |= (DEFPA_LATENCY & PCI_LATTIMER_MASK)
! 117: << PCI_LATTIMER_SHIFT;
! 118: pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG, data);
! 119: }
! 120:
! 121: bcopy(sc->sc_dev.dv_xname, sc->sc_if.if_xname, IFNAMSIZ);
! 122: sc->sc_if.if_flags = 0;
! 123: sc->sc_if.if_softc = sc;
! 124:
! 125: /*
! 126: * NOTE: sc_bc is an alias for sc_csrtag and sc_membase is an
! 127: * alias for sc_csrhandle. sc_iobase is not used in this front-end.
! 128: */
! 129: #ifdef PDQ_IOMAPPED
! 130: if (pci_mapreg_map(pa, DEFPA_CBIO, PCI_MAPREG_TYPE_IO, 0,
! 131: &sc->sc_csrtag, &sc->sc_csrhandle, NULL, &csrsize, 0)) {
! 132: printf(": can't map I/O space!\n");
! 133: return;
! 134: }
! 135: #else
! 136: if (pci_mapreg_map(pa, DEFPA_CBMA, PCI_MAPREG_TYPE_MEM, 0,
! 137: &sc->sc_csrtag, &sc->sc_csrhandle, NULL, &csrsize, 0)) {
! 138: printf(": can't map memory space!\n");
! 139: return;
! 140: }
! 141: #endif
! 142:
! 143: if (pci_intr_map(pa, &intrhandle)) {
! 144: printf(": couldn't map interrupt\n");
! 145: bus_space_unmap(sc->sc_csrtag, sc->sc_csrhandle, csrsize);
! 146: return;
! 147: }
! 148: intrstr = pci_intr_string(pa->pa_pc, intrhandle);
! 149: sc->sc_ih = pci_intr_establish(pa->pa_pc, intrhandle, IPL_NET,
! 150: pdq_pci_ifintr, sc, self->dv_xname);
! 151: if (sc->sc_ih == NULL) {
! 152: printf(": couldn't establish interrupt");
! 153: if (intrstr != NULL)
! 154: printf(" at %s", intrstr);
! 155: printf("\n");
! 156: bus_space_unmap(sc->sc_csrtag, sc->sc_csrhandle, csrsize);
! 157: return;
! 158: }
! 159: if (intrstr != NULL)
! 160: printf(": %s\n", intrstr);
! 161:
! 162: sc->sc_pdq = pdq_initialize(sc->sc_csrtag, sc->sc_csrhandle,
! 163: sc->sc_if.if_xname, 0, (void *) sc, PDQ_DEFPA);
! 164: if (sc->sc_pdq == NULL) {
! 165: printf(": initialization failed\n");
! 166: bus_space_unmap(sc->sc_csrtag, sc->sc_csrhandle, csrsize);
! 167: return;
! 168: }
! 169:
! 170: bcopy((caddr_t) sc->sc_pdq->pdq_hwaddr.lanaddr_bytes,
! 171: sc->sc_arpcom.ac_enaddr, 6);
! 172: pdq_ifattach(sc, NULL);
! 173:
! 174: sc->sc_ats = shutdownhook_establish((void (*)(void *)) pdq_hwreset,
! 175: sc->sc_pdq);
! 176: if (sc->sc_ats == NULL)
! 177: printf("%s: warning: couldn't establish shutdown hook\n",
! 178: self->dv_xname);
! 179: }
! 180:
! 181: struct cfattach fpa_ca = {
! 182: sizeof(pdq_softc_t), pdq_pci_match, pdq_pci_attach
! 183: };
! 184:
! 185: struct cfdriver fpa_cd = {
! 186: 0, "fpa", DV_IFNET
! 187: };
CVSweb