diff --git a/drivers/usb/host/usb-uclass.c b/drivers/usb/host/usb-uclass.c
index a7ac18a7a83..c2c6b79efde 100644
--- a/drivers/usb/host/usb-uclass.c
+++ b/drivers/usb/host/usb-uclass.c
@@ -375,6 +375,12 @@ static void run_threads(void)
 		return;
 	while (!uthread_grp_done(grp_id))
 		uthread_schedule();
+	/*
+	 * uthread_schedule() only frees 'done' threads it walks past
+	 * on the way to the next runnable one. Call it again so it
+	 * drains the tail of the list and releases the last thread.
+	 */
+	uthread_schedule();
 	nthr = 0;
 	grp_id = 0;
 #endif
