]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
usb: xhci: relocate Restore/Controller error check
authorNiklas Neronin <niklas.neronin@linux.intel.com>
Thu, 2 Apr 2026 13:13:22 +0000 (16:13 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 2 Apr 2026 13:55:37 +0000 (15:55 +0200)
A Restore Error or Host Controller Error indicates that the host controller
failed to resume after suspend. In such cases, the xhci driver is fully
re-initialized, similar to a post-hibernation scenario.

The existing error check is only relevant when 'power_lost' is false.
If 'power_lost' is true, a Restore or Controller error has no effect:
no warning is printed and the 'power_lost' state remains unchanged.

Move the entire error check into the if '!power_lost' condition
to make this dependency explicit and simplify the resume logic.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Niklas Neronin <niklas.neronin@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://patch.msgid.link/20260402131342.2628648-6-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci.c

index 8e0b6a673868e22f60eb87f58b78e662bbdc85e8..fdd3a19b7c9c1b595a1e4f573ed123571e316251 100644 (file)
@@ -1140,16 +1140,13 @@ int xhci_resume(struct xhci_hcd *xhci, bool power_lost, bool is_auto_resume)
                        spin_unlock_irq(&xhci->lock);
                        return -ETIMEDOUT;
                }
-       }
-
-       temp = readl(&xhci->op_regs->status);
 
-       /* re-initialize the HC on Restore Error, or Host Controller Error */
-       if ((temp & (STS_SRE | STS_HCE)) &&
-           !(xhci->xhc_state & XHCI_STATE_REMOVING)) {
-               if (!power_lost)
+               /* re-initialize the HC on Restore Error, or Host Controller Error */
+               temp = readl(&xhci->op_regs->status);
+               if ((temp & (STS_SRE | STS_HCE)) && !(xhci->xhc_state & XHCI_STATE_REMOVING)) {
                        xhci_warn(xhci, "xHC error in resume, USBSTS 0x%x, Reinit\n", temp);
-               power_lost = true;
+                       power_lost = true;
+               }
        }
 
        if (power_lost) {