1 1.22 chs /* $NetBSD: nca_isa.c,v 1.22 2012/10/27 17:18:25 chs Exp $ */ 2 1.1 mycroft 3 1.1 mycroft /*- 4 1.3 mycroft * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. 5 1.1 mycroft * All rights reserved. 6 1.1 mycroft * 7 1.1 mycroft * This code is derived from software contributed to The NetBSD Foundation 8 1.1 mycroft * by John M. Ruschmeyer. 9 1.1 mycroft * 10 1.1 mycroft * Redistribution and use in source and binary forms, with or without 11 1.1 mycroft * modification, are permitted provided that the following conditions 12 1.1 mycroft * are met: 13 1.1 mycroft * 1. Redistributions of source code must retain the above copyright 14 1.1 mycroft * notice, this list of conditions and the following disclaimer. 15 1.1 mycroft * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 mycroft * notice, this list of conditions and the following disclaimer in the 17 1.1 mycroft * documentation and/or other materials provided with the distribution. 18 1.1 mycroft * 19 1.1 mycroft * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 mycroft * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 mycroft * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 mycroft * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 mycroft * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 mycroft * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 mycroft * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 mycroft * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 mycroft * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 mycroft * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 mycroft * POSSIBILITY OF SUCH DAMAGE. 30 1.1 mycroft */ 31 1.1 mycroft 32 1.1 mycroft /* 33 1.1 mycroft * FreeBSD generic NCR-5380/NCR-53C400 SCSI driver 34 1.1 mycroft * 35 1.1 mycroft * Copyright (C) 1994 Serge Vakulenko (vak (at) cronyx.ru) 36 1.1 mycroft * 37 1.1 mycroft * Redistribution and use in source and binary forms, with or without 38 1.1 mycroft * modification, are permitted provided that the following conditions 39 1.1 mycroft * are met: 40 1.1 mycroft * 1. Redistributions of source code must retain the above copyright 41 1.1 mycroft * notice, this list of conditions and the following disclaimer. 42 1.1 mycroft * 2. Redistributions in binary form must reproduce the above copyright 43 1.1 mycroft * notice, this list of conditions and the following disclaimer in the 44 1.1 mycroft * documentation and/or other materials provided with the distribution. 45 1.1 mycroft * 46 1.1 mycroft * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND 47 1.1 mycroft * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 48 1.1 mycroft * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 49 1.1 mycroft * ARE DISCLAIMED. IN NO EVENT SHALL THE DEVELOPERS BE LIABLE 50 1.1 mycroft * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 51 1.1 mycroft * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 52 1.1 mycroft * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 53 1.1 mycroft * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 54 1.1 mycroft * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 55 1.1 mycroft * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 56 1.1 mycroft * SUCH DAMAGE. 57 1.1 mycroft */ 58 1.8 lukem 59 1.8 lukem #include <sys/cdefs.h> 60 1.22 chs __KERNEL_RCSID(0, "$NetBSD: nca_isa.c,v 1.22 2012/10/27 17:18:25 chs Exp $"); 61 1.1 mycroft 62 1.1 mycroft #include <sys/param.h> 63 1.1 mycroft #include <sys/systm.h> 64 1.1 mycroft #include <sys/device.h> 65 1.1 mycroft #include <sys/buf.h> 66 1.1 mycroft 67 1.19 ad #include <sys/bus.h> 68 1.19 ad #include <sys/intr.h> 69 1.1 mycroft 70 1.1 mycroft #include <dev/scsipi/scsi_all.h> 71 1.1 mycroft #include <dev/scsipi/scsipi_all.h> 72 1.1 mycroft #include <dev/scsipi/scsiconf.h> 73 1.1 mycroft 74 1.1 mycroft #include <dev/isa/isavar.h> 75 1.1 mycroft #include <dev/isa/isadmavar.h> 76 1.1 mycroft 77 1.1 mycroft #include <dev/ic/ncr5380reg.h> 78 1.1 mycroft #include <dev/ic/ncr5380var.h> 79 1.1 mycroft #include <dev/ic/ncr53c400reg.h> 80 1.1 mycroft 81 1.4 mycroft struct nca_isa_softc { 82 1.4 mycroft struct ncr5380_softc sc_ncr5380; /* glue to MI code */ 83 1.4 mycroft 84 1.4 mycroft void *sc_ih; 85 1.4 mycroft int sc_irq; 86 1.4 mycroft int sc_options; 87 1.4 mycroft }; 88 1.4 mycroft 89 1.4 mycroft struct nca_isa_probe_data { 90 1.4 mycroft int sc_reg_offset; 91 1.4 mycroft int sc_host_type; 92 1.4 mycroft }; 93 1.1 mycroft 94 1.14 perry int nca_isa_find(bus_space_tag_t, bus_space_handle_t, bus_size_t, 95 1.14 perry struct nca_isa_probe_data *); 96 1.20 tsutsui int nca_isa_match(device_t, cfdata_t, void *); 97 1.20 tsutsui void nca_isa_attach(device_t, device_t, void *); 98 1.14 perry int nca_isa_test(bus_space_tag_t, bus_space_handle_t, bus_size_t); 99 1.1 mycroft 100 1.20 tsutsui CFATTACH_DECL_NEW(nca_isa, sizeof(struct nca_isa_softc), 101 1.12 thorpej nca_isa_match, nca_isa_attach, NULL, NULL); 102 1.1 mycroft 103 1.1 mycroft 104 1.1 mycroft /* Supported controller types */ 105 1.1 mycroft #define MAX_NCA_CONTROLLER 3 106 1.1 mycroft #define CTLR_NCR_5380 1 107 1.1 mycroft #define CTLR_NCR_53C400 2 108 1.1 mycroft #define CTLR_PAS16 3 109 1.1 mycroft 110 1.1 mycroft #define NCA_ISA_IOSIZE 16 111 1.1 mycroft #define MIN_DMA_LEN 128 112 1.1 mycroft 113 1.1 mycroft /* Options for disconnect/reselect, DMA, and interrupts. */ 114 1.1 mycroft #define NCA_NO_DISCONNECT 0xff 115 1.1 mycroft #define NCA_NO_PARITY_CHK 0xff00 116 1.1 mycroft #define NCA_FORCE_POLLING 0x10000 117 1.1 mycroft 118 1.1 mycroft 119 1.1 mycroft /* 120 1.2 mycroft * Initialization and test function used by nca_isa_find() 121 1.1 mycroft */ 122 1.1 mycroft int 123 1.20 tsutsui nca_isa_test(bus_space_tag_t iot, bus_space_handle_t ioh, bus_size_t reg_offset) 124 1.1 mycroft { 125 1.20 tsutsui 126 1.1 mycroft /* Reset the SCSI bus. */ 127 1.1 mycroft bus_space_write_1(iot, ioh, reg_offset + C80_ICR, SCI_ICMD_RST); 128 1.1 mycroft bus_space_write_1(iot, ioh, reg_offset + C80_ODR, 0); 129 1.1 mycroft /* Hold reset for at least 25 microseconds. */ 130 1.1 mycroft delay(500); 131 1.1 mycroft /* Check that status cleared. */ 132 1.1 mycroft if (bus_space_read_1(iot, ioh, reg_offset + C80_CSBR) != SCI_BUS_RST) { 133 1.1 mycroft #ifdef DEBUG 134 1.20 tsutsui printf("%s: reset status not cleared [0x%x]\n", 135 1.20 tsutsui __func__, bus_space_read_1(iot, ioh, reg_offset+C80_CSBR)); 136 1.1 mycroft #endif 137 1.1 mycroft bus_space_write_1(iot, ioh, reg_offset+C80_ICR, 0); 138 1.1 mycroft return 0; 139 1.1 mycroft } 140 1.1 mycroft /* Clear reset. */ 141 1.1 mycroft bus_space_write_1(iot, ioh, reg_offset + C80_ICR, 0); 142 1.1 mycroft /* Wait a Bus Clear Delay (800 ns + bus free delay 800 ns). */ 143 1.1 mycroft delay(16000); 144 1.1 mycroft 145 1.1 mycroft /* Read RPI port, resetting parity/interrupt state. */ 146 1.1 mycroft bus_space_read_1(iot, ioh, reg_offset + C80_RPIR); 147 1.1 mycroft 148 1.1 mycroft /* Test BSR: parity error, interrupt request and busy loss state 149 1.1 mycroft * should be cleared. */ 150 1.1 mycroft if (bus_space_read_1(iot, ioh, reg_offset + C80_BSR) & (SCI_CSR_PERR | 151 1.1 mycroft SCI_CSR_INT | SCI_CSR_DISC)) { 152 1.1 mycroft #ifdef DEBUG 153 1.20 tsutsui printf("%s: Parity/Interrupt/Busy not cleared [0x%x]\n", 154 1.20 tsutsui __func__, bus_space_read_1(iot, ioh, reg_offset+C80_BSR)); 155 1.1 mycroft #endif 156 1.1 mycroft return 0; 157 1.1 mycroft } 158 1.1 mycroft 159 1.1 mycroft /* We must have found one */ 160 1.1 mycroft return 1; 161 1.1 mycroft } 162 1.1 mycroft 163 1.1 mycroft 164 1.1 mycroft /* 165 1.1 mycroft * Look for the board 166 1.1 mycroft */ 167 1.1 mycroft int 168 1.20 tsutsui nca_isa_find(bus_space_tag_t iot, bus_space_handle_t ioh, 169 1.20 tsutsui bus_size_t max_offset, struct nca_isa_probe_data *epd) 170 1.1 mycroft { 171 1.1 mycroft /* 172 1.1 mycroft * We check for the existence of a board by trying to initialize it, 173 1.1 mycroft * Then sending the commands to reset the SCSI bus. 174 1.1 mycroft * (Unfortunately, this duplicates code which is already in the MI 175 1.1 mycroft * driver. Unavoidable as that code is not suited to this task.) 176 1.1 mycroft * This is largely stolen from FreeBSD. 177 1.1 mycroft */ 178 1.1 mycroft int cont_type; 179 1.1 mycroft bus_size_t base_offset, reg_offset = 0; 180 1.1 mycroft 181 1.1 mycroft /* 182 1.1 mycroft * Some notes: 183 1.1 mycroft * In the case of a port-mapped board, we should be pointing 184 1.1 mycroft * right at the chip registers (if they are there at all). 185 1.1 mycroft * For a memory-mapped card, we loop through the 16K paragraph, 186 1.1 mycroft * 8 bytes at a time, until we either find it or run out 187 1.1 mycroft * of region. This means we will probably be doing things like 188 1.1 mycroft * trying to write to ROMS, etc. Hopefully, this is not a problem. 189 1.1 mycroft */ 190 1.1 mycroft 191 1.1 mycroft for (base_offset = 0; base_offset < max_offset; base_offset += 0x08) { 192 1.1 mycroft #ifdef DEBUG 193 1.20 tsutsui printf("%s: testing offset 0x%x\n", __func__, (int)base_offset); 194 1.1 mycroft #endif 195 1.1 mycroft 196 1.1 mycroft /* See if anything is there */ 197 1.1 mycroft if (bus_space_read_1(iot, ioh, base_offset) == 0xff) 198 1.1 mycroft continue; 199 1.1 mycroft 200 1.1 mycroft /* Loop around for each board type */ 201 1.20 tsutsui for (cont_type = 1; cont_type <= MAX_NCA_CONTROLLER; 202 1.20 tsutsui cont_type++) { 203 1.1 mycroft /* Per-controller initialization */ 204 1.1 mycroft switch (cont_type) { 205 1.1 mycroft case CTLR_NCR_5380: 206 1.1 mycroft /* No special inits */ 207 1.1 mycroft reg_offset = 0; 208 1.1 mycroft break; 209 1.1 mycroft case CTLR_NCR_53C400: 210 1.1 mycroft /* Reset into 5380-compat. mode */ 211 1.1 mycroft bus_space_write_1(iot, ioh, 212 1.1 mycroft base_offset + C400_CSR, 213 1.1 mycroft C400_CSR_5380_ENABLE); 214 1.1 mycroft reg_offset = C400_5380_REG_OFFSET; 215 1.1 mycroft break; 216 1.1 mycroft case CTLR_PAS16: 217 1.1 mycroft /* Not currently supported */ 218 1.1 mycroft reg_offset = 0; 219 1.1 mycroft cont_type = 0; 220 1.1 mycroft continue; 221 1.1 mycroft } 222 1.1 mycroft 223 1.1 mycroft /* Initialize controller and bus */ 224 1.2 mycroft if (nca_isa_test(iot, ioh, base_offset+reg_offset)) { 225 1.1 mycroft epd->sc_reg_offset = base_offset; 226 1.1 mycroft epd->sc_host_type = cont_type; 227 1.1 mycroft return cont_type; /* This must be it */ 228 1.1 mycroft } 229 1.1 mycroft } 230 1.1 mycroft } 231 1.1 mycroft 232 1.1 mycroft /* If we got here, we didn't find one */ 233 1.1 mycroft return 0; 234 1.1 mycroft } 235 1.1 mycroft 236 1.1 mycroft 237 1.1 mycroft /* 238 1.1 mycroft * See if there is anything at the config'd address. 239 1.1 mycroft * If so, call the real probe to see what it is. 240 1.1 mycroft */ 241 1.1 mycroft int 242 1.20 tsutsui nca_isa_match(device_t parent, cfdata_t cf, void *aux) 243 1.1 mycroft { 244 1.1 mycroft struct isa_attach_args *ia = aux; 245 1.1 mycroft bus_space_tag_t iot = ia->ia_iot; 246 1.1 mycroft bus_space_tag_t memt = ia->ia_memt; 247 1.1 mycroft bus_space_handle_t ioh; 248 1.2 mycroft struct nca_isa_probe_data epd; 249 1.1 mycroft int rv = 0; 250 1.1 mycroft 251 1.9 thorpej if (ISA_DIRECT_CONFIG(ia)) 252 1.20 tsutsui return 0; 253 1.9 thorpej 254 1.1 mycroft /* See if we are looking for a port- or memory-mapped adapter */ 255 1.13 drochner if (ia->ia_nio > 0 || ia->ia_io[0].ir_addr != ISA_UNKNOWN_PORT) { 256 1.1 mycroft /* Port-mapped card */ 257 1.9 thorpej if (bus_space_map(iot, ia->ia_io[0].ir_addr, NCA_ISA_IOSIZE, 258 1.9 thorpej 0, &ioh)) 259 1.1 mycroft return 0; 260 1.1 mycroft 261 1.1 mycroft /* See if a 53C80/53C400 is there */ 262 1.2 mycroft rv = nca_isa_find(iot, ioh, 0x07, &epd); 263 1.1 mycroft 264 1.1 mycroft bus_space_unmap(iot, ioh, NCA_ISA_IOSIZE); 265 1.9 thorpej 266 1.9 thorpej if (rv) { 267 1.9 thorpej ia->ia_nio = 1; 268 1.9 thorpej ia->ia_io[0].ir_size = NCA_ISA_IOSIZE; 269 1.9 thorpej 270 1.9 thorpej ia->ia_niomem = 0; 271 1.9 thorpej ia->ia_ndrq = 0; 272 1.9 thorpej } 273 1.9 thorpej } else if (ia->ia_niomem > 0) { 274 1.1 mycroft /* Memory-mapped card */ 275 1.9 thorpej if (bus_space_map(memt, ia->ia_iomem[0].ir_addr, 0x4000, 276 1.9 thorpej 0, &ioh)) 277 1.1 mycroft return 0; 278 1.1 mycroft 279 1.1 mycroft /* See if a 53C80/53C400 is somewhere in this para. */ 280 1.2 mycroft rv = nca_isa_find(memt, ioh, 0x03ff0, &epd); 281 1.1 mycroft 282 1.1 mycroft bus_space_unmap(memt, ioh, 0x04000); 283 1.1 mycroft 284 1.9 thorpej if (rv) { 285 1.9 thorpej ia->ia_niomem = 1; 286 1.9 thorpej ia->ia_iomem[0].ir_addr += epd.sc_reg_offset; 287 1.9 thorpej ia->ia_iomem[0].ir_size = NCA_ISA_IOSIZE; 288 1.9 thorpej 289 1.9 thorpej ia->ia_nio = 0; 290 1.9 thorpej ia->ia_ndrq = 0; 291 1.1 mycroft } 292 1.1 mycroft } 293 1.1 mycroft 294 1.1 mycroft return rv; 295 1.1 mycroft } 296 1.1 mycroft 297 1.1 mycroft /* 298 1.1 mycroft * Attach this instance, and then all the sub-devices 299 1.1 mycroft */ 300 1.1 mycroft void 301 1.20 tsutsui nca_isa_attach(device_t parent, device_t self, void *aux) 302 1.1 mycroft { 303 1.20 tsutsui struct nca_isa_softc *esc = device_private(self); 304 1.20 tsutsui struct ncr5380_softc *sc = &esc->sc_ncr5380; 305 1.1 mycroft struct isa_attach_args *ia = aux; 306 1.1 mycroft bus_space_tag_t iot = ia->ia_iot; 307 1.1 mycroft bus_space_handle_t ioh; 308 1.2 mycroft struct nca_isa_probe_data epd; 309 1.1 mycroft isa_chipset_tag_t ic = ia->ia_ic; 310 1.1 mycroft 311 1.20 tsutsui sc->sc_dev = self; 312 1.20 tsutsui aprint_normal("\n"); 313 1.1 mycroft 314 1.9 thorpej if (ia->ia_nio > 0) { 315 1.1 mycroft iot = ia->ia_iot; 316 1.9 thorpej if (bus_space_map(iot, ia->ia_io[0].ir_addr, NCA_ISA_IOSIZE, 317 1.9 thorpej 0, &ioh)) { 318 1.20 tsutsui aprint_error_dev(self, "can't map i/o space\n"); 319 1.1 mycroft return; 320 1.1 mycroft } 321 1.1 mycroft } else { 322 1.9 thorpej KASSERT(ia->ia_niomem > 0); 323 1.1 mycroft iot = ia->ia_memt; 324 1.9 thorpej if (bus_space_map(iot, ia->ia_iomem[0].ir_addr, NCA_ISA_IOSIZE, 325 1.9 thorpej 0, &ioh)) { 326 1.20 tsutsui aprint_error_dev(self, "can't map mem space\n"); 327 1.1 mycroft return; 328 1.1 mycroft } 329 1.1 mycroft } 330 1.1 mycroft 331 1.2 mycroft switch (nca_isa_find(iot, ioh, NCA_ISA_IOSIZE, &epd)) { 332 1.1 mycroft case 0: 333 1.1 mycroft /* Not found- must have gone away */ 334 1.20 tsutsui aprint_error_dev(self, "nca_isa_find failed\n"); 335 1.1 mycroft return; 336 1.1 mycroft case CTLR_NCR_5380: 337 1.20 tsutsui aprint_normal_dev(self, "NCR 53C80 detected\n"); 338 1.1 mycroft sc->sci_r0 = 0; 339 1.1 mycroft sc->sci_r1 = 1; 340 1.1 mycroft sc->sci_r2 = 2; 341 1.1 mycroft sc->sci_r3 = 3; 342 1.1 mycroft sc->sci_r4 = 4; 343 1.1 mycroft sc->sci_r5 = 5; 344 1.1 mycroft sc->sci_r6 = 6; 345 1.1 mycroft sc->sci_r7 = 7; 346 1.6 tsutsui sc->sc_rev = NCR_VARIANT_NCR5380; 347 1.1 mycroft break; 348 1.1 mycroft case CTLR_NCR_53C400: 349 1.20 tsutsui aprint_normal_dev(self, "NCR 53C400 detected\n"); 350 1.1 mycroft sc->sci_r0 = C400_5380_REG_OFFSET + 0; 351 1.1 mycroft sc->sci_r1 = C400_5380_REG_OFFSET + 1; 352 1.1 mycroft sc->sci_r2 = C400_5380_REG_OFFSET + 2; 353 1.1 mycroft sc->sci_r3 = C400_5380_REG_OFFSET + 3; 354 1.1 mycroft sc->sci_r4 = C400_5380_REG_OFFSET + 4; 355 1.1 mycroft sc->sci_r5 = C400_5380_REG_OFFSET + 5; 356 1.1 mycroft sc->sci_r6 = C400_5380_REG_OFFSET + 6; 357 1.1 mycroft sc->sci_r7 = C400_5380_REG_OFFSET + 7; 358 1.6 tsutsui sc->sc_rev = NCR_VARIANT_NCR53C400; 359 1.1 mycroft break; 360 1.1 mycroft case CTLR_PAS16: 361 1.20 tsutsui aprint_normal_dev(self, "ProAudio Spectrum 16 detected\n"); 362 1.6 tsutsui sc->sc_rev = NCR_VARIANT_PAS16; 363 1.1 mycroft break; 364 1.1 mycroft } 365 1.1 mycroft 366 1.1 mycroft /* 367 1.1 mycroft * MD function pointers used by the MI code. 368 1.1 mycroft */ 369 1.1 mycroft sc->sc_pio_out = ncr5380_pio_out; 370 1.1 mycroft sc->sc_pio_in = ncr5380_pio_in; 371 1.1 mycroft sc->sc_dma_alloc = NULL; 372 1.1 mycroft sc->sc_dma_free = NULL; 373 1.1 mycroft sc->sc_dma_setup = NULL; 374 1.1 mycroft sc->sc_dma_start = NULL; 375 1.1 mycroft sc->sc_dma_poll = NULL; 376 1.1 mycroft sc->sc_dma_eop = NULL; 377 1.1 mycroft sc->sc_dma_stop = NULL; 378 1.1 mycroft sc->sc_intr_on = NULL; 379 1.1 mycroft sc->sc_intr_off = NULL; 380 1.1 mycroft 381 1.13 drochner if (ia->ia_nirq > 0 && ia->ia_irq[0].ir_irq != ISA_UNKNOWN_IRQ) { 382 1.9 thorpej esc->sc_ih = isa_intr_establish(ic, ia->ia_irq[0].ir_irq, 383 1.9 thorpej IST_EDGE, IPL_BIO, ncr5380_intr, esc); 384 1.1 mycroft if (esc->sc_ih == NULL) { 385 1.20 tsutsui aprint_error_dev(self, 386 1.20 tsutsui "couldn't establish interrupt\n"); 387 1.1 mycroft return; 388 1.1 mycroft } 389 1.15 perry } else 390 1.1 mycroft sc->sc_flags |= NCR5380_FORCE_POLLING; 391 1.1 mycroft 392 1.1 mycroft 393 1.1 mycroft /* 394 1.1 mycroft * Support the "options" (config file flags). 395 1.1 mycroft * Disconnect/reselect is a per-target mask. 396 1.1 mycroft * Interrupts and DMA are per-controller. 397 1.1 mycroft */ 398 1.1 mycroft #if 0 399 1.1 mycroft esc->sc_options = 0x00000; /* no options */ 400 1.1 mycroft #else 401 1.3 mycroft esc->sc_options = 0x0ffff; /* all options except force poll */ 402 1.1 mycroft #endif 403 1.1 mycroft 404 1.20 tsutsui sc->sc_no_disconnect = (esc->sc_options & NCA_NO_DISCONNECT); 405 1.20 tsutsui sc->sc_parity_disable = (esc->sc_options & NCA_NO_PARITY_CHK) >> 8; 406 1.1 mycroft if (esc->sc_options & NCA_FORCE_POLLING) 407 1.1 mycroft sc->sc_flags |= NCR5380_FORCE_POLLING; 408 1.1 mycroft sc->sc_min_dma_len = MIN_DMA_LEN; 409 1.1 mycroft 410 1.1 mycroft 411 1.1 mycroft /* 412 1.1 mycroft * Initialize fields used by the MI code 413 1.1 mycroft */ 414 1.1 mycroft sc->sc_regt = iot; 415 1.1 mycroft sc->sc_regh = ioh; 416 1.1 mycroft 417 1.7 bouyer /* 418 1.7 bouyer * Fill in our portion of the scsipi_adapter. 419 1.7 bouyer */ 420 1.7 bouyer sc->sc_adapter.adapt_request = ncr5380_scsipi_request; 421 1.7 bouyer sc->sc_adapter.adapt_minphys = minphys; 422 1.7 bouyer 423 1.7 bouyer /* 424 1.7 bouyer * Fill in our portion of the scsipi_channel. 425 1.7 bouyer */ 426 1.7 bouyer 427 1.7 bouyer sc->sc_channel.chan_id = 7; 428 1.1 mycroft 429 1.1 mycroft /* 430 1.1 mycroft * Initialize nca board itself. 431 1.1 mycroft */ 432 1.3 mycroft ncr5380_attach(sc); 433 1.1 mycroft } 434