On Mon, Sep 07, 2026 at 12:26:14AM +0800, Haowen Bai wrote:
quoted hunk ↗ jump to hunk
+++ b/drivers/usb/host/pci-quirks.c
@@ -1026,15 +1026,22 @@ static void quirk_usb_disable_ehci(struct pci_dev *pdev)
* Returns 0 when the mask bits have the value done.
* Returns -ETIMEDOUT if this condition is not true after
* wait_usec microseconds have passed.
+ * Returns -ENODEV if the register reads as all-ones (hardware removed).
*/
static int handshake(void __iomem *ptr, u32 mask, u32 done,
int wait_usec, int delay_usec)
{
u32 result;
+ int ret;
- return readl_poll_timeout_atomic(ptr, result,
- ((result & mask) == done),
- delay_usec, wait_usec);
+ ret = readl_poll_timeout_atomic(ptr, result,
+ (result & mask) == done ||
+ result == U32_MAX,
+ delay_usec, wait_usec);
+ if (result == U32_MAX)
+ return -ENODEV;
+
+ return ret;
Nit: Checking for PCI_POSSIBLE_ERROR(result) might be slightly clearer
than U32_MAX.
Thanks,
Lukas