|
@@ -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;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/**
|