]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
usb: xhci: Avoid showing errors during surprise removal
authorMario Limonciello <mario.limonciello@amd.com>
Thu, 17 Jul 2025 07:31:05 +0000 (10:31 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Aug 2025 16:40:57 +0000 (18:40 +0200)
[ Upstream commit 4b9c60e440525b729ac5f071e00bcee12e0a7e84 ]

When a USB4 dock is unplugged from a system it won't respond to ring
events. The PCI core handles the surprise removal event and notifies
all PCI drivers. The XHCI PCI driver sets a flag that the device is
being removed as well.

When that flag is set don't show messages in the cleanup path for
marking the controller dead.

Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20250717073107.488599-2-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/usb/host/xhci-ring.c

index 131e7530ec4aa3907095fd4fb0101a21937bc6c8..ecd757d482c582dcd96b52d2e41d4aafba056f7f 100644 (file)
@@ -1376,12 +1376,15 @@ static void xhci_kill_endpoint_urbs(struct xhci_hcd *xhci,
  */
 void xhci_hc_died(struct xhci_hcd *xhci)
 {
+       bool notify;
        int i, j;
 
        if (xhci->xhc_state & XHCI_STATE_DYING)
                return;
 
-       xhci_err(xhci, "xHCI host controller not responding, assume dead\n");
+       notify = !(xhci->xhc_state & XHCI_STATE_REMOVING);
+       if (notify)
+               xhci_err(xhci, "xHCI host controller not responding, assume dead\n");
        xhci->xhc_state |= XHCI_STATE_DYING;
 
        xhci_cleanup_command_queue(xhci);
@@ -1395,7 +1398,7 @@ void xhci_hc_died(struct xhci_hcd *xhci)
        }
 
        /* inform usb core hc died if PCI remove isn't already handling it */
-       if (!(xhci->xhc_state & XHCI_STATE_REMOVING))
+       if (notify)
                usb_hc_died(xhci_to_hcd(xhci));
 }