Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6870e5d9 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "xhci: fix 10 second timeout on removal of PCI hotpluggable xhci controllers"

parents 92a41a28 30f5d80b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -299,6 +299,7 @@ static void xhci_pci_remove(struct pci_dev *dev)
	struct xhci_hcd *xhci;

	xhci = hcd_to_xhci(pci_get_drvdata(dev));
	xhci->xhc_state |= XHCI_STATE_REMOVING;
	if (xhci->shared_hcd) {
		usb_remove_hcd(xhci->shared_hcd);
		usb_put_hcd(xhci->shared_hcd);
+2 −1
Original line number Diff line number Diff line
@@ -4008,7 +4008,8 @@ static int queue_command(struct xhci_hcd *xhci, struct xhci_command *cmd,
	int reserved_trbs = xhci->cmd_ring_reserved_trbs;
	int ret;

	if (xhci->xhc_state) {
	if ((xhci->xhc_state & XHCI_STATE_DYING) ||
		(xhci->xhc_state & XHCI_STATE_HALTED)) {
		xhci_dbg(xhci, "xHCI dying or halted, can't queue_command\n");
		return -ESHUTDOWN;
	}
+5 −3
Original line number Diff line number Diff line
@@ -155,7 +155,8 @@ static int xhci_start(struct xhci_hcd *xhci)
				"waited %u microseconds.\n",
				XHCI_MAX_HALT_USEC);
	if (!ret)
		xhci->xhc_state &= ~(XHCI_STATE_HALTED | XHCI_STATE_DYING);
		/* clear state flags. Including dying, halted or removing */
		xhci->xhc_state = 0;

	return ret;
}
@@ -2762,7 +2763,8 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev)
	if (ret <= 0)
		return ret;
	xhci = hcd_to_xhci(hcd);
	if (xhci->xhc_state & XHCI_STATE_DYING)
	if ((xhci->xhc_state & XHCI_STATE_DYING) ||
		(xhci->xhc_state & XHCI_STATE_REMOVING))
		return -ENODEV;

	xhci_dbg(xhci, "%s called for udev %p\n", __func__, udev);
@@ -3809,7 +3811,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,

	mutex_lock(&xhci->mutex);

	if (xhci->xhc_state)	/* dying or halted */
	if (xhci->xhc_state)	/* dying, removing or halted */
		goto out;

	if (!udev->slot_id) {
+1 −0
Original line number Diff line number Diff line
@@ -1604,6 +1604,7 @@ struct xhci_hcd {
 */
#define XHCI_STATE_DYING	(1 << 0)
#define XHCI_STATE_HALTED	(1 << 1)
#define XHCI_STATE_REMOVING	(1 << 2)
	/* Statistics */
	int			error_bitmask;
	unsigned int		quirks;