diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-10-12 15:17:14 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-10-12 15:17:14 +0200 | 
| commit | 620f2efcdc5c7a2db68da41bc3df3cf9a718024e (patch) | |
| tree | b1a0411e2588953777d0b10245b12044c33cef54 /drivers/usb/core/hub.c | |
| parent | 04944b793e18ece23f63c0252646b310c1845940 (diff) | |
| parent | fd048088306656824958e7783ffcee27e241b361 (diff) | |
Merge branch 'linus' into x86/xsave
Diffstat (limited to 'drivers/usb/core/hub.c')
| -rw-r--r-- | drivers/usb/core/hub.c | 39 | 
1 files changed, 17 insertions, 22 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 6a5cb018383..d99963873e3 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -2683,35 +2683,17 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,  				USB_PORT_STAT_C_ENABLE);  #endif -	/* Try to use the debounce delay for protection against -	 * port-enable changes caused, for example, by EMI. -	 */ -	if (portchange & (USB_PORT_STAT_C_CONNECTION | -				USB_PORT_STAT_C_ENABLE)) { -		status = hub_port_debounce(hub, port1); -		if (status < 0) { -			if (printk_ratelimit()) -				dev_err (hub_dev, "connect-debounce failed, " -						"port %d disabled\n", port1); -			portstatus &= ~USB_PORT_STAT_CONNECTION; -		} else { -			portstatus = status; -		} -	} -  	/* Try to resuscitate an existing device */  	udev = hdev->children[port1-1];  	if ((portstatus & USB_PORT_STAT_CONNECTION) && udev &&  			udev->state != USB_STATE_NOTATTACHED) { -  		usb_lock_device(udev);  		if (portstatus & USB_PORT_STAT_ENABLE) {  			status = 0;		/* Nothing to do */ -		} else if (!udev->persist_enabled) { -			status = -ENODEV;	/* Mustn't resuscitate */  #ifdef CONFIG_USB_SUSPEND -		} else if (udev->state == USB_STATE_SUSPENDED) { +		} else if (udev->state == USB_STATE_SUSPENDED && +				udev->persist_enabled) {  			/* For a suspended device, treat this as a  			 * remote wakeup event.  			 */ @@ -2726,7 +2708,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,  #endif  		} else { -			status = usb_reset_device(udev); +			status = -ENODEV;	/* Don't resuscitate */  		}  		usb_unlock_device(udev); @@ -2741,6 +2723,19 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,  		usb_disconnect(&hdev->children[port1-1]);  	clear_bit(port1, hub->change_bits); +	if (portchange & (USB_PORT_STAT_C_CONNECTION | +				USB_PORT_STAT_C_ENABLE)) { +		status = hub_port_debounce(hub, port1); +		if (status < 0) { +			if (printk_ratelimit()) +				dev_err(hub_dev, "connect-debounce failed, " +						"port %d disabled\n", port1); +			portstatus &= ~USB_PORT_STAT_CONNECTION; +		} else { +			portstatus = status; +		} +	} +  	/* Return now if debouncing failed or nothing is connected */  	if (!(portstatus & USB_PORT_STAT_CONNECTION)) { @@ -2748,7 +2743,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,  		if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2  				&& !(portstatus & (1 << USB_PORT_FEAT_POWER)))  			set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); -  +  		if (portstatus & USB_PORT_STAT_ENABLE)    			goto done;  		return;  | 
