diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2011-05-20 20:06:24 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2011-05-20 20:08:05 +0200 | 
| commit | 250f972d85effad5b6e10da4bbd877e6a4b503b6 (patch) | |
| tree | 007393a6fc6439af7e0121dd99a6f9f9fb8405bc /drivers/net/usb/usbnet.c | |
| parent | 7372b0b122af0f6675f3ab65bfd91c8a438e0480 (diff) | |
| parent | bbe7b8bef48c567f5ff3f6041c1fb011292e8f12 (diff) | |
| download | olio-linux-3.10-250f972d85effad5b6e10da4bbd877e6a4b503b6.tar.xz olio-linux-3.10-250f972d85effad5b6e10da4bbd877e6a4b503b6.zip  | |
Merge branch 'timers/urgent' into timers/core
Reason: Get upstream fixes and kfree_rcu which is necessary for a
follow up patch.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/net/usb/usbnet.c')
| -rw-r--r-- | drivers/net/usb/usbnet.c | 18 | 
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 069c1cf0fdf..9ab439d144e 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -645,6 +645,7 @@ int usbnet_stop (struct net_device *net)  	struct driver_info	*info = dev->driver_info;  	int			retval; +	clear_bit(EVENT_DEV_OPEN, &dev->flags);  	netif_stop_queue (net);  	netif_info(dev, ifdown, dev->net, @@ -736,6 +737,7 @@ int usbnet_open (struct net_device *net)  		}  	} +	set_bit(EVENT_DEV_OPEN, &dev->flags);  	netif_start_queue (net);  	netif_info(dev, ifup, dev->net,  		   "open: enable queueing (rx %d, tx %d) mtu %d %s framing\n", @@ -1259,6 +1261,9 @@ void usbnet_disconnect (struct usb_interface *intf)  	if (dev->driver_info->unbind)  		dev->driver_info->unbind (dev, intf); +	usb_kill_urb(dev->interrupt); +	usb_free_urb(dev->interrupt); +  	free_netdev(net);  	usb_put_dev (xdev);  } @@ -1498,6 +1503,10 @@ int usbnet_resume (struct usb_interface *intf)  	int                     retval;  	if (!--dev->suspend_count) { +		/* resume interrupt URBs */ +		if (dev->interrupt && test_bit(EVENT_DEV_OPEN, &dev->flags)) +			usb_submit_urb(dev->interrupt, GFP_NOIO); +  		spin_lock_irq(&dev->txq.lock);  		while ((res = usb_get_from_anchor(&dev->deferred))) { @@ -1516,9 +1525,12 @@ int usbnet_resume (struct usb_interface *intf)  		smp_mb();  		clear_bit(EVENT_DEV_ASLEEP, &dev->flags);  		spin_unlock_irq(&dev->txq.lock); -		if (!(dev->txq.qlen >= TX_QLEN(dev))) -			netif_start_queue(dev->net); -		tasklet_schedule (&dev->bh); + +		if (test_bit(EVENT_DEV_OPEN, &dev->flags)) { +			if (!(dev->txq.qlen >= TX_QLEN(dev))) +				netif_start_queue(dev->net); +			tasklet_schedule (&dev->bh); +		}  	}  	return 0;  }  |