aboutsummaryrefslogtreecommitdiff
path: root/drivers/net/usb/usbnet.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-23 08:12:54 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-23 08:12:54 -0700
commit641e22e04c48af5d813f119c55336e02a22756f5 (patch)
tree9f7f693e8dd030e1d28585893e6e53bd86b1208c /drivers/net/usb/usbnet.c
parent31f6e1bd3b58c9a67e5ea0c2d372fbf5fc9e326d (diff)
parentfa91d43b914b77637653d984416e17e182f7b807 (diff)
Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6: (29 commits) USB: Add support for Olimex arm-usb-ocd JTAG interface serial port USB: Add support for Sierra Wireless Aircard 595U USB: ldusb bugfix USB: ftdi_sio: Add USB Product Id for OpenDCC USB: fix ratelimit call semantics USB: handle errors in power/level attribute USB: make the autosuspend workqueue thread freezable USB: Fix USB OHCI Subvendor for Toshiba Portege 4000 USB: usblp: Use correct DMA address in case of probe error USB: Fix debug output of ark3116 USB: Onetouch - switch to using input_dev->dev.parent USB: don't try to kzalloc 0 bytes USB: remove short initial timeout for device descriptor fetch USB: Deref URB after usbmon is done with it USB: Remove duplicate IDs from option card driver USB: auerswald: fix file release handler USB: fsl_usb2_udc: Fix UMTI_WIDE support and a compile warning USB: set the correct Interrupt interval in usb_bulk_msg USB: New device PID for ftdi_sio driver USB: remove unneeded WARN_ON ...
Diffstat (limited to 'drivers/net/usb/usbnet.c')
-rw-r--r--drivers/net/usb/usbnet.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index f9cd42d058b0..5b16d9a1269a 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -1252,20 +1252,23 @@ EXPORT_SYMBOL_GPL(usbnet_probe);
/*-------------------------------------------------------------------------*/
-/* FIXME these suspend/resume methods assume non-CDC style
- * devices, with only one interface.
+/*
+ * suspend the whole driver as soon as the first interface is suspended
+ * resume only when the last interface is resumed
*/
int usbnet_suspend (struct usb_interface *intf, pm_message_t message)
{
struct usbnet *dev = usb_get_intfdata(intf);
- /* 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);
+ if (!dev->suspend_count++) {
+ /* 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);
+ }
return 0;
}
EXPORT_SYMBOL_GPL(usbnet_suspend);
@@ -1274,8 +1277,10 @@ int usbnet_resume (struct usb_interface *intf)
{
struct usbnet *dev = usb_get_intfdata(intf);
- netif_device_attach (dev->net);
- tasklet_schedule (&dev->bh);
+ if (!--dev->suspend_count) {
+ netif_device_attach (dev->net);
+ tasklet_schedule (&dev->bh);
+ }
return 0;
}
EXPORT_SYMBOL_GPL(usbnet_resume);