|
@@ -103,8 +103,7 @@ EXPORT_SYMBOL_GPL(ehci_cf_port_reset_rwsem);
|
|
|
|
|
|
static void hub_release(struct kref *kref);
|
|
|
static int usb_reset_and_verify_device(struct usb_device *udev);
|
|
|
-static void hub_usb3_port_prepare_disable(struct usb_hub *hub,
|
|
|
- struct usb_port *port_dev);
|
|
|
+static int hub_port_disable(struct usb_hub *hub, int port1, int set_state);
|
|
|
|
|
|
static inline char *portspeed(struct usb_hub *hub, int portstatus)
|
|
|
{
|
|
@@ -902,34 +901,6 @@ static int hub_set_port_link_state(struct usb_hub *hub, int port1,
|
|
|
USB_PORT_FEAT_LINK_STATE);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * USB-3 does not have a similar link state as USB-2 that will avoid negotiating
|
|
|
- * a connection with a plugged-in cable but will signal the host when the cable
|
|
|
- * is unplugged. Disable remote wake and set link state to U3 for USB-3 devices
|
|
|
- */
|
|
|
-static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
|
|
|
-{
|
|
|
- struct usb_port *port_dev = hub->ports[port1 - 1];
|
|
|
- struct usb_device *hdev = hub->hdev;
|
|
|
- int ret = 0;
|
|
|
-
|
|
|
- if (!hub->error) {
|
|
|
- if (hub_is_superspeed(hub->hdev)) {
|
|
|
- hub_usb3_port_prepare_disable(hub, port_dev);
|
|
|
- ret = hub_set_port_link_state(hub, port_dev->portnum,
|
|
|
- USB_SS_PORT_LS_U3);
|
|
|
- } else {
|
|
|
- ret = usb_clear_port_feature(hdev, port1,
|
|
|
- USB_PORT_FEAT_ENABLE);
|
|
|
- }
|
|
|
- }
|
|
|
- if (port_dev->child && set_state)
|
|
|
- usb_set_device_state(port_dev->child, USB_STATE_NOTATTACHED);
|
|
|
- if (ret && ret != -ENODEV)
|
|
|
- dev_err(&port_dev->dev, "cannot disable (err = %d)\n", ret);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Disable a port and mark a logical connect-change event, so that some
|
|
|
* time later hub_wq will disconnect() any existing usb_device on the port
|
|
@@ -4162,6 +4133,34 @@ static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port,
|
|
|
|
|
|
#endif /* CONFIG_PM */
|
|
|
|
|
|
+/*
|
|
|
+ * USB-3 does not have a similar link state as USB-2 that will avoid negotiating
|
|
|
+ * a connection with a plugged-in cable but will signal the host when the cable
|
|
|
+ * is unplugged. Disable remote wake and set link state to U3 for USB-3 devices
|
|
|
+ */
|
|
|
+static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
|
|
|
+{
|
|
|
+ struct usb_port *port_dev = hub->ports[port1 - 1];
|
|
|
+ struct usb_device *hdev = hub->hdev;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ if (!hub->error) {
|
|
|
+ if (hub_is_superspeed(hub->hdev)) {
|
|
|
+ hub_usb3_port_prepare_disable(hub, port_dev);
|
|
|
+ ret = hub_set_port_link_state(hub, port_dev->portnum,
|
|
|
+ USB_SS_PORT_LS_U3);
|
|
|
+ } else {
|
|
|
+ ret = usb_clear_port_feature(hdev, port1,
|
|
|
+ USB_PORT_FEAT_ENABLE);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (port_dev->child && set_state)
|
|
|
+ usb_set_device_state(port_dev->child, USB_STATE_NOTATTACHED);
|
|
|
+ if (ret && ret != -ENODEV)
|
|
|
+ dev_err(&port_dev->dev, "cannot disable (err = %d)\n", ret);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
/* USB 2.0 spec, 7.1.7.3 / fig 7-29:
|
|
|
*
|