|
@@ -475,6 +475,8 @@ static int enable_periodic (struct ehci_hcd *ehci)
|
|
|
/* make sure ehci_work scans these */
|
|
|
ehci->next_uframe = ehci_readl(ehci, &ehci->regs->frame_index)
|
|
|
% (ehci->periodic_size << 3);
|
|
|
+ if (unlikely(ehci->broken_periodic))
|
|
|
+ ehci->last_periodic_enable = ktime_get_real();
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -486,6 +488,16 @@ static int disable_periodic (struct ehci_hcd *ehci)
|
|
|
if (--ehci->periodic_sched)
|
|
|
return 0;
|
|
|
|
|
|
+ if (unlikely(ehci->broken_periodic)) {
|
|
|
+ /* delay experimentally determined */
|
|
|
+ ktime_t safe = ktime_add_us(ehci->last_periodic_enable, 1000);
|
|
|
+ ktime_t now = ktime_get_real();
|
|
|
+ s64 delay = ktime_us_delta(safe, now);
|
|
|
+
|
|
|
+ if (unlikely(delay > 0))
|
|
|
+ udelay(delay);
|
|
|
+ }
|
|
|
+
|
|
|
/* did setting PSE not take effect yet?
|
|
|
* takes effect only at frame boundaries...
|
|
|
*/
|