On Thu, Jan 16, 2020 at 10:32:21PM -0600, Scott Cheloha wrote:
> Ticks to milliseconds.
>
> Pretty sure all we need to do to convert the drain timeouts is
> substitute 1000 for hz in each expression.
>
> While we're here, I noticed that at halt time for input/output we
> msleep to allow a drain and then immediately relinquish the mutex
> after coming out of the sleep. We could just opt not to reenter the
> mutex with PNORELOCK, though that might make the code harder to read.
> Maybe you have a preference?
I don't have the hardware to test, but this looks correct.
> Otherwise, ok?
>
ok ratchov
> Index: pci/esovar.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/esovar.h,v
> retrieving revision 1.6
> diff -u -p -r1.6 esovar.h
> --- pci/esovar.h 21 Sep 2010 20:11:44 -0000 1.6
> +++ pci/esovar.h 17 Jan 2020 04:29:28 -0000
> @@ -129,7 +129,7 @@ struct eso_softc {
> void (*sc_rintr)(void *);
> void * sc_rarg;
>
> - /* Auto-initialize DMA transfer block drain timeouts, in ticks */
> + /* Auto-initialize DMA transfer block drain timeouts, in milliseconds */
> int sc_pdrain;
> int sc_rdrain;
>
> Index: pci/eso.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/eso.c,v
> retrieving revision 1.45
> diff -u -p -r1.45 eso.c
> --- pci/eso.c 14 Dec 2019 12:49:50 -0000 1.45
> +++ pci/eso.c 17 Jan 2020 04:29:28 -0000
> @@ -760,8 +760,8 @@ eso_halt_output(void *hdl)
> ESO_IO_A2DMAM_DMAENB);
>
> sc->sc_pintr = NULL;
> - error = msleep(&sc->sc_pintr, &audio_lock, PWAIT, "esoho",
> sc->sc_pdrain);
> - mtx_leave(&audio_lock);
> + error = msleep_nsec(&sc->sc_pintr, &audio_lock, PWAIT | PNORELOCK,
> + "esoho", MSEC_TO_NSEC(sc->sc_pdrain));
>
> /* Shut down DMA completely. */
> eso_write_mixreg(sc, ESO_MIXREG_A2C1, 0);
> @@ -787,8 +787,8 @@ eso_halt_input(void *hdl)
> DMA37MD_WRITE | DMA37MD_DEMAND);
>
> sc->sc_rintr = NULL;
> - error = msleep(&sc->sc_rintr, &audio_lock, PWAIT, "esohi",
> sc->sc_rdrain);
> - mtx_leave(&audio_lock);
> + error = msleep_nsec(&sc->sc_rintr, &audio_lock, PWAIT | PNORELOCK,
> + "esohi", MSEC_TO_NSEC(sc->sc_rdrain));
>
> /* Shut down DMA completely. */
> eso_write_ctlreg(sc, ESO_CTLREG_A1C2,
> @@ -1605,8 +1605,8 @@ eso_trigger_output(void *hdl, void *star
> sc->sc_pintr = intr;
> sc->sc_parg = arg;
>
> - /* Compute drain timeout. */
> - sc->sc_pdrain = hz * (blksize * 3 / 2) /
> + /* Compute drain timeout in milliseconds. */
> + sc->sc_pdrain = 1000 * (blksize * 3 / 2) /
> (param->sample_rate * param->channels * param->bps);
>
> /* DMA transfer count (in `words'!) reload using 2's complement. */
> @@ -1688,8 +1688,8 @@ eso_trigger_input(void *hdl, void *start
> sc->sc_rintr = intr;
> sc->sc_rarg = arg;
>
> - /* Compute drain timeout. */
> - sc->sc_rdrain = hz * (blksize * 3 / 2) /
> + /* Compute drain timeout in milliseconds. */
> + sc->sc_rdrain = 1000 * (blksize * 3 / 2) /
> (param->sample_rate * param->channels * param->bps);
>
> /* Set up ADC DMA converter parameters. */