diff options
Diffstat (limited to 'drivers/usb/host/ehci-sched.c')
| -rw-r--r-- | drivers/usb/host/ehci-sched.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index b25cdea93a1f..a5535b5e3fe2 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
| @@ -475,6 +475,8 @@ static int enable_periodic (struct ehci_hcd *ehci) | |||
| 475 | /* make sure ehci_work scans these */ | 475 | /* make sure ehci_work scans these */ |
| 476 | ehci->next_uframe = ehci_readl(ehci, &ehci->regs->frame_index) | 476 | ehci->next_uframe = ehci_readl(ehci, &ehci->regs->frame_index) |
| 477 | % (ehci->periodic_size << 3); | 477 | % (ehci->periodic_size << 3); |
| 478 | if (unlikely(ehci->broken_periodic)) | ||
| 479 | ehci->last_periodic_enable = ktime_get_real(); | ||
| 478 | return 0; | 480 | return 0; |
| 479 | } | 481 | } |
| 480 | 482 | ||
| @@ -486,6 +488,16 @@ static int disable_periodic (struct ehci_hcd *ehci) | |||
| 486 | if (--ehci->periodic_sched) | 488 | if (--ehci->periodic_sched) |
| 487 | return 0; | 489 | return 0; |
| 488 | 490 | ||
| 491 | if (unlikely(ehci->broken_periodic)) { | ||
| 492 | /* delay experimentally determined */ | ||
| 493 | ktime_t safe = ktime_add_us(ehci->last_periodic_enable, 1000); | ||
| 494 | ktime_t now = ktime_get_real(); | ||
| 495 | s64 delay = ktime_us_delta(safe, now); | ||
| 496 | |||
| 497 | if (unlikely(delay > 0)) | ||
| 498 | udelay(delay); | ||
| 499 | } | ||
| 500 | |||
| 489 | /* did setting PSE not take effect yet? | 501 | /* did setting PSE not take effect yet? |
| 490 | * takes effect only at frame boundaries... | 502 | * takes effect only at frame boundaries... |
| 491 | */ | 503 | */ |
