Use a separate varaible to signal a "dead" controller (that has disappeared
authorkettenis <kettenis@openbsd.org>
Fri, 15 Jul 2022 07:52:06 +0000 (07:52 +0000)
committerkettenis <kettenis@openbsd.org>
Fri, 15 Jul 2022 07:52:06 +0000 (07:52 +0000)
from the bus, probably because of hot(un)plugging it).  This makes sure
that we still ack interrupts that arrive while the controller is "dying"
(when we go down into suspend or if an unrecoverable hardware error
occurs).  Fixes an interrupt storm when we suspend on Amlogic arm64 boards.

ok deraadt@

sys/dev/usb/xhci.c

index 8f894cc..4bec4e0 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: xhci.c,v 1.125 2022/04/12 19:41:11 naddy Exp $ */
+/* $OpenBSD: xhci.c,v 1.126 2022/07/15 07:52:06 kettenis Exp $ */
 
 /*
  * Copyright (c) 2014-2015 Martin Pieuchot
@@ -593,7 +593,7 @@ xhci_intr(void *v)
 {
        struct xhci_softc *sc = v;
 
-       if (sc == NULL || sc->sc_bus.dying)
+       if (sc->sc_dead)
                return (0);
 
        /* If we get an interrupt while polling, then just ignore it. */
@@ -613,6 +613,7 @@ xhci_intr1(struct xhci_softc *sc)
        intrs = XOREAD4(sc, XHCI_USBSTS);
        if (intrs == 0xffffffff) {
                sc->sc_bus.dying = 1;
+               sc->sc_dead = 1;
                return (0);
        }