|
@@ -437,6 +437,9 @@ static int enable_periodic (struct ehci_hcd *ehci)
|
|
|
u32 cmd;
|
|
|
int status;
|
|
|
|
|
|
+ if (ehci->periodic_sched++)
|
|
|
+ return 0;
|
|
|
+
|
|
|
/* did clearing PSE did take effect yet?
|
|
|
* takes effect only at frame boundaries...
|
|
|
*/
|
|
@@ -461,6 +464,9 @@ static int disable_periodic (struct ehci_hcd *ehci)
|
|
|
u32 cmd;
|
|
|
int status;
|
|
|
|
|
|
+ if (--ehci->periodic_sched)
|
|
|
+ return 0;
|
|
|
+
|
|
|
/* did setting PSE not take effect yet?
|
|
|
* takes effect only at frame boundaries...
|
|
|
*/
|
|
@@ -544,13 +550,10 @@ static int qh_link_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
|
|
|
: (qh->usecs * 8);
|
|
|
|
|
|
/* maybe enable periodic schedule processing */
|
|
|
- if (!ehci->periodic_sched++)
|
|
|
- return enable_periodic (ehci);
|
|
|
-
|
|
|
- return 0;
|
|
|
+ return enable_periodic(ehci);
|
|
|
}
|
|
|
|
|
|
-static void qh_unlink_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
|
|
|
+static int qh_unlink_periodic(struct ehci_hcd *ehci, struct ehci_qh *qh)
|
|
|
{
|
|
|
unsigned i;
|
|
|
unsigned period;
|
|
@@ -586,9 +589,7 @@ static void qh_unlink_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
|
|
|
qh_put (qh);
|
|
|
|
|
|
/* maybe turn off periodic schedule */
|
|
|
- ehci->periodic_sched--;
|
|
|
- if (!ehci->periodic_sched)
|
|
|
- (void) disable_periodic (ehci);
|
|
|
+ return disable_periodic(ehci);
|
|
|
}
|
|
|
|
|
|
static void intr_deschedule (struct ehci_hcd *ehci, struct ehci_qh *qh)
|
|
@@ -1562,9 +1563,7 @@ itd_link_urb (
|
|
|
urb->hcpriv = NULL;
|
|
|
|
|
|
timer_action (ehci, TIMER_IO_WATCHDOG);
|
|
|
- if (unlikely (!ehci->periodic_sched++))
|
|
|
- return enable_periodic (ehci);
|
|
|
- return 0;
|
|
|
+ return enable_periodic(ehci);
|
|
|
}
|
|
|
|
|
|
#define ISO_ERRS (EHCI_ISOC_BUF_ERR | EHCI_ISOC_BABBLE | EHCI_ISOC_XACTERR)
|
|
@@ -1642,7 +1641,7 @@ itd_complete (
|
|
|
ehci_urb_done(ehci, urb, 0);
|
|
|
retval = true;
|
|
|
urb = NULL;
|
|
|
- ehci->periodic_sched--;
|
|
|
+ (void) disable_periodic(ehci);
|
|
|
ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
|
|
|
|
|
|
if (unlikely (list_empty (&stream->td_list))) {
|
|
@@ -1951,9 +1950,7 @@ sitd_link_urb (
|
|
|
urb->hcpriv = NULL;
|
|
|
|
|
|
timer_action (ehci, TIMER_IO_WATCHDOG);
|
|
|
- if (!ehci->periodic_sched++)
|
|
|
- return enable_periodic (ehci);
|
|
|
- return 0;
|
|
|
+ return enable_periodic(ehci);
|
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
@@ -2019,7 +2016,7 @@ sitd_complete (
|
|
|
ehci_urb_done(ehci, urb, 0);
|
|
|
retval = true;
|
|
|
urb = NULL;
|
|
|
- ehci->periodic_sched--;
|
|
|
+ (void) disable_periodic(ehci);
|
|
|
ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
|
|
|
|
|
|
if (list_empty (&stream->td_list)) {
|
|
@@ -2243,8 +2240,7 @@ restart:
|
|
|
if (unlikely (modified)) {
|
|
|
if (likely(ehci->periodic_sched > 0))
|
|
|
goto restart;
|
|
|
- /* maybe we can short-circuit this scan! */
|
|
|
- disable_periodic(ehci);
|
|
|
+ /* short-circuit this scan */
|
|
|
now_uframe = clock;
|
|
|
break;
|
|
|
}
|