diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2013-09-03 13:58:43 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-09-17 12:49:24 -0400 |
commit | c7ccde6eac6d3c4bc6110cc3fd76ef3823bc0831 (patch) | |
tree | f5221b8296a245cb9f3e3f84801b1d5d8feb12f9 /include/linux/usb | |
parent | 272b98c6455f00884f0350f775c5342358ebb73f (diff) |
USB: see if URB comes from a completion handler
Now that URBs can be completed inside tasklets, we need a way of
determining whether a completion handler for a given endpoint is
currently running. Otherwise it's not possible to maintain the API
guarantee about keeping isochronous streams synchronous when an
underrun occurs.
This patch adds a field and a routine to check whether a completion
handler for a periodic endpoint is running. At the moment no
analogous routine appears to be necessary for async endpoints, but one
can always be added.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: Ming Lei <tom.leiming@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux/usb')
-rw-r--r-- | include/linux/usb/hcd.h | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 75efc45eaa2f..8c865134c881 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h | |||
@@ -73,6 +73,7 @@ struct giveback_urb_bh { | |||
73 | spinlock_t lock; | 73 | spinlock_t lock; |
74 | struct list_head head; | 74 | struct list_head head; |
75 | struct tasklet_struct bh; | 75 | struct tasklet_struct bh; |
76 | struct usb_host_endpoint *completing_ep; | ||
76 | }; | 77 | }; |
77 | 78 | ||
78 | struct usb_hcd { | 79 | struct usb_hcd { |
@@ -378,6 +379,12 @@ static inline int hcd_giveback_urb_in_bh(struct usb_hcd *hcd) | |||
378 | return hcd->driver->flags & HCD_BH; | 379 | return hcd->driver->flags & HCD_BH; |
379 | } | 380 | } |
380 | 381 | ||
382 | static inline bool hcd_periodic_completion_in_progress(struct usb_hcd *hcd, | ||
383 | struct usb_host_endpoint *ep) | ||
384 | { | ||
385 | return hcd->high_prio_bh.completing_ep == ep; | ||
386 | } | ||
387 | |||
381 | extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); | 388 | extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); |
382 | extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb, | 389 | extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb, |
383 | int status); | 390 | int status); |