root/dev/pci/if_malo_pci.c

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

DEFINITIONS

This source file includes following definitions.
  1. malo_pci_match
  2. malo_pci_attach
  3. malo_pci_detach

    1 /*      $OpenBSD: if_malo_pci.c,v 1.3 2006/12/29 07:17:53 mglocker Exp $ */
    2 
    3 /*
    4  * Copyright (c) 2006 Marcus Glocker <mglocker@openbsd.org>
    5  *
    6  * Permission to use, copy, modify, and distribute this software for any
    7  * purpose with or without fee is hereby granted, provided that the above
    8  * copyright notice and this permission notice appear in all copies.
    9  *
   10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   17  */
   18 
   19 /*
   20  * PCI front-end for the Marvell Libertas
   21  */
   22 
   23 #include "bpfilter.h"
   24 
   25 #include <sys/param.h>
   26 #include <sys/sockio.h>
   27 #include <sys/mbuf.h>
   28 #include <sys/kernel.h>
   29 #include <sys/socket.h>
   30 #include <sys/systm.h>
   31 #include <sys/malloc.h>
   32 #include <sys/timeout.h>
   33 #include <sys/device.h>
   34 
   35 #include <machine/bus.h>
   36 #include <machine/intr.h>
   37 
   38 #include <net/if.h>
   39 #include <net/if_dl.h>
   40 #include <net/if_media.h>
   41 
   42 #include <netinet/in.h>
   43 #include <netinet/if_ether.h>
   44 
   45 #include <net80211/ieee80211_var.h>
   46 #include <net80211/ieee80211_radiotap.h>
   47 
   48 #include <dev/ic/malo.h>
   49 
   50 #include <dev/pci/pcireg.h>
   51 #include <dev/pci/pcivar.h>
   52 #include <dev/pci/pcidevs.h>
   53 
   54 /* Base Address Register */
   55 #define MALO_PCI_BAR1   0x10
   56 #define MALO_PCI_BAR2   0x14
   57 
   58 int     malo_pci_match(struct device *, void *, void *);
   59 void    malo_pci_attach(struct device *, struct device *, void *);
   60 int     malo_pci_detach(struct device *, int);
   61 
   62 struct malo_pci_softc {
   63         struct malo_softc       sc_malo;
   64 
   65         pci_chipset_tag_t        sc_pc;
   66         void                    *sc_ih;
   67 
   68         bus_size_t               sc_mapsize1;
   69         bus_size_t               sc_mapsize2;
   70 };
   71 
   72 struct cfattach malo_pci_ca = {
   73         sizeof(struct malo_pci_softc), malo_pci_match, malo_pci_attach,
   74         malo_pci_detach
   75 };
   76 
   77 const struct pci_matchid malo_pci_devices[] = {
   78         { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_88W8310 },
   79         { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_88W8335_1 },
   80         { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_88W8335_2 }
   81 };
   82 
   83 int
   84 malo_pci_match(struct device *parent, void *match, void *aux)
   85 {
   86         return (pci_matchbyid((struct pci_attach_args *)aux, malo_pci_devices,
   87             sizeof(malo_pci_devices) / sizeof(malo_pci_devices[0])));
   88 }
   89 
   90 void
   91 malo_pci_attach(struct device *parent, struct device *self, void *aux)
   92 {
   93         struct malo_pci_softc *psc = (struct malo_pci_softc *)self;
   94         struct pci_attach_args *pa = aux;
   95         struct malo_softc *sc = &psc->sc_malo;
   96         const char *intrstr = NULL;
   97         pci_intr_handle_t ih;
   98         int error;
   99 
  100         sc->sc_dmat = pa->pa_dmat;
  101         psc->sc_pc = pa->pa_pc;
  102 
  103         /* map control / status registers */
  104         error = pci_mapreg_map(pa, MALO_PCI_BAR1,
  105             PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT, 0,
  106             &sc->sc_mem1_bt, &sc->sc_mem1_bh, NULL, &psc->sc_mapsize1, 0);
  107         if (error != 0) {
  108                 printf(": could not map 1st memory space\n");
  109                 return;
  110         }
  111 
  112         /* map control / status registers */
  113         error = pci_mapreg_map(pa, MALO_PCI_BAR2,
  114             PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT, 0,
  115             &sc->sc_mem2_bt, &sc->sc_mem2_bh, NULL, &psc->sc_mapsize2, 0);
  116         if (error != 0) {
  117                 printf(": could not map 2nd memory space\n");
  118                 return;
  119         }
  120 
  121         /* map interrupt */
  122         if (pci_intr_map(pa, &ih) != 0) {
  123                 printf(": could not map interrupt\n");
  124                 return;
  125         }
  126 
  127         /* establish interrupt */
  128         intrstr = pci_intr_string(psc->sc_pc, ih);
  129         psc->sc_ih = pci_intr_establish(psc->sc_pc, ih, IPL_NET, malo_intr, sc,
  130             sc->sc_dev.dv_xname);
  131         if (psc->sc_ih == NULL) {
  132                 printf(": could not establish interrupt");
  133                 if (intrstr != NULL)
  134                         printf(" at %s", intrstr);
  135                 printf("\n");
  136                 return;
  137         }
  138         printf(": %s", intrstr);
  139 
  140         malo_attach(sc);
  141 }
  142 
  143 int
  144 malo_pci_detach(struct device *self, int flags)
  145 {
  146         struct malo_pci_softc *psc = (struct malo_pci_softc *)self;
  147         struct malo_softc *sc = &psc->sc_malo;
  148 
  149         malo_detach(sc);
  150         pci_intr_disestablish(psc->sc_pc, psc->sc_ih);
  151 
  152         return (0);
  153 }

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