usbnet.c (e89c6fdf9e0eb1b5a03574d4ca73e83eae8deb91) | usbnet.c (fcb0bb6aab256288a4e0a8650d26e4096ec30319) |
---|---|
1/* 2 * USB Network driver infrastructure 3 * Copyright (C) 2000-2005 by David Brownell 4 * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or --- 414 unchanged lines hidden (view full) --- 423 unsigned long flags; 424 enum skb_state old_state; 425 struct skb_data *entry = (struct skb_data *) skb->cb; 426 427 spin_lock_irqsave(&list->lock, flags); 428 old_state = entry->state; 429 entry->state = state; 430 __skb_unlink(skb, list); | 1/* 2 * USB Network driver infrastructure 3 * Copyright (C) 2000-2005 by David Brownell 4 * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or --- 414 unchanged lines hidden (view full) --- 423 unsigned long flags; 424 enum skb_state old_state; 425 struct skb_data *entry = (struct skb_data *) skb->cb; 426 427 spin_lock_irqsave(&list->lock, flags); 428 old_state = entry->state; 429 entry->state = state; 430 __skb_unlink(skb, list); |
431 spin_unlock(&list->lock); 432 spin_lock(&dev->done.lock); | 431 432 /* defer_bh() is never called with list == &dev->done. 433 * spin_lock_nested() tells lockdep that it is OK to take 434 * dev->done.lock here with list->lock held. 435 */ 436 spin_lock_nested(&dev->done.lock, SINGLE_DEPTH_NESTING); 437 |
433 __skb_queue_tail(&dev->done, skb); 434 if (dev->done.qlen == 1) 435 tasklet_schedule(&dev->bh); | 438 __skb_queue_tail(&dev->done, skb); 439 if (dev->done.qlen == 1) 440 tasklet_schedule(&dev->bh); |
436 spin_unlock_irqrestore(&dev->done.lock, flags); | 441 spin_unlock(&dev->done.lock); 442 spin_unlock_irqrestore(&list->lock, flags); |
437 return old_state; 438} 439 440/* some work can't be done in tasklets, so we use keventd 441 * 442 * NOTE: annoying asymmetry: if it's active, schedule_work() fails, 443 * but tasklet_schedule() doesn't. hope the failure is rare. 444 */ --- 299 unchanged lines hidden (view full) --- 744 (void) unlink_urbs (dev, &dev->rxq); 745 tasklet_schedule(&dev->bh); 746 } 747} 748EXPORT_SYMBOL_GPL(usbnet_unlink_rx_urbs); 749 750/*-------------------------------------------------------------------------*/ 751 | 443 return old_state; 444} 445 446/* some work can't be done in tasklets, so we use keventd 447 * 448 * NOTE: annoying asymmetry: if it's active, schedule_work() fails, 449 * but tasklet_schedule() doesn't. hope the failure is rare. 450 */ --- 299 unchanged lines hidden (view full) --- 750 (void) unlink_urbs (dev, &dev->rxq); 751 tasklet_schedule(&dev->bh); 752 } 753} 754EXPORT_SYMBOL_GPL(usbnet_unlink_rx_urbs); 755 756/*-------------------------------------------------------------------------*/ 757 |
758static void wait_skb_queue_empty(struct sk_buff_head *q) 759{ 760 unsigned long flags; 761 762 spin_lock_irqsave(&q->lock, flags); 763 while (!skb_queue_empty(q)) { 764 spin_unlock_irqrestore(&q->lock, flags); 765 schedule_timeout(msecs_to_jiffies(UNLINK_TIMEOUT_MS)); 766 set_current_state(TASK_UNINTERRUPTIBLE); 767 spin_lock_irqsave(&q->lock, flags); 768 } 769 spin_unlock_irqrestore(&q->lock, flags); 770} 771 |
|
752// precondition: never called in_interrupt 753static void usbnet_terminate_urbs(struct usbnet *dev) 754{ 755 DECLARE_WAITQUEUE(wait, current); 756 int temp; 757 758 /* ensure there are no more active urbs */ 759 add_wait_queue(&dev->wait, &wait); 760 set_current_state(TASK_UNINTERRUPTIBLE); 761 temp = unlink_urbs(dev, &dev->txq) + 762 unlink_urbs(dev, &dev->rxq); 763 764 /* maybe wait for deletions to finish. */ | 772// precondition: never called in_interrupt 773static void usbnet_terminate_urbs(struct usbnet *dev) 774{ 775 DECLARE_WAITQUEUE(wait, current); 776 int temp; 777 778 /* ensure there are no more active urbs */ 779 add_wait_queue(&dev->wait, &wait); 780 set_current_state(TASK_UNINTERRUPTIBLE); 781 temp = unlink_urbs(dev, &dev->txq) + 782 unlink_urbs(dev, &dev->rxq); 783 784 /* maybe wait for deletions to finish. */ |
765 while (!skb_queue_empty(&dev->rxq) 766 && !skb_queue_empty(&dev->txq) 767 && !skb_queue_empty(&dev->done)) { 768 schedule_timeout(msecs_to_jiffies(UNLINK_TIMEOUT_MS)); 769 set_current_state(TASK_UNINTERRUPTIBLE); 770 netif_dbg(dev, ifdown, dev->net, 771 "waited for %d urb completions\n", temp); 772 } | 785 wait_skb_queue_empty(&dev->rxq); 786 wait_skb_queue_empty(&dev->txq); 787 wait_skb_queue_empty(&dev->done); 788 netif_dbg(dev, ifdown, dev->net, 789 "waited for %d urb completions\n", temp); |
773 set_current_state(TASK_RUNNING); 774 remove_wait_queue(&dev->wait, &wait); 775} 776 777int usbnet_stop (struct net_device *net) 778{ 779 struct usbnet *dev = netdev_priv(net); 780 struct driver_info *info = dev->driver_info; --- 1328 unchanged lines hidden --- | 790 set_current_state(TASK_RUNNING); 791 remove_wait_queue(&dev->wait, &wait); 792} 793 794int usbnet_stop (struct net_device *net) 795{ 796 struct usbnet *dev = netdev_priv(net); 797 struct driver_info *info = dev->driver_info; --- 1328 unchanged lines hidden --- |