This source file includes following definitions.
- sli_pci_match
- sli_pci_attach
- sli_pci_detach
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
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 }