Re: [PATCH v2] usb: pci-quirks: always assert xHCI OS ownership

From: Greg Kroah-Hartman

Date: Mon Aug 31 2026 - 06:34:15 EST


On Sun, Aug 16, 2026 at 11:15:19AM -0700, Rishabh Jain wrote:
> The xHCI ownership protocol requires the OS driver to assert the HC OS
> Owned semaphore before using the host controller, then wait for HC BIOS
> Owned to clear if firmware owns it.
>
> quirk_usb_handoff_xhci() currently asserts OS Owned only when BIOS Owned
> is already set. If firmware leaves BIOS Owned clear, Linux uses the xHC
> while both ownership semaphores remain clear.
>
> On an AMD PROM21 xHCI controller (1022:43fc), this caused every S3
> resume to terminate Controller Restore State with USBSTS 0x401. Linux
> then reset the host controller, both root hubs and the USB Bluetooth
> adapter.
>
> The controller entered resume ready and halted with USBSTS 0x1.
> Endpoint state, 100 ms save/restore delays, scratchpads, the DCBAA,
> device contexts and command, event and transfer rings were verified not
> to cause the restore error.
>
> Asserting only HC OS Owned changed USBLEGSUP from 0x00000801 to
> 0x01000801 and eliminated the restore failure across four S3 cycles,
> including a stock-kernel test. Clearing USBLEGCTLSTS was independently
> verified to be unnecessary.
>
> Always assert OS Owned when the xHCI Legacy Support capability is
> present. Use the existing ownership masks with a single initial register
> read/write, and leave a debug breadcrumb when firmware owns the
> controller. Keep the existing BIOS handoff recovery and legacy SMI
> cleanup unchanged.
>
> Fixes: 66d4eadd8d06 ("USB: xhci: BIOS handoff and HW initialization.")
> Tested-by: Rishabh Jain <rishabh.jain1198@xxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Rishabh Jain <rishabh.jain1198@xxxxxxxxx>

Tested-by: is implied if you sign off on a patch, no need to include it.



> ---
> Ah, agreed, I didn't see XHCI_HC_OS_OWNED is defined! The +3 in v1 was
> for selecting byte 3 of USBLEGSUP.
>
> I've simplified v2 to use the existing ownership masks, one initial
> read/write (makes sense to batch the writes), and the debug breadcrumb
> you suggested.
>
> Changes in v2:
> - Use XHCI_HC_OS_OWNED instead of byte-offset access.
> - Fold the TI/Renesas forced handoff into the ownership-register write.
> - Add a debug breadcrumb when BIOS ownership is initially set.
> - Make the BIOS handoff wait unconditional and gate recovery on the initial
> BIOS ownership state.
>
> Additional context:
>
> * Kernel Bugzilla #216470 documents the same USBSTS 0x401/reinitialize
> behavior and its impact on attached USB devices:
> https://bugzilla.kernel.org/show_bug.cgi?id=216470
>
> * Commit a7d57abcc8a5 ("xhci: workaround CSS timeout on AMD SNPS 3.0
> xHC") is related workaround history: it tolerates a distinct AMD CSS
> timeout and resets the controller on resume:
> https://github.com/torvalds/linux/commit/a7d57abcc8a5bdeb53bbf8e87558e8e0a2c2a29d
>
> The external reports do not record their ownership semaphore values but
> are included as corroborating failure signatures that this might fix.
>
> drivers/usb/host/pci-quirks.c | 30 +++++++++++++++---------------
> 1 file changed, 15 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
> index 0404489c2f6a..29e635a036a6 100644
> --- a/drivers/usb/host/pci-quirks.c
> +++ b/drivers/usb/host/pci-quirks.c
> @@ -1185,31 +1185,31 @@ static void quirk_usb_handoff_xhci(struct pci_dev *pdev)
> dev_warn(&pdev->dev, "xHCI controller failing to respond");
> goto iounmap;
> }
> +
> val = readl(base + ext_cap_offset);
> + if (val & XHCI_HC_BIOS_OWNED)
> + pci_dbg(pdev, "BIOS owns xHCI HC\n");

Who needs this new message?

thanks,

greg k-h