Module Name: src Committed By: tsutsui Date: Sun Oct 14 16:36:32 UTC 2012
Modified Files: src/sys/arch/x68k/dev: intio_dmac.c Log Message: To abort DMA in dmac_abort_xfer(), set DMAC_CCR_SAB (software abort) rather than DMAC_CCR_HLT (halt operation). DMAC_CCR_HLT doesn't abort DMA xfers but only suspends DMA ops (i.e. clearing HLT bit will resume DMA xfers), so previously DMAC error always occurs on the next DMA xfer ops after dmac_abort_xfer() is called. Also suppress DMAC error messages in dmac_error() if it's caused by software abort command because it can happen during normal audio play/record DMA ops in vs(4) driver. To generate a diff of this commit: cvs rdiff -u -r1.33 -r1.34 src/sys/arch/x68k/dev/intio_dmac.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/x68k/dev/intio_dmac.c diff -u src/sys/arch/x68k/dev/intio_dmac.c:1.33 src/sys/arch/x68k/dev/intio_dmac.c:1.34 --- src/sys/arch/x68k/dev/intio_dmac.c:1.33 Sun Jun 6 04:50:08 2010 +++ src/sys/arch/x68k/dev/intio_dmac.c Sun Oct 14 16:36:31 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: intio_dmac.c,v 1.33 2010/06/06 04:50:08 mrg Exp $ */ +/* $NetBSD: intio_dmac.c,v 1.34 2012/10/14 16:36:31 tsutsui Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ #include "opt_m68k_arch.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: intio_dmac.c,v 1.33 2010/06/06 04:50:08 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intio_dmac.c,v 1.34 2012/10/14 16:36:31 tsutsui Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -530,10 +530,18 @@ dmac_error(void *arg) { struct dmac_channel_stat *chan = arg; struct dmac_softc *sc = chan->ch_softc; + uint8_t csr, cer; - printf("DMAC transfer error CSR=%02x, CER=%02x\n", - bus_space_read_1(sc->sc_bst, chan->ch_bht, DMAC_REG_CSR), - bus_space_read_1(sc->sc_bst, chan->ch_bht, DMAC_REG_CER)); + csr = bus_space_read_1(sc->sc_bst, chan->ch_bht, DMAC_REG_CSR); + cer = bus_space_read_1(sc->sc_bst, chan->ch_bht, DMAC_REG_CER); + +#ifndef DMAC_DEBUG + /* Software abort (CER=0x11) could happen on normal xfer termination */ + if (cer != 0x11) +#endif + { + printf("DMAC transfer error CSR=%02x, CER=%02x\n", csr, cer); + } DDUMPREGS(3, ("registers were:\n")); /* Clear the status bits */ @@ -552,7 +560,7 @@ dmac_abort_xfer(struct dmac_softc *dmac, struct dmac_channel_stat *chan = xf->dx_channel; bus_space_write_1(dmac->sc_bst, chan->ch_bht, DMAC_REG_CCR, - DMAC_CCR_INT | DMAC_CCR_HLT); + DMAC_CCR_INT | DMAC_CCR_SAB); bus_space_write_1(dmac->sc_bst, chan->ch_bht, DMAC_REG_CSR, 0xff); xf->dx_nextoff = xf->dx_nextsize = -1;