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

Commit 92bfbf71 authored by Matthew Garrett's avatar Matthew Garrett Committed by Greg Kroah-Hartman
Browse files

usb: Prefer firmware values when determining whether a port is removable



Windows appears to pay more attention to the ACPI values than any hub
configuration, so prefer the firmware's opinion on whether a port is
fixed or removable before falling back to the hub values.

Signed-off-by: default avatarMatthew Garrett <mjg59@coreos.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5ebe6afa
Loading
Loading
Loading
Loading
+17 −15
Original line number Diff line number Diff line
@@ -2350,6 +2350,23 @@ static void set_usb_port_removable(struct usb_device *udev)

	hub = usb_hub_to_struct_hub(udev->parent);

	/*
	 * If the platform firmware has provided information about a port,
	 * use that to determine whether it's removable.
	 */
	switch (hub->ports[udev->portnum - 1]->connect_type) {
	case USB_PORT_CONNECT_TYPE_HOT_PLUG:
		udev->removable = USB_DEVICE_REMOVABLE;
		return;
	case USB_PORT_CONNECT_TYPE_HARD_WIRED:
		udev->removable = USB_DEVICE_FIXED;
		return;
	}

	/*
	 * Otherwise, check whether the hub knows whether a port is removable
	 * or not
	 */
	wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics);

	if (!(wHubCharacteristics & HUB_CHAR_COMPOUND))
@@ -2369,21 +2386,6 @@ static void set_usb_port_removable(struct usb_device *udev)
	else
		udev->removable = USB_DEVICE_FIXED;

	/*
	 * Platform firmware may have populated an alternative value for
	 * removable.  If the parent port has a known connect_type use
	 * that instead.
	 */
	switch (hub->ports[udev->portnum - 1]->connect_type) {
	case USB_PORT_CONNECT_TYPE_HOT_PLUG:
		udev->removable = USB_DEVICE_REMOVABLE;
		break;
	case USB_PORT_CONNECT_TYPE_HARD_WIRED:
		udev->removable = USB_DEVICE_FIXED;
		break;
	default: /* use what was set above */
		break;
	}
}

/**