usb: host: ehci-sched: try to turn on io watchdog as long as periodic_count > 0
authorXu Yang <xu.yang_2@nxp.com>
Wed, 9 Aug 2023 06:53:27 +0000 (14:53 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 12 Aug 2023 08:03:22 +0000 (10:03 +0200)
If initially isoc_count = 0, periodic_count > 0 and the io watchdog is
not started (e.g. just timed out), then the io watchdog may not run after
submitting isoc urbs and enable_periodic(). The isoc urbs may not complete
forever if the controller had already stopped periodic schedule.

This will try to call turn_on_io_watchdog() for each enable_periodic() to
ensure the io watchdog functions properly.

Signed-off-by: Xu Yang <xu.yang_2@nxp.com>
Reviewed-by: Alan Stern <stern@rowland.harvard.edu>
Link: https://lore.kernel.org/r/20230809065327.952368-1-xu.yang_2@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/ehci-sched.c

index bd542b6fc46bdab1f42721b682ed49a269f090f3..7e834587e7de1c5812e96bd3be88139d5e105eb2 100644 (file)
@@ -490,13 +490,14 @@ static int tt_no_collision(
 static void enable_periodic(struct ehci_hcd *ehci)
 {
        if (ehci->periodic_count++)
-               return;
+               goto out;
 
        /* Stop waiting to turn off the periodic schedule */
        ehci->enabled_hrtimer_events &= ~BIT(EHCI_HRTIMER_DISABLE_PERIODIC);
 
        /* Don't start the schedule until PSS is 0 */
        ehci_poll_PSS(ehci);
+out:
        turn_on_io_watchdog(ehci);
 }