diff options
Diffstat (limited to 'drivers/usb/core/hub.c')
| -rw-r--r-- | drivers/usb/core/hub.c | 59 | 
1 files changed, 29 insertions, 30 deletions
| diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 1fa5c0f29c64..a56c75e09786 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -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)  { @@ -903,34 +902,6 @@ static int hub_set_port_link_state(struct usb_hub *hub, int port1,  }  /* - * 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   * and will re-enumerate if there actually is a device attached. @@ -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:   * |