diff options
Diffstat (limited to 'drivers/usb/host/ehci-sched.c')
| -rw-r--r-- | drivers/usb/host/ehci-sched.c | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index b7853c8bac0f..4a0c5a78b2ed 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
| @@ -437,6 +437,9 @@ static int enable_periodic (struct ehci_hcd *ehci) | |||
| 437 | u32 cmd; | 437 | u32 cmd; |
| 438 | int status; | 438 | int status; |
| 439 | 439 | ||
| 440 | if (ehci->periodic_sched++) | ||
| 441 | return 0; | ||
| 442 | |||
| 440 | /* did clearing PSE did take effect yet? | 443 | /* did clearing PSE did take effect yet? |
| 441 | * takes effect only at frame boundaries... | 444 | * takes effect only at frame boundaries... |
| 442 | */ | 445 | */ |
| @@ -461,6 +464,9 @@ static int disable_periodic (struct ehci_hcd *ehci) | |||
| 461 | u32 cmd; | 464 | u32 cmd; |
| 462 | int status; | 465 | int status; |
| 463 | 466 | ||
| 467 | if (--ehci->periodic_sched) | ||
| 468 | return 0; | ||
| 469 | |||
| 464 | /* did setting PSE not take effect yet? | 470 | /* did setting PSE not take effect yet? |
| 465 | * takes effect only at frame boundaries... | 471 | * takes effect only at frame boundaries... |
| 466 | */ | 472 | */ |
| @@ -544,13 +550,10 @@ static int qh_link_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 544 | : (qh->usecs * 8); | 550 | : (qh->usecs * 8); |
| 545 | 551 | ||
| 546 | /* maybe enable periodic schedule processing */ | 552 | /* maybe enable periodic schedule processing */ |
| 547 | if (!ehci->periodic_sched++) | 553 | return enable_periodic(ehci); |
| 548 | return enable_periodic (ehci); | ||
| 549 | |||
| 550 | return 0; | ||
| 551 | } | 554 | } |
| 552 | 555 | ||
| 553 | static void qh_unlink_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh) | 556 | static int qh_unlink_periodic(struct ehci_hcd *ehci, struct ehci_qh *qh) |
| 554 | { | 557 | { |
| 555 | unsigned i; | 558 | unsigned i; |
| 556 | unsigned period; | 559 | unsigned period; |
| @@ -586,9 +589,7 @@ static void qh_unlink_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 586 | qh_put (qh); | 589 | qh_put (qh); |
| 587 | 590 | ||
| 588 | /* maybe turn off periodic schedule */ | 591 | /* maybe turn off periodic schedule */ |
| 589 | ehci->periodic_sched--; | 592 | return disable_periodic(ehci); |
| 590 | if (!ehci->periodic_sched) | ||
| 591 | (void) disable_periodic (ehci); | ||
| 592 | } | 593 | } |
| 593 | 594 | ||
| 594 | static void intr_deschedule (struct ehci_hcd *ehci, struct ehci_qh *qh) | 595 | static void intr_deschedule (struct ehci_hcd *ehci, struct ehci_qh *qh) |
| @@ -1562,9 +1563,7 @@ itd_link_urb ( | |||
| 1562 | urb->hcpriv = NULL; | 1563 | urb->hcpriv = NULL; |
| 1563 | 1564 | ||
| 1564 | timer_action (ehci, TIMER_IO_WATCHDOG); | 1565 | timer_action (ehci, TIMER_IO_WATCHDOG); |
| 1565 | if (unlikely (!ehci->periodic_sched++)) | 1566 | return enable_periodic(ehci); |
| 1566 | return enable_periodic (ehci); | ||
| 1567 | return 0; | ||
| 1568 | } | 1567 | } |
| 1569 | 1568 | ||
| 1570 | #define ISO_ERRS (EHCI_ISOC_BUF_ERR | EHCI_ISOC_BABBLE | EHCI_ISOC_XACTERR) | 1569 | #define ISO_ERRS (EHCI_ISOC_BUF_ERR | EHCI_ISOC_BABBLE | EHCI_ISOC_XACTERR) |
| @@ -1642,7 +1641,7 @@ itd_complete ( | |||
| 1642 | ehci_urb_done(ehci, urb, 0); | 1641 | ehci_urb_done(ehci, urb, 0); |
| 1643 | retval = true; | 1642 | retval = true; |
| 1644 | urb = NULL; | 1643 | urb = NULL; |
| 1645 | ehci->periodic_sched--; | 1644 | (void) disable_periodic(ehci); |
| 1646 | ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--; | 1645 | ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--; |
| 1647 | 1646 | ||
| 1648 | if (unlikely (list_empty (&stream->td_list))) { | 1647 | if (unlikely (list_empty (&stream->td_list))) { |
| @@ -1951,9 +1950,7 @@ sitd_link_urb ( | |||
| 1951 | urb->hcpriv = NULL; | 1950 | urb->hcpriv = NULL; |
| 1952 | 1951 | ||
| 1953 | timer_action (ehci, TIMER_IO_WATCHDOG); | 1952 | timer_action (ehci, TIMER_IO_WATCHDOG); |
| 1954 | if (!ehci->periodic_sched++) | 1953 | return enable_periodic(ehci); |
| 1955 | return enable_periodic (ehci); | ||
| 1956 | return 0; | ||
| 1957 | } | 1954 | } |
| 1958 | 1955 | ||
| 1959 | /*-------------------------------------------------------------------------*/ | 1956 | /*-------------------------------------------------------------------------*/ |
| @@ -2019,7 +2016,7 @@ sitd_complete ( | |||
| 2019 | ehci_urb_done(ehci, urb, 0); | 2016 | ehci_urb_done(ehci, urb, 0); |
| 2020 | retval = true; | 2017 | retval = true; |
| 2021 | urb = NULL; | 2018 | urb = NULL; |
| 2022 | ehci->periodic_sched--; | 2019 | (void) disable_periodic(ehci); |
| 2023 | ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--; | 2020 | ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--; |
| 2024 | 2021 | ||
| 2025 | if (list_empty (&stream->td_list)) { | 2022 | if (list_empty (&stream->td_list)) { |
| @@ -2243,8 +2240,7 @@ restart: | |||
| 2243 | if (unlikely (modified)) { | 2240 | if (unlikely (modified)) { |
| 2244 | if (likely(ehci->periodic_sched > 0)) | 2241 | if (likely(ehci->periodic_sched > 0)) |
| 2245 | goto restart; | 2242 | goto restart; |
| 2246 | /* maybe we can short-circuit this scan! */ | 2243 | /* short-circuit this scan */ |
| 2247 | disable_periodic(ehci); | ||
| 2248 | now_uframe = clock; | 2244 | now_uframe = clock; |
| 2249 | break; | 2245 | break; |
| 2250 | } | 2246 | } |
