diff options
Diffstat (limited to 'drivers/usb/core/hub.c')
| -rw-r--r-- | drivers/usb/core/hub.c | 18 | 
1 files changed, 15 insertions, 3 deletions
| diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 54cd8ef795ec..2b6565c06c23 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -1223,6 +1223,11 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)  #ifdef CONFIG_PM  			udev->reset_resume = 1;  #endif +			/* Don't set the change_bits when the device +			 * was powered off. +			 */ +			if (test_bit(port1, hub->power_bits)) +				set_bit(port1, hub->change_bits);  		} else {  			/* The power session is gone; tell hub_wq */ @@ -2723,13 +2728,11 @@ static bool use_new_scheme(struct usb_device *udev, int retry,  {  	int old_scheme_first_port =  		port_dev->quirks & USB_PORT_QUIRK_OLD_SCHEME; -	int quick_enumeration = (udev->speed == USB_SPEED_HIGH);  	if (udev->speed >= USB_SPEED_SUPER)  		return false; -	return USE_NEW_SCHEME(retry, old_scheme_first_port || old_scheme_first -			      || quick_enumeration); +	return USE_NEW_SCHEME(retry, old_scheme_first_port || old_scheme_first);  }  /* Is a USB 3.0 port in the Inactive or Compliance Mode state? @@ -3088,6 +3091,15 @@ static int check_port_resume_type(struct usb_device *udev,  		if (portchange & USB_PORT_STAT_C_ENABLE)  			usb_clear_port_feature(hub->hdev, port1,  					USB_PORT_FEAT_C_ENABLE); + +		/* +		 * Whatever made this reset-resume necessary may have +		 * turned on the port1 bit in hub->change_bits.  But after +		 * a successful reset-resume we want the bit to be clear; +		 * if it was on it would indicate that something happened +		 * following the reset-resume. +		 */ +		clear_bit(port1, hub->change_bits);  	}  	return status; |