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()
784 void usb_kill_anchored_urbs(struct usb_anchor *anchor) in usb_kill_anchored_urbs() argument
788 spin_lock_irq(&anchor->lock); in usb_kill_anchored_urbs()
789 while (!list_empty(&anchor->urb_list)) { in usb_kill_anchored_urbs()
790 victim = list_entry(anchor->urb_list.prev, struct urb, in usb_kill_anchored_urbs()
794 spin_unlock_irq(&anchor->lock); in usb_kill_anchored_urbs()
798 spin_lock_irq(&anchor->lock); in usb_kill_anchored_urbs()
800 spin_unlock_irq(&anchor->lock); in usb_kill_anchored_urbs()
816 void usb_poison_anchored_urbs(struct usb_anchor *anchor) in usb_poison_anchored_urbs() argument
820 spin_lock_irq(&anchor->lock); in usb_poison_anchored_urbs()
821 anchor->poisoned = 1; in usb_poison_anchored_urbs()
822 while (!list_empty(&anchor->urb_list)) { in usb_poison_anchored_urbs()
823 victim = list_entry(anchor->urb_list.prev, struct urb, in usb_poison_anchored_urbs()
827 spin_unlock_irq(&anchor->lock); in usb_poison_anchored_urbs()
831 spin_lock_irq(&anchor->lock); in usb_poison_anchored_urbs()
833 spin_unlock_irq(&anchor->lock); in usb_poison_anchored_urbs()
844 void usb_unpoison_anchored_urbs(struct usb_anchor *anchor) in usb_unpoison_anchored_urbs() argument
849 spin_lock_irqsave(&anchor->lock, flags); in usb_unpoison_anchored_urbs()
850 list_for_each_entry(lazarus, &anchor->urb_list, anchor_list) { in usb_unpoison_anchored_urbs()
853 anchor->poisoned = 0; in usb_unpoison_anchored_urbs()
854 spin_unlock_irqrestore(&anchor->lock, flags); in usb_unpoison_anchored_urbs()
869 void usb_unlink_anchored_urbs(struct usb_anchor *anchor) in usb_unlink_anchored_urbs() argument
873 while ((victim = usb_get_from_anchor(anchor)) != NULL) { in usb_unlink_anchored_urbs()
888 void usb_anchor_suspend_wakeups(struct usb_anchor *anchor) in usb_anchor_suspend_wakeups() argument
890 if (anchor) in usb_anchor_suspend_wakeups()
891 atomic_inc(&anchor->suspend_wakeups); in usb_anchor_suspend_wakeups()
902 void usb_anchor_resume_wakeups(struct usb_anchor *anchor) in usb_anchor_resume_wakeups() argument
904 if (!anchor) in usb_anchor_resume_wakeups()
907 atomic_dec(&anchor->suspend_wakeups); in usb_anchor_resume_wakeups()
908 if (usb_anchor_check_wakeup(anchor)) in usb_anchor_resume_wakeups()
909 wake_up(&anchor->wait); in usb_anchor_resume_wakeups()
923 int usb_wait_anchor_empty_timeout(struct usb_anchor *anchor, in usb_wait_anchor_empty_timeout() argument
926 return wait_event_timeout(anchor->wait, in usb_wait_anchor_empty_timeout()
927 usb_anchor_check_wakeup(anchor), in usb_wait_anchor_empty_timeout()
942 struct urb *usb_get_from_anchor(struct usb_anchor *anchor) in usb_get_from_anchor() argument
947 spin_lock_irqsave(&anchor->lock, flags); in usb_get_from_anchor()
948 if (!list_empty(&anchor->urb_list)) { in usb_get_from_anchor()
949 victim = list_entry(anchor->urb_list.next, struct urb, in usb_get_from_anchor()
952 __usb_unanchor_urb(victim, anchor); in usb_get_from_anchor()
956 spin_unlock_irqrestore(&anchor->lock, flags); in usb_get_from_anchor()
969 void usb_scuttle_anchored_urbs(struct usb_anchor *anchor) in usb_scuttle_anchored_urbs() argument
974 spin_lock_irqsave(&anchor->lock, flags); in usb_scuttle_anchored_urbs()
975 while (!list_empty(&anchor->urb_list)) { in usb_scuttle_anchored_urbs()
976 victim = list_entry(anchor->urb_list.prev, struct urb, in usb_scuttle_anchored_urbs()
978 __usb_unanchor_urb(victim, anchor); in usb_scuttle_anchored_urbs()
980 spin_unlock_irqrestore(&anchor->lock, flags); in usb_scuttle_anchored_urbs()
991 int usb_anchor_empty(struct usb_anchor *anchor) in usb_anchor_empty() argument
993 return list_empty(&anchor->urb_list); in usb_anchor_empty()