Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Mar 2022 19:40:15 GMT
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 077564cfdb72 - main - hdac: Handle interrupts racing with device suspend
Message-ID:  <202203171940.22HJeF7F067838@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=077564cfdb7285ff7d256424715e563cbac36f8b

commit 077564cfdb7285ff7d256424715e563cbac36f8b
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2022-03-16 16:09:17 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2022-03-17 19:39:00 +0000

    hdac: Handle interrupts racing with device suspend
    
    - Avoid looping forever if a concurrent reset causes a read of the
      interrupt status register to return all ones.
    - Lock the softc before reading the interrupt status, so as to avoid a
      similar infinite loop in hdac_one_intr().
    
    This fixes suspend-to-S3 on some laptops.
    
    PR:             261207
    Reviewed by:    mav, imp
    Tested by:      uqs
    MFC after:      1 week
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D34117
---
 sys/dev/sound/pci/hda/hdac.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c
index dc5a03e9807c..8415d63daa69 100644
--- a/sys/dev/sound/pci/hda/hdac.c
+++ b/sys/dev/sound/pci/hda/hdac.c
@@ -384,13 +384,13 @@ hdac_intr_handler(void *context)
 	 * re-examine GIS then we can leave it set and never get an interrupt
 	 * again.
 	 */
+	hdac_lock(sc);
 	intsts = HDAC_READ_4(&sc->mem, HDAC_INTSTS);
-	while ((intsts & HDAC_INTSTS_GIS) != 0) {
-		hdac_lock(sc);
+	while (intsts != 0xffffffff && (intsts & HDAC_INTSTS_GIS) != 0) {
 		hdac_one_intr(sc, intsts);
-		hdac_unlock(sc);
 		intsts = HDAC_READ_4(&sc->mem, HDAC_INTSTS);
 	}
+	hdac_unlock(sc);
 }
 
 static void



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202203171940.22HJeF7F067838>