This source file includes following definitions.
- bha_pci_match
- bha_pci_attach
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #include <sys/types.h>
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/device.h>
44
45 #include <machine/bus.h>
46 #include <machine/intr.h>
47
48 #include <scsi/scsi_all.h>
49 #include <scsi/scsiconf.h>
50
51 #include <dev/pci/pcivar.h>
52 #include <dev/pci/pcidevs.h>
53
54 #include <dev/ic/bhareg.h>
55 #include <dev/ic/bhavar.h>
56
57 #define PCI_CBIO 0x10
58
59 int bha_pci_match(struct device *, void *, void *);
60 void bha_pci_attach(struct device *, struct device *, void *);
61
62 struct cfattach bha_pci_ca = {
63 sizeof(struct bha_softc), bha_pci_match, bha_pci_attach
64 };
65
66 const struct pci_matchid bha_pci_devices[] = {
67 { PCI_VENDOR_BUSLOGIC, PCI_PRODUCT_BUSLOGIC_MULTIMASTER_NC },
68 { PCI_VENDOR_BUSLOGIC, PCI_PRODUCT_BUSLOGIC_MULTIMASTER },
69 };
70
71
72
73
74
75
76 int
77 bha_pci_match(parent, match, aux)
78 struct device *parent;
79 void *match, *aux;
80 {
81 struct pci_attach_args *pa = aux;
82 bus_space_tag_t iot;
83 bus_space_handle_t ioh;
84 bus_size_t iosize;
85 int rv;
86
87 if (pci_matchbyid(pa, bha_pci_devices,
88 sizeof(bha_pci_devices)/sizeof(bha_pci_devices[0])) == 0)
89 return (0);
90
91 if (pci_mapreg_map(pa, PCI_CBIO, PCI_MAPREG_TYPE_IO, 0, &iot, &ioh,
92 NULL, &iosize, 0))
93 return (0);
94
95 rv = bha_find(iot, ioh, NULL);
96 bus_space_unmap(iot, ioh, iosize);
97
98 return (rv);
99 }
100
101
102
103
104 void
105 bha_pci_attach(parent, self, aux)
106 struct device *parent, *self;
107 void *aux;
108 {
109 struct pci_attach_args *pa = aux;
110 struct bha_softc *sc = (void *)self;
111 bus_space_tag_t iot;
112 bus_space_handle_t ioh;
113 bus_size_t iosize;
114 struct bha_probe_data bpd;
115 pci_chipset_tag_t pc = pa->pa_pc;
116 pci_intr_handle_t ih;
117 const char *model, *intrstr;
118
119 if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_BUSLOGIC_MULTIMASTER_NC)
120 model = "BusLogic 9xxC SCSI";
121 else if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_BUSLOGIC_MULTIMASTER)
122 model = "BusLogic 9xxC SCSI";
123 else
124 model = "unknown model!";
125
126 if (pci_mapreg_map(pa, PCI_CBIO, PCI_MAPREG_TYPE_IO, 0, &iot, &ioh,
127 NULL, &iosize, 0)) {
128 printf(": unable to map I/O space\n");
129 return;
130 }
131
132 sc->sc_iot = iot;
133 sc->sc_ioh = ioh;
134 sc->sc_dmat = pa->pa_dmat;
135 if (!bha_find(iot, ioh, &bpd)) {
136 printf(": bha_find failed\n");
137 bus_space_unmap(iot, ioh, iosize);
138 return;
139 }
140
141 sc->sc_dmaflags = 0;
142
143 if (pci_intr_map(pa, &ih)) {
144 printf(": couldn't map interrupt\n");
145 bus_space_unmap(iot, ioh, iosize);
146 return;
147 }
148 intrstr = pci_intr_string(pc, ih);
149 sc->sc_ih = pci_intr_establish(pc, ih, IPL_BIO, bha_intr, sc,
150 sc->sc_dev.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(iot, ioh, iosize);
157 return;
158 }
159 printf(": %s, %s\n", intrstr, model);
160
161 bha_attach(sc, &bpd);
162
163 bha_disable_isacompat(sc);
164 }