diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 8ec27f0..2bc1f2e 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1690,9 +1690,11 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
 	 * and no one may trigger the above deadlock situation when
 	 * running complete() in tasklet.
 	 */
+	__this_cpu_write(*hcd->completing_ep, urb->ep);
 	local_irq_save(flags);
 	urb->complete(urb);
 	local_irq_restore(flags);
+	__this_cpu_write(*hcd->completing_ep, NULL);
 
 	if (atomic_read(&urb->use_flag) == URB_UNUSING)
 		atomic_set(&urb->use_flag, URB_UNUSED);
@@ -2687,6 +2689,10 @@ int usb_add_hcd(struct usb_hcd *hcd,
 	init_giveback_urb_bh(&hcd->high_prio_bh);
 	init_giveback_urb_bh(&hcd->low_prio_bh);
 
+	hcd->completing_ep = alloc_percpu(typeof(*hcd->completing_ep));
+	if (!hcd->completing_ep)
+		goto err_hcd_driver_setup;
+
 	/* enable irqs just before we start the controller,
 	 * if the BIOS provides legacy PCI irqs.
 	 */
@@ -2750,6 +2756,7 @@ err_hcd_driver_start:
 	if (usb_hcd_is_primary_hcd(hcd) && hcd->irq > 0)
 		free_irq(irqnum, hcd);
 err_request_irq:
+	free_percpu(hcd->completing_ep);
 err_hcd_driver_setup:
 err_set_rh_speed:
 	usb_put_dev(hcd->self.root_hub);
@@ -2804,6 +2811,7 @@ void usb_remove_hcd(struct usb_hcd *hcd)
 	 * - it is too late to run complete() here since driver may have
 	 *   been removed already now
 	 */
+	free_percpu(hcd->completing_ep);
 
 	/* Prevent any more root-hub status calls from the timer.
 	 * The HCD might still restart the timer (if a port status change
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
index 83be03f..99cf800 100644
--- a/drivers/usb/host/ehci-sched.c
+++ b/drivers/usb/host/ehci-sched.c
@@ -1409,7 +1409,8 @@ iso_stream_schedule (
 	 * (irq delays etc).  If there are, the behavior depends on
 	 * whether URB_ISO_ASAP is set.
 	 */
-	if (likely (!list_empty (&stream->td_list))) {
+	if (likely (!list_empty (&stream->td_list)) ||
+			hcd_submit_in_complete(ehci_to_hcd(ehci), urb)) {
 
 		/* Take the isochronous scheduling threshold into account */
 		if (ehci->i_thresh)
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index a9c7d44..09ee718 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -149,6 +149,7 @@ struct usb_hcd {
 
 	struct giveback_urb_bh  high_prio_bh;
 	struct giveback_urb_bh  low_prio_bh;
+	struct usb_host_endpoint __percpu **completing_ep;
 
 	/* bandwidth_mutex should be taken before adding or removing
 	 * any new bus bandwidth constraints:
@@ -378,6 +379,12 @@ static inline int hcd_giveback_urb_in_bh(struct usb_hcd *hcd)
 	return hcd->driver->flags & HCD_BH;
 }
 
+static inline int hcd_submit_in_complete(struct usb_hcd *hcd,
+		struct urb *urb)
+{
+	return *__this_cpu_ptr(hcd->completing_ep) == urb->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);
