Module Name: src Committed By: jmcneill Date: Fri Nov 24 00:30:29 UTC 2017
Modified Files: src/sys/dev/hdaudio: hdaudio.c Log Message: Enter link reset even if GCTL says we are already in reset state. Fixes hdaudio codec detection under VirtualBox on a "cold" boot. XXX pullup To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/dev/hdaudio/hdaudio.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/dev/hdaudio/hdaudio.c diff -u src/sys/dev/hdaudio/hdaudio.c:1.5 src/sys/dev/hdaudio/hdaudio.c:1.6 --- src/sys/dev/hdaudio/hdaudio.c:1.5 Sun Jun 4 23:34:55 2017 +++ src/sys/dev/hdaudio/hdaudio.c Fri Nov 24 00:30:29 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: hdaudio.c,v 1.5 2017/06/04 23:34:55 pgoyette Exp $ */ +/* $NetBSD: hdaudio.c,v 1.6 2017/11/24 00:30:29 jmcneill Exp $ */ /* * Copyright (c) 2009 Precedence Technologies Ltd <supp...@precedence.co.uk> @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hdaudio.c,v 1.5 2017/06/04 23:34:55 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hdaudio.c,v 1.6 2017/11/24 00:30:29 jmcneill Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -612,21 +612,21 @@ hdaudio_reset(struct hdaudio_softc *sc) hda_write1(sc, HDAUDIO_MMIO_RIRBSTS, hda_read1(sc, HDAUDIO_MMIO_RIRBSTS)); - /* If the controller isn't in reset state, initiate the transition */ + /* Put the controller into reset state */ gctl = hda_read4(sc, HDAUDIO_MMIO_GCTL); - if (gctl & HDAUDIO_GCTL_CRST) { - gctl &= ~HDAUDIO_GCTL_CRST; - hda_write4(sc, HDAUDIO_MMIO_GCTL, gctl); - do { - hda_delay(10); - gctl = hda_read4(sc, HDAUDIO_MMIO_GCTL); - } while (--retry > 0 && (gctl & HDAUDIO_GCTL_CRST) != 0); - if (retry == 0) { - hda_error(sc, "timeout entering reset state\n"); - return ETIME; - } + gctl &= ~HDAUDIO_GCTL_CRST; + hda_write4(sc, HDAUDIO_MMIO_GCTL, gctl); + do { + hda_delay(10); + gctl = hda_read4(sc, HDAUDIO_MMIO_GCTL); + } while (--retry > 0 && (gctl & HDAUDIO_GCTL_CRST) != 0); + if (retry == 0) { + hda_error(sc, "timeout entering reset state\n"); + return ETIME; } + hda_delay(1000); + /* Now the controller is in reset state, so bring it out */ retry = HDAUDIO_RESET_TIMEOUT; hda_write4(sc, HDAUDIO_MMIO_GCTL, gctl | HDAUDIO_GCTL_CRST); @@ -639,6 +639,8 @@ hdaudio_reset(struct hdaudio_softc *sc) return ETIME; } + hda_delay(2000); + /* Accept unsolicited responses */ hda_write4(sc, HDAUDIO_MMIO_GCTL, gctl | HDAUDIO_GCTL_UNSOL_EN);