Module Name: src Committed By: isaki Date: Sun Jun 25 06:26:40 UTC 2017
Modified Files: src/sys/arch/x68k/dev: vs.c vsvar.h Log Message: Avoid panic when the device is closed when not playing. To generate a diff of this commit: cvs rdiff -u -r1.37 -r1.38 src/sys/arch/x68k/dev/vs.c cvs rdiff -u -r1.11 -r1.12 src/sys/arch/x68k/dev/vsvar.h 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/vs.c diff -u src/sys/arch/x68k/dev/vs.c:1.37 src/sys/arch/x68k/dev/vs.c:1.38 --- src/sys/arch/x68k/dev/vs.c:1.37 Thu Jun 1 02:45:08 2017 +++ src/sys/arch/x68k/dev/vs.c Sun Jun 25 06:26:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: vs.c,v 1.37 2017/06/01 02:45:08 chs Exp $ */ +/* $NetBSD: vs.c,v 1.38 2017/06/25 06:26:40 isaki Exp $ */ /* * Copyright (c) 2001 Tetsuya Isaki. All rights reserved. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vs.c,v 1.37 2017/06/01 02:45:08 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vs.c,v 1.38 2017/06/25 06:26:40 isaki Exp $"); #include "audio.h" #include "vs.h" @@ -232,6 +232,7 @@ vs_attach(device_t parent, device_t self sc->sc_hw_if = &vs_hw_if; sc->sc_addr = (void *) ia->ia_addr; sc->sc_dmas = NULL; + sc->sc_active = 0; mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE); mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_SCHED); @@ -542,6 +543,7 @@ vs_trigger_output(void *hdl, void *start dmac_load_xfer(chan->ch_softc, xf); dmac_start_xfer_offset(chan->ch_softc, xf, 0, sc->sc_current.blksize); bus_space_write_1(sc->sc_iot, sc->sc_ioh, MSM6258_STAT, 2); + sc->sc_active = 1; return 0; } @@ -589,6 +591,7 @@ vs_trigger_input(void *hdl, void *start, dmac_load_xfer(chan->ch_softc, xf); dmac_start_xfer_offset(chan->ch_softc, xf, 0, sc->sc_current.blksize); bus_space_write_1(sc->sc_iot, sc->sc_ioh, MSM6258_STAT, 4); + sc->sc_active = 1; return 0; } @@ -600,9 +603,12 @@ vs_halt_output(void *hdl) DPRINTF(1, ("vs_halt_output\n")); sc = hdl; - /* stop ADPCM play */ - dmac_abort_xfer(sc->sc_dma_ch->ch_softc, sc->sc_current.xfer); - bus_space_write_1(sc->sc_iot, sc->sc_ioh, MSM6258_STAT, 1); + if (sc->sc_active) { + /* stop ADPCM play */ + dmac_abort_xfer(sc->sc_dma_ch->ch_softc, sc->sc_current.xfer); + bus_space_write_1(sc->sc_iot, sc->sc_ioh, MSM6258_STAT, 1); + sc->sc_active = 0; + } return 0; } @@ -614,9 +620,12 @@ vs_halt_input(void *hdl) DPRINTF(1, ("vs_halt_input\n")); sc = hdl; - /* stop ADPCM recoding */ - dmac_abort_xfer(sc->sc_dma_ch->ch_softc, sc->sc_current.xfer); - bus_space_write_1(sc->sc_iot, sc->sc_ioh, MSM6258_STAT, 1); + if (sc->sc_active) { + /* stop ADPCM recoding */ + dmac_abort_xfer(sc->sc_dma_ch->ch_softc, sc->sc_current.xfer); + bus_space_write_1(sc->sc_iot, sc->sc_ioh, MSM6258_STAT, 1); + sc->sc_active = 0; + } return 0; } Index: src/sys/arch/x68k/dev/vsvar.h diff -u src/sys/arch/x68k/dev/vsvar.h:1.11 src/sys/arch/x68k/dev/vsvar.h:1.12 --- src/sys/arch/x68k/dev/vsvar.h:1.11 Wed Nov 23 23:07:30 2011 +++ src/sys/arch/x68k/dev/vsvar.h Sun Jun 25 06:26:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: vsvar.h,v 1.11 2011/11/23 23:07:30 jmcneill Exp $ */ +/* $NetBSD: vsvar.h,v 1.12 2017/06/25 06:26:40 isaki Exp $ */ /* * Copyright (c) 2001 Tetsuya Isaki. All rights reserved. @@ -94,6 +94,7 @@ struct vs_softc { int bufsize, blksize; int dmap; } sc_current; + int sc_active; const struct audio_hw_if *sc_hw_if;