Lines Matching refs:anchor
123 void usb_anchor_urb(struct urb *urb, struct usb_anchor *anchor) in usb_anchor_urb() argument
127 spin_lock_irqsave(&anchor->lock, flags); in usb_anchor_urb()
129 list_add_tail(&urb->anchor_list, &anchor->urb_list); in usb_anchor_urb()
130 urb->anchor = anchor; in usb_anchor_urb()
132 if (unlikely(anchor->poisoned)) in usb_anchor_urb()
135 spin_unlock_irqrestore(&anchor->lock, flags); in usb_anchor_urb()
139 static int usb_anchor_check_wakeup(struct usb_anchor *anchor) in usb_anchor_check_wakeup() argument
141 return atomic_read(&anchor->suspend_wakeups) == 0 && in usb_anchor_check_wakeup()
142 list_empty(&anchor->urb_list); in usb_anchor_check_wakeup()
146 static void __usb_unanchor_urb(struct urb *urb, struct usb_anchor *anchor) in __usb_unanchor_urb() argument
148 urb->anchor = NULL; in __usb_unanchor_urb()
151 if (usb_anchor_check_wakeup(anchor)) in __usb_unanchor_urb()
152 wake_up(&anchor->wait); in __usb_unanchor_urb()
164 struct usb_anchor *anchor; in usb_unanchor_urb() local
169 anchor = urb->anchor; in usb_unanchor_urb()
170 if (!anchor) in usb_unanchor_urb()
173 spin_lock_irqsave(&anchor->lock, flags); in usb_unanchor_urb()
179 if (likely(anchor == urb->anchor)) in usb_unanchor_urb()
180 __usb_unanchor_urb(urb, anchor); in usb_unanchor_urb()
181 spin_unlock_irqrestore(&anchor->lock, flags); in usb_unanchor_urb()
755 void usb_kill_anchored_urbs(struct usb_anchor *anchor) in usb_kill_anchored_urbs() argument
759 spin_lock_irq(&anchor->lock); in usb_kill_anchored_urbs()
760 while (!list_empty(&anchor->urb_list)) { in usb_kill_anchored_urbs()
761 victim = list_entry(anchor->urb_list.prev, struct urb, in usb_kill_anchored_urbs()
765 spin_unlock_irq(&anchor->lock); in usb_kill_anchored_urbs()
769 spin_lock_irq(&anchor->lock); in usb_kill_anchored_urbs()
771 spin_unlock_irq(&anchor->lock); in usb_kill_anchored_urbs()
787 void usb_poison_anchored_urbs(struct usb_anchor *anchor) in usb_poison_anchored_urbs() argument
791 spin_lock_irq(&anchor->lock); in usb_poison_anchored_urbs()
792 anchor->poisoned = 1; in usb_poison_anchored_urbs()
793 while (!list_empty(&anchor->urb_list)) { in usb_poison_anchored_urbs()
794 victim = list_entry(anchor->urb_list.prev, struct urb, in usb_poison_anchored_urbs()
798 spin_unlock_irq(&anchor->lock); in usb_poison_anchored_urbs()
802 spin_lock_irq(&anchor->lock); in usb_poison_anchored_urbs()
804 spin_unlock_irq(&anchor->lock); in usb_poison_anchored_urbs()
815 void usb_unpoison_anchored_urbs(struct usb_anchor *anchor) in usb_unpoison_anchored_urbs() argument
820 spin_lock_irqsave(&anchor->lock, flags); in usb_unpoison_anchored_urbs()
821 list_for_each_entry(lazarus, &anchor->urb_list, anchor_list) { in usb_unpoison_anchored_urbs()
824 anchor->poisoned = 0; in usb_unpoison_anchored_urbs()
825 spin_unlock_irqrestore(&anchor->lock, flags); in usb_unpoison_anchored_urbs()
840 void usb_unlink_anchored_urbs(struct usb_anchor *anchor) in usb_unlink_anchored_urbs() argument
844 while ((victim = usb_get_from_anchor(anchor)) != NULL) { in usb_unlink_anchored_urbs()
859 void usb_anchor_suspend_wakeups(struct usb_anchor *anchor) in usb_anchor_suspend_wakeups() argument
861 if (anchor) in usb_anchor_suspend_wakeups()
862 atomic_inc(&anchor->suspend_wakeups); in usb_anchor_suspend_wakeups()
873 void usb_anchor_resume_wakeups(struct usb_anchor *anchor) in usb_anchor_resume_wakeups() argument
875 if (!anchor) in usb_anchor_resume_wakeups()
878 atomic_dec(&anchor->suspend_wakeups); in usb_anchor_resume_wakeups()
879 if (usb_anchor_check_wakeup(anchor)) in usb_anchor_resume_wakeups()
880 wake_up(&anchor->wait); in usb_anchor_resume_wakeups()
894 int usb_wait_anchor_empty_timeout(struct usb_anchor *anchor, in usb_wait_anchor_empty_timeout() argument
897 return wait_event_timeout(anchor->wait, in usb_wait_anchor_empty_timeout()
898 usb_anchor_check_wakeup(anchor), in usb_wait_anchor_empty_timeout()
913 struct urb *usb_get_from_anchor(struct usb_anchor *anchor) in usb_get_from_anchor() argument
918 spin_lock_irqsave(&anchor->lock, flags); in usb_get_from_anchor()
919 if (!list_empty(&anchor->urb_list)) { in usb_get_from_anchor()
920 victim = list_entry(anchor->urb_list.next, struct urb, in usb_get_from_anchor()
923 __usb_unanchor_urb(victim, anchor); in usb_get_from_anchor()
927 spin_unlock_irqrestore(&anchor->lock, flags); in usb_get_from_anchor()
940 void usb_scuttle_anchored_urbs(struct usb_anchor *anchor) in usb_scuttle_anchored_urbs() argument
945 spin_lock_irqsave(&anchor->lock, flags); in usb_scuttle_anchored_urbs()
946 while (!list_empty(&anchor->urb_list)) { in usb_scuttle_anchored_urbs()
947 victim = list_entry(anchor->urb_list.prev, struct urb, in usb_scuttle_anchored_urbs()
949 __usb_unanchor_urb(victim, anchor); in usb_scuttle_anchored_urbs()
951 spin_unlock_irqrestore(&anchor->lock, flags); in usb_scuttle_anchored_urbs()
962 int usb_anchor_empty(struct usb_anchor *anchor) in usb_anchor_empty() argument
964 return list_empty(&anchor->urb_list); in usb_anchor_empty()