root/dev/pci/if_fpa.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pdq_pci_ifintr
  2. pdq_pci_match
  3. pdq_pci_attach

    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 };

/* [<][>][^][v][top][bottom][index][help] */