diff options
Diffstat (limited to 'drivers/net/usb/usbnet.c')
-rw-r--r-- | drivers/net/usb/usbnet.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index c04110ba677f..f34b2ebee815 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
@@ -719,7 +719,8 @@ int usbnet_stop (struct net_device *net) | |||
719 | dev->flags = 0; | 719 | dev->flags = 0; |
720 | del_timer_sync (&dev->delay); | 720 | del_timer_sync (&dev->delay); |
721 | tasklet_kill (&dev->bh); | 721 | tasklet_kill (&dev->bh); |
722 | if (info->manage_power) | 722 | if (info->manage_power && |
723 | !test_and_clear_bit(EVENT_NO_RUNTIME_PM, &dev->flags)) | ||
723 | info->manage_power(dev, 0); | 724 | info->manage_power(dev, 0); |
724 | else | 725 | else |
725 | usb_autopm_put_interface(dev->intf); | 726 | usb_autopm_put_interface(dev->intf); |
@@ -794,14 +795,14 @@ int usbnet_open (struct net_device *net) | |||
794 | tasklet_schedule (&dev->bh); | 795 | tasklet_schedule (&dev->bh); |
795 | if (info->manage_power) { | 796 | if (info->manage_power) { |
796 | retval = info->manage_power(dev, 1); | 797 | retval = info->manage_power(dev, 1); |
797 | if (retval < 0) | 798 | if (retval < 0) { |
798 | goto done_manage_power_error; | 799 | retval = 0; |
799 | usb_autopm_put_interface(dev->intf); | 800 | set_bit(EVENT_NO_RUNTIME_PM, &dev->flags); |
801 | } else { | ||
802 | usb_autopm_put_interface(dev->intf); | ||
803 | } | ||
800 | } | 804 | } |
801 | return retval; | 805 | return retval; |
802 | |||
803 | done_manage_power_error: | ||
804 | clear_bit(EVENT_DEV_OPEN, &dev->flags); | ||
805 | done: | 806 | done: |
806 | usb_autopm_put_interface(dev->intf); | 807 | usb_autopm_put_interface(dev->intf); |
807 | done_nopm: | 808 | done_nopm: |
@@ -1447,6 +1448,10 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) | |||
1447 | if ((dev->driver_info->flags & FLAG_WWAN) != 0) | 1448 | if ((dev->driver_info->flags & FLAG_WWAN) != 0) |
1448 | strcpy(net->name, "wwan%d"); | 1449 | strcpy(net->name, "wwan%d"); |
1449 | 1450 | ||
1451 | /* devices that cannot do ARP */ | ||
1452 | if ((dev->driver_info->flags & FLAG_NOARP) != 0) | ||
1453 | net->flags |= IFF_NOARP; | ||
1454 | |||
1450 | /* maybe the remote can't receive an Ethernet MTU */ | 1455 | /* maybe the remote can't receive an Ethernet MTU */ |
1451 | if (net->mtu > (dev->hard_mtu - net->hard_header_len)) | 1456 | if (net->mtu > (dev->hard_mtu - net->hard_header_len)) |
1452 | net->mtu = dev->hard_mtu - net->hard_header_len; | 1457 | net->mtu = dev->hard_mtu - net->hard_header_len; |
@@ -1615,6 +1620,16 @@ void usbnet_device_suggests_idle(struct usbnet *dev) | |||
1615 | } | 1620 | } |
1616 | EXPORT_SYMBOL(usbnet_device_suggests_idle); | 1621 | EXPORT_SYMBOL(usbnet_device_suggests_idle); |
1617 | 1622 | ||
1623 | /* | ||
1624 | * For devices that can do without special commands | ||
1625 | */ | ||
1626 | int usbnet_manage_power(struct usbnet *dev, int on) | ||
1627 | { | ||
1628 | dev->intf->needs_remote_wakeup = on; | ||
1629 | return 0; | ||
1630 | } | ||
1631 | EXPORT_SYMBOL(usbnet_manage_power); | ||
1632 | |||
1618 | /*-------------------------------------------------------------------------*/ | 1633 | /*-------------------------------------------------------------------------*/ |
1619 | static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, | 1634 | static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, |
1620 | u16 value, u16 index, void *data, u16 size) | 1635 | u16 value, u16 index, void *data, u16 size) |