[patch]address FIXME in usbnet w.r.t drivers claiming multiple interfaces
Oliver Neukum <[email protected]>
| Newsgroups | gmane.linux.usb.devel |
|---|---|
| Organization | Novell |
| Message-ID | <[email protected]> |
Hi, this fixes the issue of drivers claiming multiple interfaces. Operations are stopped as soon as an interface is suspend and resumed only as all interfaces have been resumed. This patch is relative to the last one I sent you yesterday. Regards Oliver Signed-off-by: Oliver Neukum <[email protected]> -- --- a/drivers/usb/net/usbnet.c 2007-04-26 10:45:25.000000000 +0200 +++ b/drivers/usb/net/usbnet.c 2007-04-26 10:57:50.000000000 +0200 @@ -1278,20 +1278,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); @@ -1300,9 +1303,11 @@ int usbnet_resume (struct usb_interface { struct usbnet *dev = usb_get_intfdata(intf); - netif_device_attach (dev->net); - if (!test_bit(TASKLET_UNREADY, &dev->flags)) - tasklet_schedule (&dev->bh); + if (!--dev->suspend_count) { + netif_device_attach (dev->net); + if (!test_bit(TASKLET_UNREADY, &dev->flags)) + tasklet_schedule (&dev->bh); + } return 0; } EXPORT_SYMBOL_GPL(usbnet_resume); --- a/drivers/usb/net/usbnet.h 2007-04-26 10:45:34.000000000 +0200 +++ b/drivers/usb/net/usbnet.h 2007-04-26 10:53:14.000000000 +0200 @@ -32,6 +32,7 @@ struct usbnet { struct driver_info *driver_info; wait_queue_head_t *wait; struct mutex phy_mutex; + unsigned char suspend_count; /* i/o info: pipes etc */ unsigned in, out; ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ [email protected] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel