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: Matthew Garrett <mjg59@coreos.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5ebe6afaf0
commit
92bfbf7135
|
@ -2350,6 +2350,23 @@ static void set_usb_port_removable(struct usb_device *udev)
|
||||||
|
|
||||||
hub = usb_hub_to_struct_hub(udev->parent);
|
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);
|
wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics);
|
||||||
|
|
||||||
if (!(wHubCharacteristics & HUB_CHAR_COMPOUND))
|
if (!(wHubCharacteristics & HUB_CHAR_COMPOUND))
|
||||||
|
@ -2369,21 +2386,6 @@ static void set_usb_port_removable(struct usb_device *udev)
|
||||||
else
|
else
|
||||||
udev->removable = USB_DEVICE_FIXED;
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue