Skip to content

Commit

Permalink
support for USB autosuspend in the asix driver
Browse files Browse the repository at this point in the history
this implements support for USB autosuspend in the asix USB ethernet
driver.

Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
  • Loading branch information
Oliver Neukum authored and David S. Miller committed Oct 10, 2007
1 parent bc7f75f commit a11a654
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 5 deletions.
1 change: 1 addition & 0 deletions drivers/net/usb/asix.c
Original file line number Diff line number Diff line change
Expand Up @@ -1474,6 +1474,7 @@ static struct usb_driver asix_driver = {
.suspend = usbnet_suspend,
.resume = usbnet_resume,
.disconnect = usbnet_disconnect,
.supports_autosuspend = 1,
};

static int __init asix_init(void)
Expand Down
30 changes: 25 additions & 5 deletions drivers/net/usb/usbnet.c
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,7 @@ static int usbnet_stop (struct net_device *net)
dev->flags = 0;
del_timer_sync (&dev->delay);
tasklet_kill (&dev->bh);
usb_autopm_put_interface(dev->intf);

return 0;
}
Expand All @@ -603,9 +604,19 @@ static int usbnet_stop (struct net_device *net)
static int usbnet_open (struct net_device *net)
{
struct usbnet *dev = netdev_priv(net);
int retval = 0;
int retval;
struct driver_info *info = dev->driver_info;

if ((retval = usb_autopm_get_interface(dev->intf)) < 0) {
if (netif_msg_ifup (dev))
devinfo (dev,
"resumption fail (%d) usbnet usb-%s-%s, %s",
retval,
dev->udev->bus->bus_name, dev->udev->devpath,
info->description);
goto done_nopm;
}

// put into "known safe" state
if (info->reset && (retval = info->reset (dev)) < 0) {
if (netif_msg_ifup (dev))
Expand Down Expand Up @@ -659,7 +670,10 @@ static int usbnet_open (struct net_device *net)

// delay posting reads until we're fully open
tasklet_schedule (&dev->bh);
return retval;
done:
usb_autopm_put_interface(dev->intf);
done_nopm:
return retval;
}

Expand Down Expand Up @@ -1143,6 +1157,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)

dev = netdev_priv(net);
dev->udev = xdev;
dev->intf = udev;
dev->driver_info = info;
dev->driver_name = name;
dev->msg_enable = netif_msg_init (msg_level, NETIF_MSG_DRV
Expand Down Expand Up @@ -1267,12 +1282,18 @@ int usbnet_suspend (struct usb_interface *intf, pm_message_t message)
struct usbnet *dev = usb_get_intfdata(intf);

if (!dev->suspend_count++) {
/* accelerate emptying of the rx and queues, to avoid
/*
* accelerate emptying of the rx and queues, to avoid
* having everything error out.
*/
netif_device_detach (dev->net);
(void) unlink_urbs (dev, &dev->rxq);
(void) unlink_urbs (dev, &dev->txq);
/*
* reattach so runtime management can use and
* wake the device
*/
netif_device_attach (dev->net);
}
return 0;
}
Expand All @@ -1282,10 +1303,9 @@ int usbnet_resume (struct usb_interface *intf)
{
struct usbnet *dev = usb_get_intfdata(intf);

if (!--dev->suspend_count) {
netif_device_attach (dev->net);
if (!--dev->suspend_count)
tasklet_schedule (&dev->bh);
}

return 0;
}
EXPORT_SYMBOL_GPL(usbnet_resume);
Expand Down
1 change: 1 addition & 0 deletions drivers/net/usb/usbnet.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
struct usbnet {
/* housekeeping */
struct usb_device *udev;
struct usb_interface *intf;
struct driver_info *driver_info;
const char *driver_name;
wait_queue_head_t *wait;
Expand Down

0 comments on commit a11a654

Please sign in to comment.