linux/drivers/usb
Weitao Wang 2eb0337615 usb: xhci: Fix slot_id resource race conflict
xHC controller may immediately reuse a slot_id after it's disabled,
giving it to a new enumerating device before the xhci driver freed
all resources related to the disabled device.

In such a scenario, device-A with slot_id equal to 1 is disconnecting
while device-B is enumerating, device-B will fail to enumerate in the
follow sequence.

1.[device-A] send disable slot command
2.[device-B] send enable slot command
3.[device-A] disable slot command completed and wakeup waiting thread
4.[device-B] enable slot command completed with slot_id equal to 1 and
	     wakeup waiting thread
5.[device-B] driver checks that slot_id is still in use (by device-A) in
	     xhci_alloc_virt_device, and fail to enumerate due to this
	     conflict
6.[device-A] xhci->devs[slot_id] set to NULL in xhci_free_virt_device

To fix driver's slot_id resources conflict, clear xhci->devs[slot_id] and
xhci->dcbba->dev_context_ptrs[slot_id] pointers in the interrupt context
when disable slot command completes successfully. Simultaneously, adjust
function xhci_free_virt_device to accurately handle device release.

[minor smatch warning and commit message fix -Mathias]

Cc: stable@vger.kernel.org
Fixes: 7faac1953e ("xhci: avoid race between disable slot command and host runtime suspend")
Signed-off-by: Weitao Wang <WeitaoWang-oc@zhaoxin.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20250819125844.2042452-2-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2025-08-19 16:12:13 +02:00
..
atm usb: atm: cxacru: Merge cxacru_upload_firmware() into cxacru_heavy_init() 2025-07-24 11:33:31 +02:00
c67x00 usb: Switch back to struct platform_driver::remove() 2024-10-04 15:13:03 +02:00
cdns3 usb: cdnsp: Fix issue with CV Bad Descriptor test 2025-06-24 15:42:39 +01:00
chipidea usb: chipidea: imx: improve usbmisc_imx7d_pullup() 2025-08-13 17:19:10 +02:00
class USB / Thunderbolt changes for 6.17-rc1 2025-07-29 10:17:10 -07:00
common usb: common: usb-conn-gpio: use a unique name for usb connector device 2025-04-11 16:08:34 +02:00
core USB: core: Update kerneldoc for usb_hcd_giveback_urb() 2025-08-19 12:29:04 +02:00
dwc2 Linux 6.16-rc7 2025-07-21 10:55:57 +02:00
dwc3 usb: dwc3: Remove WARN_ON for device endpoint command timeouts 2025-08-17 12:14:11 +02:00
early usb: early: xhci-dbc: Fix early_ioremap leak 2025-07-07 11:04:46 +02:00
fotg210 usb: fotg210-hcd: Switch to use hrtimer_setup() 2025-02-18 11:19:02 +01:00
gadget usb: gadget: tegra-xudc: fix PM use count underflow 2025-08-13 17:15:45 +02:00
host usb: xhci: Fix slot_id resource race conflict 2025-08-19 16:12:13 +02:00
image scsi: Rename .slave_alloc() and .slave_destroy() 2024-12-04 15:34:28 -05:00
isp1760 treewide, timers: Rename from_timer() to timer_container_of() 2025-06-08 09:07:37 +02:00
misc usb: misc: onboard_usb_dev: Add Bison Electronics Inc. Integrated Camera 2025-06-30 15:42:16 +02:00
mon drivers/usb/mon: refactor min with min_t 2024-11-13 15:09:51 +01:00
mtu3 Driver core and debugfs updates 2025-01-28 12:25:12 -08:00
musb usb: musb: omap2430: clean up probe error handling 2025-07-25 10:50:44 +02:00
phy usb: phy: tegra: Remove unused functions 2025-06-19 12:26:32 +02:00
renesas_usbhs usb: renesas_usbhs: Convert to DEFINE_SIMPLE_DEV_PM_OPS() 2025-07-15 19:49:52 +02:00
roles usb: roles: set switch registered flag early on 2025-02-14 09:26:25 +01:00
serial treewide: rename GPIO set callbacks back to their original names 2025-08-07 10:07:06 +02:00
storage USB: storage: Ignore driver CD mode for Realtek multi-mode Wi-Fi dongles 2025-08-17 12:13:36 +02:00
typec usb: typec: fusb302: Revert incorrect threaded irq fix 2025-08-19 12:29:33 +02:00
usbip sysfs: treewide: switch back to attribute_group::bin_attrs 2025-06-17 10:44:15 +02:00
Kconfig
Makefile USB: xen-hcd: Traverse host/ when CONFIG_USB_XEN_HCD is selected 2024-06-04 15:33:38 +02:00
usb-skeleton.c