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);
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue