From 61cb510caf7977c6555e7576770e9b244a8aba90 Mon Sep 17 00:00:00 2001 From: Oliver Neukum Date: Mon, 30 Apr 2007 01:37:44 -0700 Subject: [PATCH] --- yaml --- r: 56827 b: refs/heads/master c: 36433127ae7a842482ba857f5ad3c431817a9542 h: refs/heads/master i: 56825: 9fd0a03c72b4b84320192effcfbfc9cfec35c789 56823: 72813ab868a1f26c79e8e3850fa563b666c0bb1c v: v3 --- [refs] | 2 +- trunk/drivers/net/usb/usbnet.c | 25 +++++++++++++++---------- trunk/drivers/net/usb/usbnet.h | 1 + 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index f0ce5564af56..804308c3ffc9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 741ec4e6d0b7780d29a63f908d6d21df425be365 +refs/heads/master: 36433127ae7a842482ba857f5ad3c431817a9542 diff --git a/trunk/drivers/net/usb/usbnet.c b/trunk/drivers/net/usb/usbnet.c index f9cd42d058b0..5b16d9a1269a 100644 --- a/trunk/drivers/net/usb/usbnet.c +++ b/trunk/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); diff --git a/trunk/drivers/net/usb/usbnet.h b/trunk/drivers/net/usb/usbnet.h index 82db5a8e528e..a3f8b9e7bc00 100644 --- a/trunk/drivers/net/usb/usbnet.h +++ b/trunk/drivers/net/usb/usbnet.h @@ -32,6 +32,7 @@ struct usbnet { const char *driver_name; wait_queue_head_t *wait; struct mutex phy_mutex; + unsigned char suspend_count; /* i/o info: pipes etc */ unsigned in, out;