diff options
Diffstat (limited to 'drivers/usb/core/hub.c')
| -rw-r--r-- | drivers/usb/core/hub.c | 23 | 
1 files changed, 9 insertions, 14 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index bee13517676f..1d5fc32d06d0 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -1052,14 +1052,11 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)  	/* Continue a partial initialization */  	if (type == HUB_INIT2 || type == HUB_INIT3) { -		device_lock(hub->intfdev); +		device_lock(&hdev->dev);  		/* Was the hub disconnected while we were waiting? */ -		if (hub->disconnected) { -			device_unlock(hub->intfdev); -			kref_put(&hub->kref, hub_release); -			return; -		} +		if (hub->disconnected) +			goto disconnected;  		if (type == HUB_INIT2)  			goto init2;  		goto init3; @@ -1262,7 +1259,7 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)  			queue_delayed_work(system_power_efficient_wq,  					&hub->init_work,  					msecs_to_jiffies(delay)); -			device_unlock(hub->intfdev); +			device_unlock(&hdev->dev);  			return;		/* Continues at init3: below */  		} else {  			msleep(delay); @@ -1281,12 +1278,12 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)  	/* Scan all ports that need attention */  	kick_hub_wq(hub); -	/* Allow autosuspend if it was suppressed */ -	if (type <= HUB_INIT3) +	if (type == HUB_INIT2 || type == HUB_INIT3) { +		/* Allow autosuspend if it was suppressed */ + disconnected:  		usb_autopm_put_interface_async(to_usb_interface(hub->intfdev)); - -	if (type == HUB_INIT2 || type == HUB_INIT3) -		device_unlock(hub->intfdev); +		device_unlock(&hdev->dev); +	}  	kref_put(&hub->kref, hub_release);  } @@ -1315,8 +1312,6 @@ static void hub_quiesce(struct usb_hub *hub, enum hub_quiescing_type type)  	struct usb_device *hdev = hub->hdev;  	int i; -	cancel_delayed_work_sync(&hub->init_work); -  	/* hub_wq and related activity won't re-trigger */  	hub->quiescing = 1;  | 
