diff options
Diffstat (limited to 'drivers/net/usb/usbnet.c')
| -rw-r--r-- | drivers/net/usb/usbnet.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index f9819d10b1f..edb81ed0695 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -359,10 +359,12 @@ static enum skb_state defer_bh(struct usbnet *dev, struct sk_buff *skb,  void usbnet_defer_kevent (struct usbnet *dev, int work)  {  	set_bit (work, &dev->flags); -	if (!schedule_work (&dev->kevent)) -		netdev_err(dev->net, "kevent %d may have been dropped\n", work); -	else +	if (!schedule_work (&dev->kevent)) { +		if (net_ratelimit()) +			netdev_err(dev->net, "kevent %d may have been dropped\n", work); +	} else {  		netdev_dbg(dev->net, "kevent %d scheduled\n", work); +	}  }  EXPORT_SYMBOL_GPL(usbnet_defer_kevent); @@ -1158,6 +1160,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,  		usb_anchor_urb(urb, &dev->deferred);  		/* no use to process more packets */  		netif_stop_queue(net); +		usb_put_urb(urb);  		spin_unlock_irqrestore(&dev->txq.lock, flags);  		netdev_dbg(dev->net, "Delaying transmission for resumption\n");  		goto deferred; @@ -1310,6 +1313,8 @@ void usbnet_disconnect (struct usb_interface *intf)  	cancel_work_sync(&dev->kevent); +	usb_scuttle_anchored_urbs(&dev->deferred); +  	if (dev->driver_info->unbind)  		dev->driver_info->unbind (dev, intf);  |