1 /* $NetBSD: esp_isa.c,v 1.35 2008/04/13 04:55:53 tsutsui Exp $ */ 2 3 /*- 4 * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace 9 * Simulation Facility, NASA Ames Research Center. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the NetBSD 22 * Foundation, Inc. and its contributors. 23 * 4. Neither the name of The NetBSD Foundation nor the names of its 24 * contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 /* 41 * Copyright (c) 1994 Peter Galbavy 42 * All rights reserved. 43 * 44 * Redistribution and use in source and binary forms, with or without 45 * modification, are permitted provided that the following conditions 46 * are met: 47 * 1. Redistributions of source code must retain the above copyright 48 * notice, this list of conditions and the following disclaimer. 49 * 2. Redistributions in binary form must reproduce the above copyright 50 * notice, this list of conditions and the following disclaimer in the 51 * documentation and/or other materials provided with the distribution. 52 * 3. All advertising materials mentioning features or use of this software 53 * must display the following acknowledgement: 54 * This product includes software developed by Peter Galbavy 55 * 4. The name of the author may not be used to endorse or promote products 56 * derived from this software without specific prior written permission. 57 * 58 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 59 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 60 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 61 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 62 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 63 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 64 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 65 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 66 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 67 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 68 * POSSIBILITY OF SUCH DAMAGE. 69 */ 70 71 /* 72 * Based on aic6360 by Jarle Greipsland 73 * 74 * Acknowledgements: Many of the algorithms used in this driver are 75 * inspired by the work of Julian Elischer (julian@tfs.com) and 76 * Charles Hannum (mycroft@duality.gnu.ai.mit.edu). Thanks a million! 77 */ 78 79 /* 80 * Initial m68k mac support from Allen Briggs <briggs@macbsd.com> 81 * (basically consisting of the match, a bit of the attach, and the 82 * "DMA" glue functions). 83 */ 84 85 /* 86 * Copyright (c) 1997 Eric S. Hvozda (hvozda@netcom.com) 87 * All rights reserved. 88 * 89 * Redistribution and use in source and binary forms, with or without 90 * modification, are permitted provided that the following conditions 91 * are met: 92 * 1. Redistributions of source code must retain the above copyright 93 * notice, this list of conditions and the following disclaimer. 94 * 2. Redistributions in binary form must reproduce the above copyright 95 * notice, this list of conditions and the following disclaimer in the 96 * documentation and/or other materials provided with the distribution. 97 * 3. All advertising materials mentioning features or use of this software 98 * must display the following acknowledgement: 99 * This product includes software developed by Eric S. Hvozda. 100 * 4. The name of Eric S. Hvozda may not be used to endorse or promote products 101 * derived from this software without specific prior written permission. 102 * 103 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 104 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 105 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 106 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 107 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 108 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 109 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 110 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 111 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 112 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 113 */ 114 115 #include <sys/cdefs.h> 116 __KERNEL_RCSID(0, "$NetBSD: esp_isa.c,v 1.35 2008/04/13 04:55:53 tsutsui Exp $"); 117 118 #include <sys/param.h> 119 #include <sys/systm.h> 120 #include <sys/device.h> 121 #include <sys/buf.h> 122 123 #include <sys/bus.h> 124 #include <sys/intr.h> 125 126 #include <dev/scsipi/scsipi_all.h> 127 #include <dev/scsipi/scsi_all.h> 128 #include <dev/scsipi/scsiconf.h> 129 130 #include <dev/isa/isavar.h> 131 #include <dev/isa/isadmavar.h> 132 133 #include <dev/ic/ncr53c9xreg.h> 134 #include <dev/ic/ncr53c9xvar.h> 135 136 #include <dev/isa/esp_isavar.h> 137 138 int esp_isa_match(device_t, cfdata_t, void *); 139 void esp_isa_attach(device_t, device_t, void *); 140 141 CFATTACH_DECL_NEW(esp_isa, sizeof(struct esp_isa_softc), 142 esp_isa_match, esp_isa_attach, NULL, NULL); 143 144 int esp_isa_debug = 0; /* ESP_SHOWTRAC | ESP_SHOWREGS | ESP_SHOWMISC */ 145 146 /* 147 * Functions and the switch for the MI code. 148 */ 149 uint8_t esp_isa_read_reg(struct ncr53c9x_softc *, int); 150 void esp_isa_write_reg(struct ncr53c9x_softc *, int, uint8_t); 151 int esp_isa_dma_isintr(struct ncr53c9x_softc *); 152 void esp_isa_dma_reset(struct ncr53c9x_softc *); 153 int esp_isa_dma_intr(struct ncr53c9x_softc *); 154 int esp_isa_dma_setup(struct ncr53c9x_softc *, uint8_t **, 155 size_t *, int, size_t *); 156 void esp_isa_dma_go(struct ncr53c9x_softc *); 157 void esp_isa_dma_stop(struct ncr53c9x_softc *); 158 int esp_isa_dma_isactive(struct ncr53c9x_softc *); 159 160 struct ncr53c9x_glue esp_isa_glue = { 161 esp_isa_read_reg, 162 esp_isa_write_reg, 163 esp_isa_dma_isintr, 164 esp_isa_dma_reset, 165 esp_isa_dma_intr, 166 esp_isa_dma_setup, 167 esp_isa_dma_go, 168 esp_isa_dma_stop, 169 esp_isa_dma_isactive, 170 NULL, /* gl_clear_latched_intr */ 171 }; 172 173 /* 174 * Look for the board 175 */ 176 int 177 esp_isa_find(bus_space_tag_t iot, bus_space_handle_t ioh, 178 struct esp_isa_probe_data *epd) 179 { 180 u_int vers; 181 u_int p1; 182 u_int p2; 183 u_int jmp; 184 185 ESP_TRACE(("[esp_isa_find] ")); 186 187 /* reset card before we probe? */ 188 189 epd->sc_cfg4 = NCRCFG4_ACTNEG; 190 epd->sc_cfg5 = NCRCFG5_CRS1 | NCRCFG5_AADDR | NCRCFG5_PTRINC; 191 192 /* 193 * Switch to the PIO regs and look for the bit pattern 194 * we expect... 195 */ 196 bus_space_write_1(iot, ioh, NCR_CFG5, epd->sc_cfg5); 197 198 #define SIG_MASK 0x87 199 #define REV_MASK 0x70 200 #define M1 0x02 201 #define M2 0x05 202 #define ISNCR 0x80 203 #define ISESP406 0x40 204 205 vers = bus_space_read_1(iot, ioh, NCR_SIGNTR); 206 p1 = bus_space_read_1(iot, ioh, NCR_SIGNTR) & SIG_MASK; 207 p2 = bus_space_read_1(iot, ioh, NCR_SIGNTR) & SIG_MASK; 208 209 ESP_MISC(("esp_isa_find: 0x%0x 0x%0x 0x%0x\n", vers, p1, p2)); 210 211 if (!((p1 == M1 && p2 == M2) || (p1 == M2 && p2 == M1))) 212 return 0; 213 214 /* Ok, what is it? */ 215 epd->sc_isncr = (vers & ISNCR); 216 epd->sc_rev = ((vers & REV_MASK) == ISESP406) ? 217 NCR_VARIANT_ESP406 : NCR_VARIANT_FAS408; 218 219 /* What do the jumpers tell us? */ 220 jmp = bus_space_read_1(iot, ioh, NCR_JMP); 221 222 epd->sc_msize = (jmp & NCRJMP_ROMSZ) ? 0x4000 : 0x8000; 223 epd->sc_parity = jmp & NCRJMP_J2; 224 epd->sc_sync = jmp & NCRJMP_J4; 225 epd->sc_id = (jmp & NCRJMP_J3) ? 7 : 6; 226 switch (jmp & (NCRJMP_J0 | NCRJMP_J1)) { 227 case NCRJMP_J0 | NCRJMP_J1: 228 epd->sc_irq = 11; 229 break; 230 case NCRJMP_J0: 231 epd->sc_irq = 10; 232 break; 233 case NCRJMP_J1: 234 epd->sc_irq = 15; 235 break; 236 default: 237 epd->sc_irq = 12; 238 break; 239 } 240 241 bus_space_write_1(iot, ioh, NCR_CFG5, epd->sc_cfg5); 242 243 /* Try to set NCRESPCFG3_FCLK, some FAS408's don't support 244 * NCRESPCFG3_FCLK even though it is documented. A bad 245 * batch of chips perhaps? 246 */ 247 bus_space_write_1(iot, ioh, NCR_ESPCFG3, 248 bus_space_read_1(iot, ioh, NCR_ESPCFG3) | NCRESPCFG3_FCLK); 249 epd->sc_isfast = bus_space_read_1(iot, ioh, NCR_ESPCFG3) 250 & NCRESPCFG3_FCLK; 251 252 return 1; 253 } 254 255 void 256 esp_isa_init(struct esp_isa_softc *esc, struct esp_isa_probe_data *epd) 257 { 258 struct ncr53c9x_softc *sc = &esc->sc_ncr53c9x; 259 260 ESP_TRACE(("[esp_isa_init] ")); 261 262 /* 263 * Set up the glue for MI code early; we use some of it here. 264 */ 265 sc->sc_glue = &esp_isa_glue; 266 267 sc->sc_rev = epd->sc_rev; 268 sc->sc_id = epd->sc_id; 269 270 /* If we could set NCRESPCFG3_FCLK earlier, we can really move */ 271 sc->sc_cfg3 = NCR_READ_REG(sc, NCR_ESPCFG3); 272 if ((epd->sc_rev == NCR_VARIANT_FAS408) && epd->sc_isfast) { 273 sc->sc_freq = 40; 274 sc->sc_cfg3 |= NCRESPCFG3_FCLK; 275 } else 276 sc->sc_freq = 24; 277 278 /* Setup the register defaults */ 279 sc->sc_cfg1 = sc->sc_id; 280 if (epd->sc_parity) 281 sc->sc_cfg1 |= NCRCFG1_PARENB; 282 sc->sc_cfg2 = NCRCFG2_SCSI2; 283 sc->sc_cfg3 |= NCRESPCFG3_IDM | NCRESPCFG3_FSCSI; 284 sc->sc_cfg4 = epd->sc_cfg4; 285 sc->sc_cfg5 = epd->sc_cfg5; 286 287 /* 288 * This is the value used to start sync negotiations 289 * Note that the NCR register "SYNCTP" is programmed 290 * in "clocks per byte", and has a minimum value of 4. 291 * The SCSI period used in negotiation is one-fourth 292 * of the time (in nanoseconds) needed to transfer one byte. 293 * Since the chip's clock is given in MHz, we have the following 294 * formula: 4 * period = (1000 / freq) * 4 295 */ 296 if (epd->sc_sync) { 297 #ifdef DIAGNOSTIC 298 aprint_normal_dev(sc->sc_dev, 299 "sync requested, but not supported; will do async\n"); 300 #endif 301 epd->sc_sync = 0; 302 } 303 304 sc->sc_minsync = 0; 305 306 /* Really no limit, but since we want to fit into the TCR... */ 307 sc->sc_maxxfer = 64 * 1024; 308 } 309 310 /* 311 * Check the slots looking for a board we recognise 312 * If we find one, note it's address (slot) and call 313 * the actual probe routine to check it out. 314 */ 315 int 316 esp_isa_match(device_t parent, cfdata_t cf, void *aux) 317 { 318 struct isa_attach_args *ia = aux; 319 bus_space_tag_t iot = ia->ia_iot; 320 bus_space_handle_t ioh; 321 struct esp_isa_probe_data epd; 322 int rv; 323 324 if (ia->ia_nio < 1) 325 return 0; 326 if (ia->ia_nirq < 1) 327 return 0; 328 if (ia->ia_ndrq < 1) 329 return 0; 330 331 if (ISA_DIRECT_CONFIG(ia)) 332 return 0; 333 334 ESP_TRACE(("[esp_isa_match] ")); 335 336 if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) 337 return 0; 338 339 if (bus_space_map(iot, ia->ia_io[0].ir_addr, ESP_ISA_IOSIZE, 0, &ioh)) 340 return 0; 341 342 rv = esp_isa_find(iot, ioh, &epd); 343 344 bus_space_unmap(iot, ioh, ESP_ISA_IOSIZE); 345 346 if (rv) { 347 if (ia->ia_irq[0].ir_irq != ISA_UNKNOWN_IRQ && 348 ia->ia_irq[0].ir_irq != epd.sc_irq) { 349 #ifdef DIAGNOSTIC 350 printf("%s: configured IRQ (%0d) does not " 351 "match board IRQ (%0d), device not configured\n", 352 __func__, ia->ia_irq[0].ir_irq, epd.sc_irq); 353 #endif 354 return 0; 355 } 356 ia->ia_irq[0].ir_irq = epd.sc_irq; 357 ia->ia_iomem[0].ir_size = 0; 358 ia->ia_io[0].ir_size = ESP_ISA_IOSIZE; 359 } 360 return rv; 361 } 362 363 /* 364 * Attach this instance, and then all the sub-devices 365 */ 366 void 367 esp_isa_attach(device_t parent, device_t self, void *aux) 368 { 369 struct esp_isa_softc *esc = device_private(self); 370 struct ncr53c9x_softc *sc = &esc->sc_ncr53c9x; 371 struct isa_attach_args *ia = aux; 372 bus_space_tag_t iot = ia->ia_iot; 373 bus_space_handle_t ioh; 374 struct esp_isa_probe_data epd; 375 isa_chipset_tag_t ic = ia->ia_ic; 376 int error; 377 378 sc->sc_dev = self; 379 aprint_normal("\n"); 380 ESP_TRACE(("[esp_isa_attach] ")); 381 382 if (bus_space_map(iot, ia->ia_io[0].ir_addr, ESP_ISA_IOSIZE, 0, &ioh)) { 383 aprint_error_dev(self, "can't map i/o space\n"); 384 return; 385 } 386 387 if (!esp_isa_find(iot, ioh, &epd)) { 388 aprint_error_dev(self, "esp_isa_find failed\n"); 389 return; 390 } 391 392 if (ia->ia_drq[0].ir_drq != ISA_UNKNOWN_DRQ) { 393 if ((error = isa_dmacascade(ic, ia->ia_drq[0].ir_drq)) != 0) { 394 aprint_error_dev(self, 395 "unable to cascade DRQ, error = %d\n", error); 396 return; 397 } 398 } 399 400 esc->sc_ih = isa_intr_establish(ic, ia->ia_irq[0].ir_irq, IST_EDGE, 401 IPL_BIO, ncr53c9x_intr, esc); 402 if (esc->sc_ih == NULL) { 403 aprint_error_dev(self, "couldn't establish interrupt\n"); 404 return; 405 } 406 407 esc->sc_ioh = ioh; 408 esc->sc_iot = iot; 409 esp_isa_init(esc, &epd); 410 411 aprint_normal_dev(self, "%ssync,%sparity\n", 412 epd.sc_sync ? " " : " no ", epd.sc_parity ? " " : " no "); 413 aprint_normal("%s", device_xname(self)); 414 415 /* 416 * Now try to attach all the sub-devices 417 */ 418 sc->sc_adapter.adapt_minphys = minphys; 419 sc->sc_adapter.adapt_request = ncr53c9x_scsipi_request; 420 ncr53c9x_attach(sc); 421 } 422 423 /* 424 * Glue functions. 425 */ 426 uint8_t 427 esp_isa_read_reg(struct ncr53c9x_softc *sc, int reg) 428 { 429 struct esp_isa_softc *esc = (struct esp_isa_softc *)sc; 430 uint8_t v; 431 432 v = bus_space_read_1(esc->sc_iot, esc->sc_ioh, reg); 433 434 ESP_REGS(("[esp_isa_read_reg CRS%c 0x%02x=0x%02x] ", 435 (bus_space_read_1(esc->sc_iot, esc->sc_ioh, NCR_CFG4) & 436 NCRCFG4_CRS1) ? '1' : '0', reg, v)); 437 438 return v; 439 } 440 441 void 442 esp_isa_write_reg(struct ncr53c9x_softc *sc, int reg, uint8_t val) 443 { 444 struct esp_isa_softc *esc = (struct esp_isa_softc *)sc; 445 uint8_t v = val; 446 447 if (reg == NCR_CMD && v == (NCRCMD_TRANS|NCRCMD_DMA)) { 448 v = NCRCMD_TRANS; 449 } 450 451 ESP_REGS(("[esp_isa_write_reg CRS%c 0x%02x=0x%02x] ", 452 (bus_space_read_1(esc->sc_iot, esc->sc_ioh, NCR_CFG4) & 453 NCRCFG4_CRS1) ? '1' : '0', reg, v)); 454 455 bus_space_write_1(esc->sc_iot, esc->sc_ioh, reg, v); 456 } 457 458 int 459 esp_isa_dma_isintr(struct ncr53c9x_softc *sc) 460 { 461 462 ESP_TRACE(("[esp_isa_dma_isintr] ")); 463 464 return NCR_READ_REG(sc, NCR_STAT) & NCRSTAT_INT; 465 } 466 467 void 468 esp_isa_dma_reset(struct ncr53c9x_softc *sc) 469 { 470 struct esp_isa_softc *esc = (struct esp_isa_softc *)sc; 471 472 ESP_TRACE(("[esp_isa_dma_reset] ")); 473 474 esc->sc_active = 0; 475 esc->sc_tc = 0; 476 } 477 478 int 479 esp_isa_dma_intr(struct ncr53c9x_softc *sc) 480 { 481 struct esp_isa_softc *esc = (struct esp_isa_softc *)sc; 482 uint8_t*p; 483 u_int espphase, espstat, espintr; 484 int cnt; 485 486 ESP_TRACE(("[esp_isa_dma_intr] ")); 487 488 if (esc->sc_active == 0) { 489 printf("%s: dma_intr--inactive DMA\n", 490 device_xname(sc->sc_dev)); 491 return -1; 492 } 493 494 if ((sc->sc_espintr & NCRINTR_BS) == 0) { 495 esc->sc_active = 0; 496 return 0; 497 } 498 499 cnt = *esc->sc_pdmalen; 500 if (*esc->sc_pdmalen == 0) { 501 printf("%s: data interrupt, but no count left\n", 502 device_xname(sc->sc_dev)); 503 } 504 505 p = *esc->sc_dmaaddr; 506 espphase = sc->sc_phase; 507 espstat = (u_int)sc->sc_espstat; 508 espintr = (u_int)sc->sc_espintr; 509 do { 510 if (esc->sc_datain) { 511 *p++ = NCR_READ_REG(sc, NCR_FIFO); 512 cnt--; 513 if (espphase == DATA_IN_PHASE) { 514 NCR_WRITE_REG(sc, NCR_CMD, NCRCMD_TRANS); 515 } else { 516 esc->sc_active = 0; 517 } 518 } else { 519 if ((espphase == DATA_OUT_PHASE) || 520 (espphase == MESSAGE_OUT_PHASE)) { 521 NCR_WRITE_REG(sc, NCR_FIFO, *p++); 522 cnt--; 523 NCR_WRITE_REG(sc, NCR_CMD, NCRCMD_TRANS); 524 } else { 525 esc->sc_active = 0; 526 } 527 } 528 529 if (esc->sc_active) { 530 while ((NCR_READ_REG(sc, NCR_STAT) & NCRSTAT_INT) == 0) 531 ; 532 espstat = NCR_READ_REG(sc, NCR_STAT); 533 espintr = NCR_READ_REG(sc, NCR_INTR); 534 espphase = (espintr & NCRINTR_DIS) ? 535 /* Disconnected */ BUSFREE_PHASE : 536 espstat & PHASE_MASK; 537 } 538 } while (esc->sc_active && espintr); 539 sc->sc_phase = espphase; 540 sc->sc_espstat = (uint8_t)espstat; 541 sc->sc_espintr = (uint8_t)espintr; 542 *esc->sc_dmaaddr = p; 543 *esc->sc_pdmalen = cnt; 544 545 if (*esc->sc_pdmalen == 0) { 546 esc->sc_tc = NCRSTAT_TC; 547 } 548 sc->sc_espstat |= esc->sc_tc; 549 return 0; 550 } 551 552 int 553 esp_isa_dma_setup(struct ncr53c9x_softc *sc, uint8_t **addr, size_t *len, 554 int datain, size_t *dmasize) 555 { 556 struct esp_isa_softc *esc = (struct esp_isa_softc *)sc; 557 558 ESP_TRACE(("[esp_isa_dma_setup] ")); 559 560 esc->sc_dmaaddr = addr; 561 esc->sc_pdmalen = len; 562 esc->sc_datain = datain; 563 esc->sc_dmasize = *dmasize; 564 esc->sc_tc = 0; 565 566 return 0; 567 } 568 569 void 570 esp_isa_dma_go(struct ncr53c9x_softc *sc) 571 { 572 struct esp_isa_softc *esc = (struct esp_isa_softc *)sc; 573 574 ESP_TRACE(("[esp_isa_dma_go] ")); 575 576 esc->sc_active = 1; 577 } 578 579 void 580 esp_isa_dma_stop(struct ncr53c9x_softc *sc) 581 { 582 ESP_TRACE(("[esp_isa_dma_stop] ")); 583 } 584 585 int 586 esp_isa_dma_isactive(struct ncr53c9x_softc *sc) 587 { 588 struct esp_isa_softc *esc = (struct esp_isa_softc *)sc; 589 590 ESP_TRACE(("[esp_isa_dma_isactive] ")); 591 592 return esc->sc_active; 593 } 594