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 ---