diff options
Diffstat (limited to 'drivers/usb/core/hub.c')
| -rw-r--r-- | drivers/usb/core/hub.c | 24 | 
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 54cd8ef795ec..fc748c731832 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -39,6 +39,7 @@  #define USB_VENDOR_GENESYS_LOGIC		0x05e3  #define USB_VENDOR_SMSC				0x0424 +#define USB_PRODUCT_USB5534B			0x5534  #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND	0x01  #define HUB_QUIRK_DISABLE_AUTOSUSPEND		0x02 @@ -1223,6 +1224,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 +2729,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 +3092,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; @@ -5609,8 +5622,11 @@ out_hdev_lock:  }  static const struct usb_device_id hub_id_table[] = { -    { .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_CLASS, +    { .match_flags = USB_DEVICE_ID_MATCH_VENDOR +                   | USB_DEVICE_ID_MATCH_PRODUCT +                   | USB_DEVICE_ID_MATCH_INT_CLASS,        .idVendor = USB_VENDOR_SMSC, +      .idProduct = USB_PRODUCT_USB5534B,        .bInterfaceClass = USB_CLASS_HUB,        .driver_info = HUB_QUIRK_DISABLE_AUTOSUSPEND},      { .match_flags = USB_DEVICE_ID_MATCH_VENDOR  | 
