1 1.22 msaitoh /* $NetBSD: esp_mca.c,v 1.22 2016/07/14 10:19:06 msaitoh Exp $ */ 2 1.1 jdolecek 3 1.1 jdolecek /*- 4 1.3 jdolecek * Copyright (c) 2001 The NetBSD Foundation, Inc. 5 1.1 jdolecek * All rights reserved. 6 1.1 jdolecek * 7 1.1 jdolecek * This code is derived from software contributed to The NetBSD Foundation 8 1.3 jdolecek * by Jaromir Dolecek <jdolecek (at) NetBSD.org>. 9 1.1 jdolecek * 10 1.1 jdolecek * Redistribution and use in source and binary forms, with or without 11 1.1 jdolecek * modification, are permitted provided that the following conditions 12 1.1 jdolecek * are met: 13 1.1 jdolecek * 1. Redistributions of source code must retain the above copyright 14 1.1 jdolecek * notice, this list of conditions and the following disclaimer. 15 1.1 jdolecek * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 jdolecek * notice, this list of conditions and the following disclaimer in the 17 1.1 jdolecek * documentation and/or other materials provided with the distribution. 18 1.1 jdolecek * 19 1.1 jdolecek * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 jdolecek * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 jdolecek * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 jdolecek * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 jdolecek * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 jdolecek * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 jdolecek * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 jdolecek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 jdolecek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 jdolecek * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 jdolecek * POSSIBILITY OF SUCH DAMAGE. 30 1.1 jdolecek */ 31 1.1 jdolecek 32 1.1 jdolecek /* 33 1.2 jdolecek * Driver for NCR 53c90, MCA version, with 86c01 DMA controller chip. 34 1.9 perry * 35 1.2 jdolecek * Some of the information used to write this driver was taken 36 1.2 jdolecek * from Tymm Twillman <tymm (at) computer.org>'s Linux MCA NC53c90 driver, 37 1.2 jdolecek * in drivers/scsi/mca_53c9x.c 38 1.1 jdolecek */ 39 1.7 lukem 40 1.7 lukem #include <sys/cdefs.h> 41 1.22 msaitoh __KERNEL_RCSID(0, "$NetBSD: esp_mca.c,v 1.22 2016/07/14 10:19:06 msaitoh Exp $"); 42 1.1 jdolecek 43 1.1 jdolecek #include <sys/types.h> 44 1.1 jdolecek #include <sys/param.h> 45 1.1 jdolecek #include <sys/systm.h> 46 1.1 jdolecek #include <sys/kernel.h> 47 1.1 jdolecek #include <sys/errno.h> 48 1.1 jdolecek #include <sys/ioctl.h> 49 1.1 jdolecek #include <sys/device.h> 50 1.1 jdolecek #include <sys/buf.h> 51 1.1 jdolecek #include <sys/proc.h> 52 1.1 jdolecek #include <sys/queue.h> 53 1.1 jdolecek 54 1.1 jdolecek #include <dev/scsipi/scsi_all.h> 55 1.1 jdolecek #include <dev/scsipi/scsipi_all.h> 56 1.1 jdolecek #include <dev/scsipi/scsiconf.h> 57 1.1 jdolecek #include <dev/scsipi/scsi_message.h> 58 1.1 jdolecek 59 1.16 ad #include <sys/bus.h> 60 1.16 ad #include <sys/cpu.h> 61 1.1 jdolecek 62 1.1 jdolecek #include <dev/ic/ncr53c9xreg.h> 63 1.1 jdolecek #include <dev/ic/ncr53c9xvar.h> 64 1.1 jdolecek 65 1.1 jdolecek #include <dev/mca/espvar.h> 66 1.2 jdolecek #include <dev/mca/espreg.h> 67 1.1 jdolecek 68 1.1 jdolecek #include <dev/mca/mcavar.h> 69 1.1 jdolecek #include <dev/mca/mcareg.h> 70 1.1 jdolecek #include <dev/mca/mcadevs.h> 71 1.1 jdolecek 72 1.2 jdolecek #if 0 73 1.1 jdolecek #if defined(DEBUG) && !defined(NCR53C9X_DEBUG) 74 1.1 jdolecek #define NCR53C9X_DEBUG 75 1.1 jdolecek #endif 76 1.2 jdolecek #endif 77 1.1 jdolecek 78 1.1 jdolecek #ifdef NCR53C9X_DEBUG 79 1.2 jdolecek static int esp_mca_debug = 0; 80 1.1 jdolecek #define DPRINTF(x) if (esp_mca_debug) printf x; 81 1.1 jdolecek #else 82 1.1 jdolecek #define DPRINTF(x) 83 1.1 jdolecek #endif 84 1.1 jdolecek 85 1.1 jdolecek #define ESP_MCA_IOSIZE 0x20 86 1.2 jdolecek #define ESP_REG_OFFSET 0x10 87 1.1 jdolecek 88 1.18 tsutsui static int esp_mca_match(device_t, cfdata_t, void *); 89 1.18 tsutsui static void esp_mca_attach(device_t, device_t, void *); 90 1.1 jdolecek 91 1.20 christos CFATTACH_DECL_NEW(esp_mca, sizeof(struct esp_softc), 92 1.6 thorpej esp_mca_match, esp_mca_attach, NULL, NULL); 93 1.1 jdolecek 94 1.1 jdolecek /* 95 1.1 jdolecek * Functions and the switch for the MI code. 96 1.1 jdolecek */ 97 1.18 tsutsui static uint8_t esp_read_reg(struct ncr53c9x_softc *, int); 98 1.18 tsutsui static void esp_write_reg(struct ncr53c9x_softc *, int, uint8_t); 99 1.8 perry static int esp_dma_isintr(struct ncr53c9x_softc *); 100 1.8 perry static void esp_dma_reset(struct ncr53c9x_softc *); 101 1.8 perry static int esp_dma_intr(struct ncr53c9x_softc *); 102 1.18 tsutsui static int esp_dma_setup(struct ncr53c9x_softc *, uint8_t **, 103 1.8 perry size_t *, int, size_t *); 104 1.8 perry static void esp_dma_go(struct ncr53c9x_softc *); 105 1.8 perry static void esp_dma_stop(struct ncr53c9x_softc *); 106 1.8 perry static int esp_dma_isactive(struct ncr53c9x_softc *); 107 1.1 jdolecek 108 1.1 jdolecek static struct ncr53c9x_glue esp_glue = { 109 1.1 jdolecek esp_read_reg, 110 1.1 jdolecek esp_write_reg, 111 1.1 jdolecek esp_dma_isintr, 112 1.1 jdolecek esp_dma_reset, 113 1.1 jdolecek esp_dma_intr, 114 1.1 jdolecek esp_dma_setup, 115 1.1 jdolecek esp_dma_go, 116 1.1 jdolecek esp_dma_stop, 117 1.1 jdolecek esp_dma_isactive, 118 1.1 jdolecek NULL, /* gl_clear_latched_intr */ 119 1.1 jdolecek }; 120 1.1 jdolecek 121 1.1 jdolecek static int 122 1.18 tsutsui esp_mca_match(device_t parent, cfdata_t cf, void *aux) 123 1.1 jdolecek { 124 1.1 jdolecek struct mca_attach_args *ma = aux; 125 1.1 jdolecek 126 1.1 jdolecek switch (ma->ma_id) { 127 1.1 jdolecek case MCA_PRODUCT_NCR53C90: 128 1.1 jdolecek return 1; 129 1.1 jdolecek } 130 1.1 jdolecek 131 1.1 jdolecek return 0; 132 1.1 jdolecek } 133 1.1 jdolecek 134 1.1 jdolecek static void 135 1.18 tsutsui esp_mca_attach(device_t parent, device_t self, void *aux) 136 1.1 jdolecek { 137 1.12 thorpej struct esp_softc *esc = device_private(self); 138 1.1 jdolecek struct ncr53c9x_softc *sc = &esc->sc_ncr53c9x; 139 1.18 tsutsui struct mca_attach_args *ma = aux; 140 1.18 tsutsui uint16_t iobase; 141 1.2 jdolecek int scsi_id, irq, drq, error; 142 1.1 jdolecek bus_space_handle_t ioh; 143 1.1 jdolecek int pos2, pos3, pos5; 144 1.1 jdolecek 145 1.18 tsutsui static const uint16_t ncrmca_iobase[] = { 146 1.1 jdolecek 0, 0x240, 0x340, 0x400, 0x420, 0x3240, 0x8240, 0xa240 147 1.1 jdolecek }; 148 1.1 jdolecek 149 1.18 tsutsui sc->sc_dev = self; 150 1.18 tsutsui 151 1.1 jdolecek /* 152 1.1 jdolecek * NCR SCSI Adapter (ADF 7f4f) 153 1.1 jdolecek * 154 1.1 jdolecek * POS register 2: (adf pos0) 155 1.9 perry * 156 1.1 jdolecek * 7 6 5 4 3 2 1 0 157 1.1 jdolecek * \_/ \___/ \__ enable: 0=adapter disabled, 1=adapter enabled 158 1.1 jdolecek * | \____ I/O base (32B): 001=0x240 010=0x340 011=0x400 159 1.1 jdolecek * | 100=0x420 101=0x3240 110=0x8240 111=0xa240 160 1.1 jdolecek * \__________ IRQ: 00=3 01=5 10=7 11=9 161 1.1 jdolecek * 162 1.1 jdolecek * POS register 3: (adf pos1) 163 1.9 perry * 164 1.1 jdolecek * 7 6 5 4 3 2 1 0 165 1.1 jdolecek * 1 1 1 | \_____/ 166 1.1 jdolecek * | \__ DMA level 167 1.1 jdolecek * \_________ Fairness: 1=enabled 0=disabled 168 1.1 jdolecek * 169 1.1 jdolecek * POS register 5: (adf pos3) 170 1.9 perry * 171 1.1 jdolecek * 7 6 5 4 3 2 1 0 172 1.1 jdolecek * 1 | \___/ 173 1.1 jdolecek * | \__ Static Ram: 0xC8000-0xC87FF + XX*0x4000 174 1.1 jdolecek * \___________ Host Adapter ID: 1=7 0=6 175 1.1 jdolecek */ 176 1.1 jdolecek 177 1.1 jdolecek pos2 = mca_conf_read(ma->ma_mc, ma->ma_slot, 2); 178 1.1 jdolecek pos3 = mca_conf_read(ma->ma_mc, ma->ma_slot, 3); 179 1.1 jdolecek pos5 = mca_conf_read(ma->ma_mc, ma->ma_slot, 5); 180 1.1 jdolecek 181 1.1 jdolecek iobase = ncrmca_iobase[(pos2 & 0x0e) >> 1]; 182 1.18 tsutsui irq = 3 + 2 * ((pos2 & 0x30) >> 4); 183 1.1 jdolecek drq = (pos3 & 0x0f); 184 1.1 jdolecek scsi_id = 6 + ((pos5 & 0x20) ? 1 : 0); 185 1.1 jdolecek 186 1.18 tsutsui aprint_normal(" slot %d irq %d drq %d: NCR SCSI Adapter\n", 187 1.18 tsutsui ma->ma_slot + 1, irq, drq); 188 1.1 jdolecek 189 1.2 jdolecek /* Map the 86C01 registers */ 190 1.1 jdolecek if (bus_space_map(ma->ma_iot, iobase, ESP_MCA_IOSIZE, 0, &ioh)) { 191 1.20 christos aprint_error_dev(sc->sc_dev, "can't map i/o space\n"); 192 1.1 jdolecek return; 193 1.1 jdolecek } 194 1.1 jdolecek 195 1.1 jdolecek esc->sc_iot = ma->ma_iot; 196 1.1 jdolecek esc->sc_ioh = ioh; 197 1.1 jdolecek 198 1.2 jdolecek /* Submap the 'esp' registers */ 199 1.2 jdolecek if (bus_space_subregion(ma->ma_iot, ioh, ESP_REG_OFFSET, 200 1.2 jdolecek ESP_MCA_IOSIZE-ESP_REG_OFFSET, &esc->sc_esp_ioh)) { 201 1.20 christos aprint_error_dev(sc->sc_dev, "can't subregion i/o space\n"); 202 1.2 jdolecek return; 203 1.2 jdolecek } 204 1.2 jdolecek 205 1.1 jdolecek /* Setup DMA map */ 206 1.1 jdolecek esc->sc_dmat = ma->ma_dmat; 207 1.1 jdolecek if ((error = mca_dmamap_create(esc->sc_dmat, MAXPHYS, 208 1.2 jdolecek BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW | MCABUS_DMA_IOPORT, 209 1.2 jdolecek &esc->sc_xfer, drq)) != 0){ 210 1.20 christos aprint_error_dev(sc->sc_dev, 211 1.18 tsutsui "couldn't create DMA map - error %d\n", error); 212 1.1 jdolecek return; 213 1.1 jdolecek } 214 1.1 jdolecek 215 1.2 jdolecek /* MI code glue */ 216 1.1 jdolecek sc->sc_id = scsi_id; 217 1.11 lukem sc->sc_freq = 25; /* MHz */ 218 1.1 jdolecek 219 1.1 jdolecek sc->sc_glue = &esp_glue; 220 1.1 jdolecek 221 1.2 jdolecek sc->sc_cfg1 = sc->sc_id | NCRCFG1_PARENB; //| NCRCFG1_SLOW; 222 1.2 jdolecek /* No point setting sc_cfg[2345], they won't be used */ 223 1.1 jdolecek 224 1.2 jdolecek sc->sc_rev = NCR_VARIANT_NCR53C90_86C01; 225 1.1 jdolecek sc->sc_minsync = 0; 226 1.1 jdolecek 227 1.1 jdolecek /* max 64KB DMA */ 228 1.1 jdolecek sc->sc_maxxfer = 64 * 1024; 229 1.1 jdolecek 230 1.1 jdolecek /* Establish interrupt */ 231 1.1 jdolecek esc->sc_ih = mca_intr_establish(ma->ma_mc, irq, IPL_BIO, ncr53c9x_intr, 232 1.18 tsutsui esc); 233 1.1 jdolecek if (esc->sc_ih == NULL) { 234 1.20 christos aprint_error_dev(sc->sc_dev, "couldn't establish interrupt\n"); 235 1.1 jdolecek return; 236 1.1 jdolecek } 237 1.1 jdolecek 238 1.1 jdolecek /* 239 1.2 jdolecek * Massage the 86C01 chip - setup MCA DMA controller for DMA via 240 1.2 jdolecek * the 86C01 register, and enable 86C01 interrupts. 241 1.2 jdolecek */ 242 1.2 jdolecek mca_dma_set_ioport(drq, iobase + N86C01_PIO); 243 1.2 jdolecek 244 1.2 jdolecek bus_space_write_1(esc->sc_iot, esc->sc_ioh, N86C01_MODE_ENABLE, 245 1.18 tsutsui bus_space_read_1(esc->sc_iot, esc->sc_ioh, N86C01_MODE_ENABLE) | 246 1.18 tsutsui N86C01_INTR_ENABLE); 247 1.2 jdolecek 248 1.2 jdolecek /* 249 1.1 jdolecek * Now try to attach all the sub-devices 250 1.1 jdolecek */ 251 1.1 jdolecek sc->sc_adapter.adapt_minphys = minphys; 252 1.1 jdolecek sc->sc_adapter.adapt_request = ncr53c9x_scsipi_request; 253 1.1 jdolecek 254 1.1 jdolecek /* Do the common parts of attachment. */ 255 1.22 msaitoh aprint_normal("%s", device_xname(self)); 256 1.1 jdolecek ncr53c9x_attach(sc); 257 1.1 jdolecek } 258 1.1 jdolecek 259 1.1 jdolecek /* 260 1.1 jdolecek * Glue functions. 261 1.1 jdolecek */ 262 1.1 jdolecek 263 1.18 tsutsui static uint8_t 264 1.18 tsutsui esp_read_reg(struct ncr53c9x_softc *sc, int reg) 265 1.1 jdolecek { 266 1.1 jdolecek struct esp_softc *esc = (struct esp_softc *)sc; 267 1.1 jdolecek 268 1.18 tsutsui return bus_space_read_1(esc->sc_iot, esc->sc_esp_ioh, reg); 269 1.1 jdolecek } 270 1.1 jdolecek 271 1.1 jdolecek static void 272 1.18 tsutsui esp_write_reg(struct ncr53c9x_softc *sc, int reg, uint8_t val) 273 1.1 jdolecek { 274 1.1 jdolecek struct esp_softc *esc = (struct esp_softc *)sc; 275 1.1 jdolecek 276 1.2 jdolecek bus_space_write_1(esc->sc_iot, esc->sc_esp_ioh, reg, val); 277 1.1 jdolecek } 278 1.1 jdolecek 279 1.1 jdolecek static int 280 1.18 tsutsui esp_dma_isintr(struct ncr53c9x_softc *sc) 281 1.1 jdolecek { 282 1.2 jdolecek struct esp_softc *esc = (struct esp_softc *)sc; 283 1.2 jdolecek 284 1.1 jdolecek DPRINTF(("[esp_dma_isintr] ")); 285 1.18 tsutsui return bus_space_read_1(esc->sc_iot, esc->sc_ioh, N86C01_STATUS) & 286 1.18 tsutsui N86C01_IRQ_PEND; 287 1.1 jdolecek } 288 1.1 jdolecek 289 1.1 jdolecek static void 290 1.18 tsutsui esp_dma_reset(struct ncr53c9x_softc *sc) 291 1.1 jdolecek { 292 1.1 jdolecek struct esp_softc *esc = (struct esp_softc *)sc; 293 1.1 jdolecek 294 1.1 jdolecek DPRINTF(("[esp_dma_reset] ")); 295 1.1 jdolecek 296 1.1 jdolecek if (esc->sc_flags & ESP_XFER_LOADED) { 297 1.1 jdolecek bus_dmamap_unload(esc->sc_dmat, esc->sc_xfer); 298 1.1 jdolecek esc->sc_flags &= ~ESP_XFER_LOADED; 299 1.1 jdolecek } 300 1.2 jdolecek 301 1.2 jdolecek if (esc->sc_flags & ESP_XFER_ACTIVE) { 302 1.2 jdolecek esc->sc_flags &= ~ESP_XFER_ACTIVE; 303 1.2 jdolecek mca_disk_unbusy(); 304 1.2 jdolecek } 305 1.1 jdolecek } 306 1.1 jdolecek 307 1.1 jdolecek static int 308 1.18 tsutsui esp_dma_intr(struct ncr53c9x_softc *sc) 309 1.1 jdolecek { 310 1.18 tsutsui struct esp_softc *esc = (struct esp_softc *)sc; 311 1.18 tsutsui 312 1.1 jdolecek DPRINTF(("[esp_dma_intr] ")); 313 1.1 jdolecek 314 1.1 jdolecek if ((esc->sc_flags & ESP_XFER_ACTIVE) == 0) { 315 1.18 tsutsui printf("%s: dma_intr--inactive DMA\n", 316 1.18 tsutsui device_xname(sc->sc_dev)); 317 1.18 tsutsui return -1; 318 1.1 jdolecek } 319 1.1 jdolecek 320 1.2 jdolecek if ((sc->sc_espintr & NCRINTR_BS) == 0) { 321 1.2 jdolecek esc->sc_flags &= ~ESP_XFER_ACTIVE; 322 1.2 jdolecek mca_disk_unbusy(); 323 1.18 tsutsui return 0; 324 1.2 jdolecek } 325 1.2 jdolecek 326 1.2 jdolecek sc->sc_espstat |= NCRSTAT_TC; /* XXX */ 327 1.2 jdolecek 328 1.2 jdolecek if ((sc->sc_espstat & NCRSTAT_TC) == 0) { 329 1.18 tsutsui printf("%s: DMA not complete?\n", device_xname(sc->sc_dev)); 330 1.18 tsutsui return 1; 331 1.2 jdolecek } 332 1.2 jdolecek 333 1.18 tsutsui bus_dmamap_sync(esc->sc_dmat, esc->sc_xfer, 0, *esc->sc_xfer_len, 334 1.18 tsutsui (esc->sc_flags & ESP_XFER_READ) ? 335 1.18 tsutsui BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); 336 1.9 perry 337 1.2 jdolecek bus_dmamap_unload(esc->sc_dmat, esc->sc_xfer); 338 1.2 jdolecek esc->sc_flags &= ~ESP_XFER_LOADED; 339 1.1 jdolecek 340 1.18 tsutsui *esc->sc_xfer_addr += *esc->sc_xfer_len; 341 1.2 jdolecek *esc->sc_xfer_len = 0; 342 1.1 jdolecek 343 1.1 jdolecek esc->sc_flags &= ~ESP_XFER_ACTIVE; 344 1.2 jdolecek mca_disk_unbusy(); 345 1.2 jdolecek 346 1.18 tsutsui return 0; 347 1.1 jdolecek } 348 1.1 jdolecek 349 1.1 jdolecek /* 350 1.1 jdolecek * Setup DMA transfer. 351 1.1 jdolecek */ 352 1.1 jdolecek static int 353 1.18 tsutsui esp_dma_setup(struct ncr53c9x_softc *sc, uint8_t **addr, size_t *len, 354 1.18 tsutsui int datain, size_t *dmasize) 355 1.1 jdolecek { 356 1.18 tsutsui struct esp_softc *esc = (struct esp_softc *)sc; 357 1.1 jdolecek int error; 358 1.1 jdolecek int fl; 359 1.1 jdolecek 360 1.1 jdolecek DPRINTF(("[esp_dma_setup] ")); 361 1.1 jdolecek 362 1.2 jdolecek if (esc->sc_flags & ESP_XFER_LOADED) { 363 1.18 tsutsui printf("%s: %s: unloading leaked xfer\n", 364 1.18 tsutsui device_xname(sc->sc_dev), __func__); 365 1.2 jdolecek bus_dmamap_unload(esc->sc_dmat, esc->sc_xfer); 366 1.2 jdolecek esc->sc_flags &= ~ESP_XFER_LOADED; 367 1.2 jdolecek } 368 1.2 jdolecek 369 1.1 jdolecek /* Load the buffer for DMA transfer. */ 370 1.1 jdolecek fl = (datain) ? BUS_DMA_READ : BUS_DMA_WRITE; 371 1.1 jdolecek 372 1.1 jdolecek if ((error = bus_dmamap_load(esc->sc_dmat, esc->sc_xfer, *addr, 373 1.1 jdolecek *len, NULL, BUS_DMA_STREAMING|fl))) { 374 1.18 tsutsui printf("%s: %s: unable to load DMA buffer - error %d\n", 375 1.18 tsutsui device_xname(sc->sc_dev), __func__, error); 376 1.18 tsutsui return error; 377 1.1 jdolecek } 378 1.1 jdolecek 379 1.18 tsutsui bus_dmamap_sync(esc->sc_dmat, esc->sc_xfer, 0, *len, 380 1.18 tsutsui (datain) ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE); 381 1.9 perry 382 1.2 jdolecek esc->sc_flags |= ESP_XFER_LOADED | (datain ? ESP_XFER_READ : 0); 383 1.2 jdolecek esc->sc_xfer_addr = addr; 384 1.2 jdolecek esc->sc_xfer_len = len; 385 1.1 jdolecek 386 1.18 tsutsui return 0; 387 1.1 jdolecek } 388 1.1 jdolecek 389 1.1 jdolecek static void 390 1.18 tsutsui esp_dma_go(struct ncr53c9x_softc *sc) 391 1.1 jdolecek { 392 1.18 tsutsui struct esp_softc *esc = (struct esp_softc *)sc; 393 1.1 jdolecek DPRINTF(("[esp_dma_go] ")); 394 1.1 jdolecek 395 1.1 jdolecek esc->sc_flags |= ESP_XFER_ACTIVE; 396 1.2 jdolecek mca_disk_busy(); 397 1.1 jdolecek } 398 1.1 jdolecek 399 1.1 jdolecek static void 400 1.18 tsutsui esp_dma_stop(struct ncr53c9x_softc *sc) 401 1.1 jdolecek { 402 1.18 tsutsui 403 1.1 jdolecek DPRINTF(("[esp_dma_stop] ")); 404 1.1 jdolecek 405 1.18 tsutsui panic("%s: stop not yet implemented", device_xname(sc->sc_dev)); 406 1.1 jdolecek } 407 1.1 jdolecek 408 1.1 jdolecek static int 409 1.18 tsutsui esp_dma_isactive(struct ncr53c9x_softc *sc) 410 1.1 jdolecek { 411 1.18 tsutsui struct esp_softc *esc = (struct esp_softc *)sc; 412 1.1 jdolecek DPRINTF(("[esp_dma_isactive] ")); 413 1.1 jdolecek 414 1.18 tsutsui return esc->sc_flags & ESP_XFER_ACTIVE; 415 1.1 jdolecek } 416