Line data Source code
1 : /* $OpenBSD: adw_pci.c,v 1.18 2017/09/08 05:36:52 deraadt Exp $ */
2 : /* $NetBSD: adw_pci.c,v 1.7 2000/05/26 15:13:46 dante Exp $ */
3 :
4 : /*
5 : * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
6 : * All rights reserved.
7 : *
8 : * Author: Baldassare Dante Profeta <dante@mclink.it>
9 : *
10 : * Redistribution and use in source and binary forms, with or without
11 : * modification, are permitted provided that the following conditions
12 : * are met:
13 : * 1. Redistributions of source code must retain the above copyright
14 : * notice, this list of conditions and the following disclaimer.
15 : * 2. Redistributions in binary form must reproduce the above copyright
16 : * notice, this list of conditions and the following disclaimer in the
17 : * documentation and/or other materials provided with the distribution.
18 : *
19 : * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 : * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 : * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 : * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 : * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 : * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 : * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 : * POSSIBILITY OF SUCH DAMAGE.
30 : */
31 : /*
32 : * Device probe and attach routines for the following
33 : * Advanced Systems Inc. SCSI controllers:
34 : *
35 : * ABP-940UW - Bus-Master PCI Ultra-Wide (253 CDB)
36 : * ABP-940UW (68) - Bus-Master PCI Ultra-Wide (253 CDB)
37 : * ABP-940UWD - Bus-Master PCI Ultra-Wide (253 CDB)
38 : * ABP-970UW - Bus-Master PCI Ultra-Wide (253 CDB)
39 : * ASB-3940UW - Bus-Master PCI Ultra-Wide (253 CDB)
40 : * ASB-3940U2W-00 - Bus-Master PCI Ultra2-Wide (253 CDB)
41 : * ASB-3940U3W-00 - Bus-Master PCI Ultra3-Wide (253 CDB)
42 : */
43 :
44 : #include <sys/param.h>
45 : #include <sys/systm.h>
46 : #include <sys/malloc.h>
47 : #include <sys/kernel.h>
48 : #include <sys/queue.h>
49 : #include <sys/device.h>
50 : #include <sys/timeout.h>
51 :
52 : #include <machine/bus.h>
53 :
54 : #include <scsi/scsi_all.h>
55 : #include <scsi/scsiconf.h>
56 :
57 : #include <dev/pci/pcireg.h>
58 : #include <dev/pci/pcivar.h>
59 : #include <dev/pci/pcidevs.h>
60 :
61 : #include <dev/ic/adwlib.h>
62 : #include <dev/microcode/adw/adwmcode.h>
63 : #include <dev/ic/adw.h>
64 :
65 : /******************************************************************************/
66 :
67 : #define PCI_BASEADR_IO 0x10
68 :
69 : /******************************************************************************/
70 :
71 : int adw_pci_match(struct device *, void *, void *);
72 : void adw_pci_attach(struct device *, struct device *, void *);
73 :
74 : struct cfattach adw_pci_ca =
75 : {
76 : sizeof(ADW_SOFTC), adw_pci_match, adw_pci_attach
77 : };
78 :
79 : const struct pci_matchid adw_pci_devices[] = {
80 : { PCI_VENDOR_ADVSYS, PCI_PRODUCT_ADVSYS_WIDE },
81 : { PCI_VENDOR_ADVSYS, PCI_PRODUCT_ADVSYS_U2W },
82 : { PCI_VENDOR_ADVSYS, PCI_PRODUCT_ADVSYS_U3W },
83 : };
84 :
85 : /******************************************************************************/
86 : /*
87 : * Check the slots looking for a board we recognise
88 : * If we find one, note its address (slot) and call
89 : * the actual probe routine to check it out.
90 : */
91 : int
92 0 : adw_pci_match(parent, match, aux)
93 : struct device *parent;
94 : void *match;
95 : void *aux;
96 : {
97 0 : return (pci_matchbyid((struct pci_attach_args *)aux, adw_pci_devices,
98 : nitems(adw_pci_devices)));
99 : }
100 :
101 :
102 : void
103 0 : adw_pci_attach(parent, self, aux)
104 : struct device *parent, *self;
105 : void *aux;
106 : {
107 0 : struct pci_attach_args *pa = aux;
108 0 : ADW_SOFTC *sc = (void *) self;
109 0 : bus_space_tag_t iot;
110 0 : bus_space_handle_t ioh;
111 0 : pci_intr_handle_t ih;
112 0 : pci_chipset_tag_t pc = pa->pa_pc;
113 : pcireg_t command;
114 : const char *intrstr;
115 :
116 : /*
117 : * Set chip type
118 : */
119 0 : switch (PCI_PRODUCT(pa->pa_id)) {
120 : case PCI_PRODUCT_ADVSYS_WIDE:
121 0 : sc->chip_type = ADW_CHIP_ASC3550;
122 0 : break;
123 :
124 : case PCI_PRODUCT_ADVSYS_U2W:
125 0 : sc->chip_type = ADW_CHIP_ASC38C0800;
126 0 : break;
127 :
128 : case PCI_PRODUCT_ADVSYS_U3W:
129 0 : sc->chip_type = ADW_CHIP_ASC38C1600;
130 0 : break;
131 :
132 : default:
133 0 : printf("\n%s: unknown model: %d\n", sc->sc_dev.dv_xname,
134 : PCI_PRODUCT(pa->pa_id));
135 0 : return;
136 : }
137 :
138 0 : command = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
139 0 : if ( (command & PCI_COMMAND_PARITY_ENABLE) == 0)
140 0 : sc->cfg.control_flag |= CONTROL_FLAG_IGNORE_PERR;
141 :
142 : /*
143 : * Map Device Registers for I/O
144 : */
145 0 : if (pci_mapreg_map(pa, PCI_BASEADR_IO, PCI_MAPREG_TYPE_IO, 0,
146 : &iot, &ioh, NULL, NULL, 0)) {
147 0 : printf("\n%s: unable to map device registers\n",
148 0 : sc->sc_dev.dv_xname);
149 0 : return;
150 : }
151 0 : sc->sc_iot = iot;
152 0 : sc->sc_ioh = ioh;
153 0 : sc->sc_dmat = pa->pa_dmat;
154 :
155 : /*
156 : * Initialize the board
157 : */
158 0 : if (adw_init(sc)) {
159 0 : printf("%s: adw_init failed", sc->sc_dev.dv_xname);
160 0 : return;
161 : }
162 :
163 : /*
164 : * Map Interrupt line
165 : */
166 0 : if (pci_intr_map(pa, &ih)) {
167 0 : printf("\n%s: couldn't map interrupt\n", sc->sc_dev.dv_xname);
168 0 : return;
169 : }
170 0 : intrstr = pci_intr_string(pc, ih);
171 :
172 : /*
173 : * Establish Interrupt handler
174 : */
175 0 : sc->sc_ih = pci_intr_establish(pc, ih, IPL_BIO, adw_intr, sc,
176 0 : sc->sc_dev.dv_xname);
177 0 : if (sc->sc_ih == NULL) {
178 0 : printf("\n%s: couldn't establish interrupt", sc->sc_dev.dv_xname);
179 0 : if (intrstr != NULL)
180 0 : printf(" at %s", intrstr);
181 0 : printf("\n");
182 0 : return;
183 : }
184 0 : printf(": %s\n", intrstr);
185 :
186 : /*
187 : * Attach all the sub-devices we can find
188 : */
189 0 : adw_attach(sc);
190 0 : }
191 : /******************************************************************************/
|