Lines Matching refs:anchor
125 void usb_anchor_urb(struct urb *urb, struct usb_anchor *anchor) in usb_anchor_urb() argument
129 spin_lock_irqsave(&anchor->lock, flags); in usb_anchor_urb()
131 list_add_tail(&urb->anchor_list, &anchor->urb_list); in usb_anchor_urb()
132 urb->anchor = anchor; in usb_anchor_urb()
134 if (unlikely(anchor->poisoned)) in usb_anchor_urb()
137 spin_unlock_irqrestore(&anchor->lock, flags); in usb_anchor_urb()
141 static int usb_anchor_check_wakeup(struct usb_anchor *anchor) in usb_anchor_check_wakeup() argument
143 return atomic_read(&anchor->suspend_wakeups) == 0 && in usb_anchor_check_wakeup()
144 list_empty(&anchor->urb_list); in usb_anchor_check_wakeup()
148 static void __usb_unanchor_urb(struct urb *urb, struct usb_anchor *anchor) in __usb_unanchor_urb() argument
150 urb->anchor = NULL; in __usb_unanchor_urb()
153 if (usb_anchor_check_wakeup(anchor)) in __usb_unanchor_urb()
154 wake_up(&anchor->wait); in __usb_unanchor_urb()
166 struct usb_anchor *anchor; in usb_unanchor_urb() local
171 anchor = urb->anchor; in usb_unanchor_urb()
172 if (!anchor) in usb_unanchor_urb()
175 spin_lock_irqsave(&anchor->lock, flags); in usb_unanchor_urb()
181 if (likely(anchor == urb->anchor)) in usb_unanchor_urb()
182 __usb_unanchor_urb(urb, anchor); in usb_unanchor_urb()
183 spin_unlock_irqrestore(&anchor->lock, flags); in usb_unanchor_urb()
783 void usb_kill_anchored_urbs(struct usb_anchor *anchor) in usb_kill_anchored_urbs() argument
787 spin_lock_irq(&anchor->lock); in usb_kill_anchored_urbs()
788 while (!list_empty(&anchor->urb_list)) { in usb_kill_anchored_urbs()
789 victim = list_entry(anchor->urb_list.prev, struct urb, in usb_kill_anchored_urbs()
793 spin_unlock_irq(&anchor->lock); in usb_kill_anchored_urbs()
797 spin_lock_irq(&anchor->lock); in usb_kill_anchored_urbs()
799 spin_unlock_irq(&anchor->lock); in usb_kill_anchored_urbs()
815 void usb_poison_anchored_urbs(struct usb_anchor *anchor) in usb_poison_anchored_urbs() argument
819 spin_lock_irq(&anchor->lock); in usb_poison_anchored_urbs()
820 anchor->poisoned = 1; in usb_poison_anchored_urbs()
821 while (!list_empty(&anchor->urb_list)) { in usb_poison_anchored_urbs()
822 victim = list_entry(anchor->urb_list.prev, struct urb, in usb_poison_anchored_urbs()
826 spin_unlock_irq(&anchor->lock); in usb_poison_anchored_urbs()
830 spin_lock_irq(&anchor->lock); in usb_poison_anchored_urbs()
832 spin_unlock_irq(&anchor->lock); in usb_poison_anchored_urbs()
843 void usb_unpoison_anchored_urbs(struct usb_anchor *anchor) in usb_unpoison_anchored_urbs() argument
848 spin_lock_irqsave(&anchor->lock, flags); in usb_unpoison_anchored_urbs()
849 list_for_each_entry(lazarus, &anchor->urb_list, anchor_list) { in usb_unpoison_anchored_urbs()
852 anchor->poisoned = 0; in usb_unpoison_anchored_urbs()
853 spin_unlock_irqrestore(&anchor->lock, flags); in usb_unpoison_anchored_urbs()
868 void usb_unlink_anchored_urbs(struct usb_anchor *anchor) in usb_unlink_anchored_urbs() argument
872 while ((victim = usb_get_from_anchor(anchor)) != NULL) { in usb_unlink_anchored_urbs()
887 void usb_anchor_suspend_wakeups(struct usb_anchor *anchor) in usb_anchor_suspend_wakeups() argument
889 if (anchor) in usb_anchor_suspend_wakeups()
890 atomic_inc(&anchor->suspend_wakeups); in usb_anchor_suspend_wakeups()
901 void usb_anchor_resume_wakeups(struct usb_anchor *anchor) in usb_anchor_resume_wakeups() argument
903 if (!anchor) in usb_anchor_resume_wakeups()
906 atomic_dec(&anchor->suspend_wakeups); in usb_anchor_resume_wakeups()
907 if (usb_anchor_check_wakeup(anchor)) in usb_anchor_resume_wakeups()
908 wake_up(&anchor->wait); in usb_anchor_resume_wakeups()
922 int usb_wait_anchor_empty_timeout(struct usb_anchor *anchor, in usb_wait_anchor_empty_timeout() argument
925 return wait_event_timeout(anchor->wait, in usb_wait_anchor_empty_timeout()
926 usb_anchor_check_wakeup(anchor), in usb_wait_anchor_empty_timeout()
941 struct urb *usb_get_from_anchor(struct usb_anchor *anchor) in usb_get_from_anchor() argument
946 spin_lock_irqsave(&anchor->lock, flags); in usb_get_from_anchor()
947 if (!list_empty(&anchor->urb_list)) { in usb_get_from_anchor()
948 victim = list_entry(anchor->urb_list.next, struct urb, in usb_get_from_anchor()
951 __usb_unanchor_urb(victim, anchor); in usb_get_from_anchor()
955 spin_unlock_irqrestore(&anchor->lock, flags); in usb_get_from_anchor()
968 void usb_scuttle_anchored_urbs(struct usb_anchor *anchor) in usb_scuttle_anchored_urbs() argument
973 spin_lock_irqsave(&anchor->lock, flags); in usb_scuttle_anchored_urbs()
974 while (!list_empty(&anchor->urb_list)) { in usb_scuttle_anchored_urbs()
975 victim = list_entry(anchor->urb_list.prev, struct urb, in usb_scuttle_anchored_urbs()
977 __usb_unanchor_urb(victim, anchor); in usb_scuttle_anchored_urbs()
979 spin_unlock_irqrestore(&anchor->lock, flags); in usb_scuttle_anchored_urbs()
990 int usb_anchor_empty(struct usb_anchor *anchor) in usb_anchor_empty() argument
992 return list_empty(&anchor->urb_list); in usb_anchor_empty()