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
This commit is contained in:
parent
28d08dc7d0
commit
077564cfdb
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user