root/dev/pci/sli_pci.c

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

DEFINITIONS

This source file includes following definitions.
  1. sli_pci_match
  2. sli_pci_attach
  3. sli_pci_detach

    1 /*      $OpenBSD: sli_pci.c,v 1.4 2007/05/19 04:10:20 dlg Exp $ */
    2 
    3 /*
    4  * Copyright (c) 2007 David Gwynne <dlg@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 #include <sys/param.h>
   20 #include <sys/systm.h>
   21 #include <sys/kernel.h>
   22 #include <sys/malloc.h>
   23 #include <sys/device.h>
   24 
   25 #include <machine/bus.h>
   26 
   27 #include <dev/pci/pcireg.h>
   28 #include <dev/pci/pcivar.h>
   29 #include <dev/pci/pcidevs.h>
   30 
   31 #include <scsi/scsi_all.h>
   32 #include <scsi/scsiconf.h>
   33 
   34 #include <dev/ic/slireg.h>
   35 #include <dev/ic/slivar.h>
   36 
   37 int     sli_pci_match(struct device *, void *, void *);
   38 void    sli_pci_attach(struct device *, struct device *, void *);
   39 int     sli_pci_detach(struct device *, int);
   40 
   41 struct sli_pci_softc {
   42         struct sli_softc        psc_sli;
   43 
   44         pci_chipset_tag_t       psc_pc;
   45         pcitag_t                psc_tag;
   46 
   47         void                    *psc_ih;
   48 };
   49 
   50 struct cfattach sli_pci_ca = {
   51         sizeof(struct sli_pci_softc),
   52         sli_pci_match,
   53         sli_pci_attach,
   54         sli_pci_detach
   55 };
   56 
   57 static const struct pci_matchid sli_pci_devices[] = {
   58         { PCI_VENDOR_EMULEX,    PCI_PRODUCT_EMULEX_LP8000 }
   59 };
   60 
   61 int
   62 sli_pci_match(struct device *parent, void *match, void *aux)
   63 {
   64         return (pci_matchbyid((struct pci_attach_args *)aux, sli_pci_devices,
   65             sizeof(sli_pci_devices) / sizeof(sli_pci_devices[0])));
   66 }
   67 
   68 void
   69 sli_pci_attach(struct device *parent, struct device *self, void *aux)
   70 {
   71         struct sli_pci_softc            *psc = (struct sli_pci_softc *)self;
   72         struct sli_softc                *sc = &psc->psc_sli;
   73         struct pci_attach_args          *pa = aux;
   74         pcireg_t                        memtype;
   75         pci_intr_handle_t               ih;
   76 
   77         psc->psc_pc = pa->pa_pc;
   78         psc->psc_tag = pa->pa_tag;
   79         psc->psc_ih = NULL;
   80         sc->sc_dmat = pa->pa_dmat;
   81         sc->sc_ios_slim = 0;
   82         sc->sc_ios_reg = 0;
   83 
   84         memtype = pci_mapreg_type(psc->psc_pc, psc->psc_tag,
   85             SLI_PCI_BAR_SLIM);
   86         if (pci_mapreg_map(pa, SLI_PCI_BAR_SLIM, memtype, 0,
   87             &sc->sc_iot_slim, &sc->sc_ioh_slim, NULL,
   88             &sc->sc_ios_slim, 0) != 0) {
   89                 printf(": unable to map SLIM bar\n");
   90                 return;
   91         }
   92 
   93         memtype = pci_mapreg_type(psc->psc_pc, psc->psc_tag,
   94             SLI_PCI_BAR_REGISTER);
   95         if (pci_mapreg_map(pa, SLI_PCI_BAR_REGISTER, memtype, 0,
   96             &sc->sc_iot_reg, &sc->sc_ioh_reg, NULL,
   97             &sc->sc_ios_reg, 0) != 0) {
   98                 printf(": unable to map REGISTER bar\n");
   99                 goto unmap_slim;
  100         }
  101 
  102         if (pci_intr_map(pa, &ih)) {
  103                 printf(": unable to map interrupt\n");
  104                 goto unmap_reg;
  105         }
  106         printf(": %s", pci_intr_string(psc->psc_pc, ih));
  107 
  108         if (sli_attach(sc) != 0) {
  109                 /* error already printed by sli_attach() */
  110                 goto unmap_reg;
  111         }
  112 
  113         psc->psc_ih = pci_intr_establish(psc->psc_pc, ih, IPL_BIO,
  114             sli_intr, sc, DEVNAME(sc));
  115         if (psc->psc_ih == NULL) {
  116                 printf("%s: unable to establish interrupt\n");
  117                 goto detach;
  118         }
  119 
  120         return;
  121 
  122 detach:
  123         sli_detach(sc, DETACH_FORCE|DETACH_QUIET);
  124 unmap_reg:
  125         bus_space_unmap(sc->sc_iot_reg, sc->sc_ioh_reg, sc->sc_ios_reg);
  126         sc->sc_ios_reg = 0;
  127 unmap_slim:
  128         bus_space_unmap(sc->sc_iot_slim, sc->sc_ioh_slim, sc->sc_ios_slim);
  129         sc->sc_ios_slim = 0;
  130 }
  131 
  132 int
  133 sli_pci_detach(struct device *self, int flags)
  134 {
  135         struct sli_pci_softc            *psc = (struct sli_pci_softc *)self;
  136         struct sli_softc                *sc = &psc->psc_sli;
  137         int                             rv;
  138 
  139         rv = sli_detach(sc, flags);
  140         if (rv != 0)
  141                 return (rv);
  142 
  143         return (0);
  144 }

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