Lines Matching refs:anchor

126 void usb_anchor_urb(struct urb *urb, struct usb_anchor *anchor)  in usb_anchor_urb()  argument
130 spin_lock_irqsave(&anchor->lock, flags); in usb_anchor_urb()
132 list_add_tail(&urb->anchor_list, &anchor->urb_list); in usb_anchor_urb()
133 urb->anchor = anchor; in usb_anchor_urb()
135 if (unlikely(anchor->poisoned)) in usb_anchor_urb()
138 spin_unlock_irqrestore(&anchor->lock, flags); in usb_anchor_urb()
142 static int usb_anchor_check_wakeup(struct usb_anchor *anchor) in usb_anchor_check_wakeup() argument
144 return atomic_read(&anchor->suspend_wakeups) == 0 && in usb_anchor_check_wakeup()
145 list_empty(&anchor->urb_list); in usb_anchor_check_wakeup()
149 static void __usb_unanchor_urb(struct urb *urb, struct usb_anchor *anchor) in __usb_unanchor_urb() argument
151 urb->anchor = NULL; in __usb_unanchor_urb()
154 if (usb_anchor_check_wakeup(anchor)) in __usb_unanchor_urb()
155 wake_up(&anchor->wait); in __usb_unanchor_urb()
167 struct usb_anchor *anchor; in usb_unanchor_urb() local
172 anchor = urb->anchor; in usb_unanchor_urb()
173 if (!anchor) in usb_unanchor_urb()
176 spin_lock_irqsave(&anchor->lock, flags); in usb_unanchor_urb()
182 if (likely(anchor == urb->anchor)) in usb_unanchor_urb()
183 __usb_unanchor_urb(urb, anchor); in usb_unanchor_urb()
184 spin_unlock_irqrestore(&anchor->lock, flags); in usb_unanchor_urb()
800 void usb_kill_anchored_urbs(struct usb_anchor *anchor) in usb_kill_anchored_urbs() argument
806 spin_lock_irq(&anchor->lock); in usb_kill_anchored_urbs()
807 while (!list_empty(&anchor->urb_list)) { in usb_kill_anchored_urbs()
808 victim = list_entry(anchor->urb_list.prev, in usb_kill_anchored_urbs()
812 spin_unlock_irq(&anchor->lock); in usb_kill_anchored_urbs()
816 spin_lock_irq(&anchor->lock); in usb_kill_anchored_urbs()
818 surely_empty = usb_anchor_check_wakeup(anchor); in usb_kill_anchored_urbs()
820 spin_unlock_irq(&anchor->lock); in usb_kill_anchored_urbs()
838 void usb_poison_anchored_urbs(struct usb_anchor *anchor) in usb_poison_anchored_urbs() argument
844 spin_lock_irq(&anchor->lock); in usb_poison_anchored_urbs()
845 anchor->poisoned = 1; in usb_poison_anchored_urbs()
846 while (!list_empty(&anchor->urb_list)) { in usb_poison_anchored_urbs()
847 victim = list_entry(anchor->urb_list.prev, in usb_poison_anchored_urbs()
851 spin_unlock_irq(&anchor->lock); in usb_poison_anchored_urbs()
855 spin_lock_irq(&anchor->lock); in usb_poison_anchored_urbs()
857 surely_empty = usb_anchor_check_wakeup(anchor); in usb_poison_anchored_urbs()
859 spin_unlock_irq(&anchor->lock); in usb_poison_anchored_urbs()
872 void usb_unpoison_anchored_urbs(struct usb_anchor *anchor) in usb_unpoison_anchored_urbs() argument
877 spin_lock_irqsave(&anchor->lock, flags); in usb_unpoison_anchored_urbs()
878 list_for_each_entry(lazarus, &anchor->urb_list, anchor_list) { in usb_unpoison_anchored_urbs()
881 anchor->poisoned = 0; in usb_unpoison_anchored_urbs()
882 spin_unlock_irqrestore(&anchor->lock, flags); in usb_unpoison_anchored_urbs()
897 void usb_unlink_anchored_urbs(struct usb_anchor *anchor) in usb_unlink_anchored_urbs() argument
901 while ((victim = usb_get_from_anchor(anchor)) != NULL) { in usb_unlink_anchored_urbs()
916 void usb_anchor_suspend_wakeups(struct usb_anchor *anchor) in usb_anchor_suspend_wakeups() argument
918 if (anchor) in usb_anchor_suspend_wakeups()
919 atomic_inc(&anchor->suspend_wakeups); in usb_anchor_suspend_wakeups()
930 void usb_anchor_resume_wakeups(struct usb_anchor *anchor) in usb_anchor_resume_wakeups() argument
932 if (!anchor) in usb_anchor_resume_wakeups()
935 atomic_dec(&anchor->suspend_wakeups); in usb_anchor_resume_wakeups()
936 if (usb_anchor_check_wakeup(anchor)) in usb_anchor_resume_wakeups()
937 wake_up(&anchor->wait); in usb_anchor_resume_wakeups()
951 int usb_wait_anchor_empty_timeout(struct usb_anchor *anchor, in usb_wait_anchor_empty_timeout() argument
954 return wait_event_timeout(anchor->wait, in usb_wait_anchor_empty_timeout()
955 usb_anchor_check_wakeup(anchor), in usb_wait_anchor_empty_timeout()
970 struct urb *usb_get_from_anchor(struct usb_anchor *anchor) in usb_get_from_anchor() argument
975 spin_lock_irqsave(&anchor->lock, flags); in usb_get_from_anchor()
976 if (!list_empty(&anchor->urb_list)) { in usb_get_from_anchor()
977 victim = list_entry(anchor->urb_list.next, struct urb, in usb_get_from_anchor()
980 __usb_unanchor_urb(victim, anchor); in usb_get_from_anchor()
984 spin_unlock_irqrestore(&anchor->lock, flags); in usb_get_from_anchor()
997 void usb_scuttle_anchored_urbs(struct usb_anchor *anchor) in usb_scuttle_anchored_urbs() argument
1004 spin_lock_irqsave(&anchor->lock, flags); in usb_scuttle_anchored_urbs()
1005 while (!list_empty(&anchor->urb_list)) { in usb_scuttle_anchored_urbs()
1006 victim = list_entry(anchor->urb_list.prev, in usb_scuttle_anchored_urbs()
1008 __usb_unanchor_urb(victim, anchor); in usb_scuttle_anchored_urbs()
1010 surely_empty = usb_anchor_check_wakeup(anchor); in usb_scuttle_anchored_urbs()
1012 spin_unlock_irqrestore(&anchor->lock, flags); in usb_scuttle_anchored_urbs()
1025 int usb_anchor_empty(struct usb_anchor *anchor) in usb_anchor_empty() argument
1027 return list_empty(&anchor->urb_list); in usb_anchor_empty()