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@xxxxxxxxxxxxxxxxxxx> CC: Ming Lei <tom.leiming@xxxxxxxxx> --- [as1705] drivers/usb/core/hcd.c | 2 ++ include/linux/usb/hcd.h | 7 +++++++ 2 files changed, 9 insertions(+) Index: usb-3.11/include/linux/usb/hcd.h =================================================================== --- usb-3.11.orig/include/linux/usb/hcd.h +++ usb-3.11/include/linux/usb/hcd.h @@ -73,6 +73,7 @@ struct giveback_urb_bh { spinlock_t lock; struct list_head head; struct tasklet_struct bh; + struct usb_host_endpoint *completing_ep; }; struct usb_hcd { @@ -378,6 +379,12 @@ static inline int hcd_giveback_urb_in_bh return hcd->driver->flags & HCD_BH; } +static inline bool hcd_periodic_completion_in_progress(struct usb_hcd *hcd, + struct usb_host_endpoint *ep) +{ + return hcd->high_prio_bh.completing_ep == ep; +} + extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb, int status); Index: usb-3.11/drivers/usb/core/hcd.c =================================================================== --- usb-3.11.orig/drivers/usb/core/hcd.c +++ usb-3.11/drivers/usb/core/hcd.c @@ -1690,7 +1690,9 @@ static void usb_giveback_urb_bh(unsigned urb = list_entry(local_list.next, struct urb, urb_list); list_del_init(&urb->urb_list); + bh->completing_ep = urb->ep; __usb_hcd_giveback_urb(urb); + bh->completing_ep = NULL; } /* check if there are new URBs to giveback */ -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html