diff options
Diffstat (limited to 'drivers/net/usb/usbnet.c')
| -rw-r--r-- | drivers/net/usb/usbnet.c | 25 | 
1 files changed, 18 insertions, 7 deletions
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index c04110ba677..3d4bf01641b 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -719,7 +719,8 @@ int usbnet_stop (struct net_device *net)  	dev->flags = 0;  	del_timer_sync (&dev->delay);  	tasklet_kill (&dev->bh); -	if (info->manage_power) +	if (info->manage_power && +	    !test_and_clear_bit(EVENT_NO_RUNTIME_PM, &dev->flags))  		info->manage_power(dev, 0);  	else  		usb_autopm_put_interface(dev->intf); @@ -794,14 +795,14 @@ int usbnet_open (struct net_device *net)  	tasklet_schedule (&dev->bh);  	if (info->manage_power) {  		retval = info->manage_power(dev, 1); -		if (retval < 0) -			goto done_manage_power_error; -		usb_autopm_put_interface(dev->intf); +		if (retval < 0) { +			retval = 0; +			set_bit(EVENT_NO_RUNTIME_PM, &dev->flags); +		} else { +			usb_autopm_put_interface(dev->intf); +		}  	}  	return retval; - -done_manage_power_error: -	clear_bit(EVENT_DEV_OPEN, &dev->flags);  done:  	usb_autopm_put_interface(dev->intf);  done_nopm: @@ -1615,6 +1616,16 @@ void usbnet_device_suggests_idle(struct usbnet *dev)  }  EXPORT_SYMBOL(usbnet_device_suggests_idle); +/* + * For devices that can do without special commands + */ +int usbnet_manage_power(struct usbnet *dev, int on) +{ +	dev->intf->needs_remote_wakeup = on; +	return 0; +} +EXPORT_SYMBOL(usbnet_manage_power); +  /*-------------------------------------------------------------------------*/  static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,  			     u16 value, u16 index, void *data, u16 size)  |