No empty .Rs/.Re
[netbsd-mini2440.git] / sys / dev / ic / lsi64854.c
bloba09646d8279b21012b9b4a7327eb3209c10d7ba4
1 /* $NetBSD: lsi64854.c,v 1.33 2008/04/28 20:23:50 martin Exp $ */
3 /*-
4 * Copyright (c) 1998 The NetBSD Foundation, Inc.
5 * All rights reserved.
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Paul Kranenburg.
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.
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.
32 #include <sys/cdefs.h>
33 __KERNEL_RCSID(0, "$NetBSD: lsi64854.c,v 1.33 2008/04/28 20:23:50 martin Exp $");
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/kernel.h>
38 #include <sys/errno.h>
39 #include <sys/device.h>
40 #include <sys/malloc.h>
42 #include <uvm/uvm_extern.h>
44 #include <sys/bus.h>
45 #include <machine/autoconf.h>
46 #include <sys/cpu.h>
48 #include <dev/scsipi/scsi_all.h>
49 #include <dev/scsipi/scsipi_all.h>
50 #include <dev/scsipi/scsiconf.h>
52 #include <dev/ic/lsi64854reg.h>
53 #include <dev/ic/lsi64854var.h>
55 #include <dev/ic/ncr53c9xreg.h>
56 #include <dev/ic/ncr53c9xvar.h>
58 void lsi64854_reset(struct lsi64854_softc *);
59 int lsi64854_setup(struct lsi64854_softc *, uint8_t **, size_t *,
60 int, size_t *);
61 int lsi64854_setup_pp(struct lsi64854_softc *, uint8_t **, size_t *,
62 int, size_t *);
64 #ifdef DEBUG
65 #define LDB_SCSI 1
66 #define LDB_ENET 2
67 #define LDB_PP 4
68 #define LDB_ANY 0xff
69 int lsi64854debug = 0;
70 #define DPRINTF(a,x) do { if (lsi64854debug & (a)) printf x ; } while (0)
71 #else
72 #define DPRINTF(a,x)
73 #endif
75 #define MAX_DMA_SZ (16 * 1024 * 1024)
78 * Finish attaching this DMA device.
79 * Front-end must fill in these fields:
80 * sc_bustag
81 * sc_dmatag
82 * sc_regs
83 * sc_burst
84 * sc_channel (one of SCSI, ENET, PP)
85 * sc_client (one of SCSI, ENET, PP `soft_c' pointers)
87 void
88 lsi64854_attach(struct lsi64854_softc *sc)
90 uint32_t csr;
92 /* Indirect functions */
93 switch (sc->sc_channel) {
94 case L64854_CHANNEL_SCSI:
95 sc->intr = lsi64854_scsi_intr;
96 sc->setup = lsi64854_setup;
97 break;
98 case L64854_CHANNEL_ENET:
99 sc->intr = lsi64854_enet_intr;
100 break;
101 case L64854_CHANNEL_PP:
102 sc->setup = lsi64854_setup_pp;
103 break;
104 default:
105 aprint_error(": unknown channel");
107 sc->reset = lsi64854_reset;
109 /* Allocate a dmamap */
110 if (bus_dmamap_create(sc->sc_dmatag, MAX_DMA_SZ, 1, MAX_DMA_SZ,
111 0, BUS_DMA_WAITOK, &sc->sc_dmamap) != 0) {
112 aprint_error(": DMA map create failed\n");
113 return;
116 csr = L64854_GCSR(sc);
117 sc->sc_rev = csr & L64854_DEVID;
118 if (sc->sc_rev == DMAREV_HME) {
119 return;
121 aprint_normal(": DMA rev ");
122 switch (sc->sc_rev) {
123 case DMAREV_0:
124 aprint_normal("0");
125 break;
126 case DMAREV_ESC:
127 aprint_normal("esc");
128 break;
129 case DMAREV_1:
130 aprint_normal("1");
131 break;
132 case DMAREV_PLUS:
133 aprint_normal("1+");
134 break;
135 case DMAREV_2:
136 aprint_normal("2");
137 break;
138 default:
139 aprint_normal("unknown (0x%x)", sc->sc_rev);
142 DPRINTF(LDB_ANY, (", burst 0x%x, csr 0x%x", sc->sc_burst, csr));
143 aprint_normal("\n");
147 * DMAWAIT waits while condition is true
149 #define DMAWAIT(SC, COND, MSG, DONTPANIC) do if (COND) { \
150 int count = 500000; \
151 while ((COND) && --count > 0) DELAY(1); \
152 if (count == 0) { \
153 printf("%s: line %d: CSR = 0x%lx\n", __FILE__, __LINE__, \
154 (u_long)L64854_GCSR(SC)); \
155 if (DONTPANIC) \
156 printf(MSG); \
157 else \
158 panic(MSG); \
160 } while (/* CONSTCOND */ 0)
162 #define DMA_DRAIN(sc, dontpanic) do { \
163 uint32_t _csr; \
164 /* \
165 * DMA rev0 & rev1: we are not allowed to touch the DMA "flush" \
166 * and "drain" bits while it is still thinking about a \
167 * request. \
168 * other revs: D_ESC_R_PEND bit reads as 0 \
169 */ \
170 DMAWAIT(sc, L64854_GCSR(sc) & D_ESC_R_PEND, "R_PEND", dontpanic);\
171 if (sc->sc_rev != DMAREV_HME) { \
172 /* \
173 * Select drain bit based on revision \
174 * also clears errors and D_TC flag \
175 */ \
176 _csr = L64854_GCSR(sc); \
177 if (sc->sc_rev == DMAREV_1 || sc->sc_rev == DMAREV_0) \
178 _csr |= D_ESC_DRAIN; \
179 else \
180 _csr |= L64854_INVALIDATE; \
182 L64854_SCSR(sc,_csr); \
184 /* \
185 * Wait for draining to finish \
186 * rev0 & rev1 call this PACKCNT \
187 */ \
188 DMAWAIT(sc, L64854_GCSR(sc) & L64854_DRAINING, "DRAINING", dontpanic);\
189 } while (/* CONSTCOND */ 0)
191 #define DMA_FLUSH(sc, dontpanic) do { \
192 uint32_t _csr; \
193 /* \
194 * DMA rev0 & rev1: we are not allowed to touch the DMA "flush" \
195 * and "drain" bits while it is still thinking about a \
196 * request. \
197 * other revs: D_ESC_R_PEND bit reads as 0 \
198 */ \
199 DMAWAIT(sc, L64854_GCSR(sc) & D_ESC_R_PEND, "R_PEND", dontpanic);\
200 _csr = L64854_GCSR(sc); \
201 _csr &= ~(L64854_WRITE | L64854_EN_DMA); /* no-ops on ENET */ \
202 _csr |= L64854_INVALIDATE; /* XXX FAS ? */ \
203 L64854_SCSR(sc,_csr); \
204 } while (/* CONSTCOND */ 0)
206 void
207 lsi64854_reset(struct lsi64854_softc *sc)
209 uint32_t csr;
211 DMA_FLUSH(sc, 1);
212 csr = L64854_GCSR(sc);
214 DPRINTF(LDB_ANY, ("%s: csr 0x%x\n", __func__, csr));
217 * XXX is sync needed?
219 if (sc->sc_dmamap->dm_nsegs > 0)
220 bus_dmamap_unload(sc->sc_dmatag, sc->sc_dmamap);
222 if (sc->sc_rev == DMAREV_HME)
223 L64854_SCSR(sc, csr | D_HW_RESET_FAS366);
226 csr |= L64854_RESET; /* reset DMA */
227 L64854_SCSR(sc, csr);
228 DELAY(200); /* > 10 Sbus clocks(?) */
230 /*DMAWAIT1(sc); why was this here? */
231 csr = L64854_GCSR(sc);
232 csr &= ~L64854_RESET; /* de-assert reset line */
233 L64854_SCSR(sc, csr);
234 DELAY(5); /* allow a few ticks to settle */
236 csr = L64854_GCSR(sc);
237 csr |= L64854_INT_EN; /* enable interrupts */
238 if (sc->sc_rev > DMAREV_1 && sc->sc_channel == L64854_CHANNEL_SCSI) {
239 if (sc->sc_rev == DMAREV_HME)
240 csr |= D_TWO_CYCLE;
241 else
242 csr |= D_FASTER;
245 /* Set burst */
246 switch (sc->sc_rev) {
247 case DMAREV_HME:
248 case DMAREV_2:
249 csr &= ~L64854_BURST_SIZE;
250 if (sc->sc_burst == 32) {
251 csr |= L64854_BURST_32;
252 } else if (sc->sc_burst == 16) {
253 csr |= L64854_BURST_16;
254 } else {
255 csr |= L64854_BURST_0;
257 break;
258 case DMAREV_ESC:
259 csr |= D_ESC_AUTODRAIN; /* Auto-drain */
260 if (sc->sc_burst == 32) {
261 csr &= ~D_ESC_BURST;
262 } else
263 csr |= D_ESC_BURST;
264 break;
265 default:
266 break;
268 L64854_SCSR(sc, csr);
270 if (sc->sc_rev == DMAREV_HME) {
271 bus_space_write_4(sc->sc_bustag, sc->sc_regs,
272 L64854_REG_ADDR, 0);
273 sc->sc_dmactl = csr;
275 sc->sc_active = 0;
277 DPRINTF(LDB_ANY, ("%s: done, csr 0x%x\n", __func__, csr));
281 #define DMAMAX(a) (MAX_DMA_SZ - ((a) & (MAX_DMA_SZ-1)))
283 * setup a DMA transfer
286 lsi64854_setup(struct lsi64854_softc *sc, uint8_t **addr, size_t *len,
287 int datain, size_t *dmasize)
289 uint32_t csr;
291 DMA_FLUSH(sc, 0);
293 #if 0
294 DMACSR(sc) &= ~D_INT_EN;
295 #endif
296 sc->sc_dmaaddr = addr;
297 sc->sc_dmalen = len;
300 * the rules say we cannot transfer more than the limit
301 * of this DMA chip (64k for old and 16Mb for new),
302 * and we cannot cross a 16Mb boundary.
304 *dmasize = sc->sc_dmasize =
305 min(*dmasize, DMAMAX((size_t)*sc->sc_dmaaddr));
307 DPRINTF(LDB_ANY, ("%s: dmasize = %ld\n",
308 __func__, (long)sc->sc_dmasize));
311 * XXX what length?
313 if (sc->sc_rev == DMAREV_HME) {
315 L64854_SCSR(sc, sc->sc_dmactl | L64854_RESET);
316 L64854_SCSR(sc, sc->sc_dmactl);
318 bus_space_write_4(sc->sc_bustag, sc->sc_regs,
319 L64854_REG_CNT, *dmasize);
322 /* Program the DMA address */
323 if (sc->sc_dmasize) {
324 sc->sc_dvmaaddr = *sc->sc_dmaaddr;
325 if (bus_dmamap_load(sc->sc_dmatag, sc->sc_dmamap,
326 *sc->sc_dmaaddr, sc->sc_dmasize,
327 NULL /* kernel address */,
328 BUS_DMA_NOWAIT | BUS_DMA_STREAMING))
329 panic("%s: cannot allocate DVMA address",
330 device_xname(sc->sc_dev));
331 bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, 0, sc->sc_dmasize,
332 datain ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
333 bus_space_write_4(sc->sc_bustag, sc->sc_regs, L64854_REG_ADDR,
334 sc->sc_dmamap->dm_segs[0].ds_addr);
337 if (sc->sc_rev == DMAREV_ESC) {
338 /* DMA ESC chip bug work-around */
339 long bcnt = sc->sc_dmasize;
340 long eaddr = bcnt + (long)*sc->sc_dmaaddr;
342 if ((eaddr & PGOFSET) != 0)
343 bcnt = roundup(bcnt, PAGE_SIZE);
344 bus_space_write_4(sc->sc_bustag, sc->sc_regs, L64854_REG_CNT,
345 bcnt);
348 /* Setup DMA control register */
349 csr = L64854_GCSR(sc);
351 if (datain)
352 csr |= L64854_WRITE;
353 else
354 csr &= ~L64854_WRITE;
355 csr |= L64854_INT_EN;
357 if (sc->sc_rev == DMAREV_HME) {
358 csr |= (D_DSBL_SCSI_DRN | D_EN_DMA);
361 L64854_SCSR(sc, csr);
363 return 0;
367 * Pseudo (chained) interrupt from the esp driver to kick the
368 * current running DMA transfer. Called from ncr53c9x_intr()
369 * for now.
371 * return 1 if it was a DMA continue.
374 lsi64854_scsi_intr(void *arg)
376 struct lsi64854_softc *sc = arg;
377 struct ncr53c9x_softc *nsc = sc->sc_client;
378 char bits[64];
379 int trans, resid;
380 uint32_t csr;
382 csr = L64854_GCSR(sc);
383 #ifdef DEBUG
384 snprintb(bits, sizeof(bits), DDMACSR_BITS, csr);
385 #endif
386 DPRINTF(LDB_SCSI, ("%s: %s: addr 0x%x, csr %s\n",
387 device_xname(sc->sc_dev), __func__,
388 bus_space_read_4(sc->sc_bustag, sc->sc_regs, L64854_REG_ADDR),
389 bits));
392 if (csr & (D_ERR_PEND|D_SLAVE_ERR)) {
393 snprintb(bits, sizeof(bits), DDMACSR_BITS, csr);
394 printf("%s: error: csr=%s\n", device_xname(sc->sc_dev), bits);
395 csr &= ~D_EN_DMA; /* Stop DMA */
396 /* Invalidate the queue; SLAVE_ERR bit is write-to-clear */
397 csr |= D_INVALIDATE|D_SLAVE_ERR;
398 L64854_SCSR(sc, csr);
399 return -1;
402 /* This is an "assertion" :) */
403 if (sc->sc_active == 0)
404 panic("%s: DMA wasn't active", __func__);
406 DMA_DRAIN(sc, 0);
408 /* DMA has stopped */
409 csr &= ~D_EN_DMA;
410 L64854_SCSR(sc, csr);
411 sc->sc_active = 0;
413 if (sc->sc_dmasize == 0) {
414 /* A "Transfer Pad" operation completed */
415 DPRINTF(LDB_SCSI, ("%s: discarded %d bytes (tcl=%d, tcm=%d)\n",
416 __func__,
417 NCR_READ_REG(nsc, NCR_TCL) |
418 (NCR_READ_REG(nsc, NCR_TCM) << 8),
419 NCR_READ_REG(nsc, NCR_TCL),
420 NCR_READ_REG(nsc, NCR_TCM)));
421 return 0;
424 resid = 0;
426 * If a transfer onto the SCSI bus gets interrupted by the device
427 * (e.g. for a SAVEPOINTER message), the data in the FIFO counts
428 * as residual since the NCR53C9X counter registers get decremented
429 * as bytes are clocked into the FIFO.
431 if (!(csr & D_WRITE) &&
432 (resid = (NCR_READ_REG(nsc, NCR_FFLAG) & NCRFIFO_FF)) != 0) {
433 DPRINTF(LDB_SCSI, ("%s: empty esp FIFO of %d ",
434 __func__, resid));
435 if (nsc->sc_rev == NCR_VARIANT_FAS366 &&
436 (NCR_READ_REG(nsc, NCR_CFG3) & NCRFASCFG3_EWIDE))
437 resid <<= 1;
440 if ((nsc->sc_espstat & NCRSTAT_TC) == 0) {
442 * `Terminal count' is off, so read the residue
443 * out of the NCR53C9X counter registers.
445 resid += (NCR_READ_REG(nsc, NCR_TCL) |
446 (NCR_READ_REG(nsc, NCR_TCM) << 8) |
447 ((nsc->sc_cfg2 & NCRCFG2_FE) ?
448 (NCR_READ_REG(nsc, NCR_TCH) << 16) : 0));
450 if (resid == 0 && sc->sc_dmasize == 65536 &&
451 (nsc->sc_cfg2 & NCRCFG2_FE) == 0)
452 /* A transfer of 64K is encoded as `TCL=TCM=0' */
453 resid = 65536;
456 trans = sc->sc_dmasize - resid;
457 if (trans < 0) { /* transferred < 0 ? */
458 #if 0
460 * This situation can happen in perfectly normal operation
461 * if the ESP is reselected while using DMA to select
462 * another target. As such, don't print the warning.
464 printf("%s: xfer (%d) > req (%d)\n",
465 device_xname(&sc->sc_dev), trans, sc->sc_dmasize);
466 #endif
467 trans = sc->sc_dmasize;
470 DPRINTF(LDB_SCSI, ("%s: tcl=%d, tcm=%d, tch=%d; trans=%d, resid=%d\n",
471 __func__,
472 NCR_READ_REG(nsc, NCR_TCL),
473 NCR_READ_REG(nsc, NCR_TCM),
474 (nsc->sc_cfg2 & NCRCFG2_FE) ?
475 NCR_READ_REG(nsc, NCR_TCH) : 0,
476 trans, resid));
478 if (sc->sc_dmamap->dm_nsegs > 0) {
479 bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, 0, sc->sc_dmasize,
480 (csr & D_WRITE) != 0 ?
481 BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
482 bus_dmamap_unload(sc->sc_dmatag, sc->sc_dmamap);
485 *sc->sc_dmalen -= trans;
486 *sc->sc_dmaaddr += trans;
488 #if 0 /* this is not normal operation just yet */
489 if (*sc->sc_dmalen == 0 ||
490 nsc->sc_phase != nsc->sc_prevphase)
491 return 0;
493 /* and again */
494 dma_start(sc, sc->sc_dmaaddr, sc->sc_dmalen, DMACSR(sc) & D_WRITE);
495 return 1;
496 #endif
497 return 0;
501 * Pseudo (chained) interrupt to le driver to handle DMA errors.
504 lsi64854_enet_intr(void *arg)
506 struct lsi64854_softc *sc = arg;
507 char bits[64];
508 uint32_t csr;
509 static int dodrain = 0;
510 int rv;
512 csr = L64854_GCSR(sc);
514 /* If the DMA logic shows an interrupt, claim it */
515 rv = ((csr & E_INT_PEND) != 0) ? 1 : 0;
517 if (csr & (E_ERR_PEND|E_SLAVE_ERR)) {
518 snprintb(bits, sizeof(bits), EDMACSR_BITS, csr);
519 printf("%s: error: csr=%s\n", device_xname(sc->sc_dev), bits);
520 csr &= ~L64854_EN_DMA; /* Stop DMA */
521 /* Invalidate the queue; SLAVE_ERR bit is write-to-clear */
522 csr |= E_INVALIDATE|E_SLAVE_ERR;
523 L64854_SCSR(sc, csr);
524 DMA_RESET(sc);
525 dodrain = 1;
526 return 1;
529 if (dodrain) { /* XXX - is this necessary with D_DSBL_WRINVAL on? */
530 int i = 10;
531 csr |= E_DRAIN;
532 L64854_SCSR(sc, csr);
533 while (i-- > 0 && (L64854_GCSR(sc) & D_DRAINING))
534 delay(1);
537 return rv | (*sc->sc_intrchain)(sc->sc_intrchainarg);
541 * setup a DMA transfer
544 lsi64854_setup_pp(struct lsi64854_softc *sc, uint8_t **addr, size_t *len,
545 int datain, size_t *dmasize)
547 uint32_t csr;
549 DMA_FLUSH(sc, 0);
551 sc->sc_dmaaddr = addr;
552 sc->sc_dmalen = len;
554 DPRINTF(LDB_PP, ("%s: pp start %ld@%p,%d\n", device_xname(sc->sc_dev),
555 (long)*sc->sc_dmalen, *sc->sc_dmaaddr, datain ? 1 : 0));
558 * the rules say we cannot transfer more than the limit
559 * of this DMA chip (64k for old and 16Mb for new),
560 * and we cannot cross a 16Mb boundary.
562 *dmasize = sc->sc_dmasize =
563 min(*dmasize, DMAMAX((size_t) *sc->sc_dmaaddr));
565 DPRINTF(LDB_PP, ("%s: dmasize = %ld\n",
566 __func__, (long)sc->sc_dmasize));
568 /* Program the DMA address */
569 if (sc->sc_dmasize) {
570 sc->sc_dvmaaddr = *sc->sc_dmaaddr;
571 if (bus_dmamap_load(sc->sc_dmatag, sc->sc_dmamap,
572 *sc->sc_dmaaddr, sc->sc_dmasize,
573 NULL /* kernel address */,
574 BUS_DMA_NOWAIT/*|BUS_DMA_COHERENT*/))
575 panic("%s: pp cannot allocate DVMA address",
576 device_xname(sc->sc_dev));
577 bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, 0, sc->sc_dmasize,
578 datain ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
579 bus_space_write_4(sc->sc_bustag, sc->sc_regs, L64854_REG_ADDR,
580 sc->sc_dmamap->dm_segs[0].ds_addr);
582 bus_space_write_4(sc->sc_bustag, sc->sc_regs, L64854_REG_CNT,
583 sc->sc_dmasize);
586 /* Setup DMA control register */
587 csr = L64854_GCSR(sc);
588 csr &= ~L64854_BURST_SIZE;
589 if (sc->sc_burst == 32) {
590 csr |= L64854_BURST_32;
591 } else if (sc->sc_burst == 16) {
592 csr |= L64854_BURST_16;
593 } else {
594 csr |= L64854_BURST_0;
596 csr |= P_EN_DMA|P_INT_EN|P_EN_CNT;
597 #if 0
598 /* This bit is read-only in PP csr register */
599 if (datain)
600 csr |= P_WRITE;
601 else
602 csr &= ~P_WRITE;
603 #endif
604 L64854_SCSR(sc, csr);
606 return 0;
609 * Parallel port DMA interrupt.
612 lsi64854_pp_intr(void *arg)
614 struct lsi64854_softc *sc = arg;
615 char bits[64];
616 int ret, trans, resid = 0;
617 uint32_t csr;
619 csr = L64854_GCSR(sc);
621 #ifdef DEBUG
622 snprintb(bits, sizeof(bits), PDMACSR_BITS, csr);
623 #endif
624 DPRINTF(LDB_PP, ("%s: pp intr: addr 0x%x, csr %s\n",
625 device_xname(sc->sc_dev),
626 bus_space_read_4(sc->sc_bustag, sc->sc_regs, L64854_REG_ADDR),
627 bits));
629 if (csr & (P_ERR_PEND|P_SLAVE_ERR)) {
630 resid = bus_space_read_4(sc->sc_bustag, sc->sc_regs,
631 L64854_REG_CNT);
632 snprintb(bits, sizeof(bits), PDMACSR_BITS, csr);
633 printf("%s: pp error: resid %d csr=%s\n",
634 device_xname(sc->sc_dev), resid, bits);
635 csr &= ~P_EN_DMA; /* Stop DMA */
636 /* Invalidate the queue; SLAVE_ERR bit is write-to-clear */
637 csr |= P_INVALIDATE|P_SLAVE_ERR;
638 L64854_SCSR(sc, csr);
639 return 1;
642 ret = (csr & P_INT_PEND) != 0;
644 if (sc->sc_active != 0) {
645 DMA_DRAIN(sc, 0);
646 resid = bus_space_read_4(sc->sc_bustag, sc->sc_regs,
647 L64854_REG_CNT);
650 /* DMA has stopped */
651 csr &= ~D_EN_DMA;
652 L64854_SCSR(sc, csr);
653 sc->sc_active = 0;
655 trans = sc->sc_dmasize - resid;
656 if (trans < 0) { /* transferred < 0 ? */
657 trans = sc->sc_dmasize;
659 *sc->sc_dmalen -= trans;
660 *sc->sc_dmaaddr += trans;
662 if (sc->sc_dmamap->dm_nsegs > 0) {
663 bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, 0, sc->sc_dmasize,
664 (csr & D_WRITE) != 0 ?
665 BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
666 bus_dmamap_unload(sc->sc_dmatag, sc->sc_dmamap);
669 return ret != 0;