From fe5cf3e4cd2f48d21a061c48781c17ebf0038f71 Mon Sep 17 00:00:00 2001 From: PaulStoffregen Date: Sun, 26 Feb 2017 09:56:37 -0800 Subject: [PATCH] Remove to-be-deleted pipes from periodic schedule --- ehci.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/ehci.cpp b/ehci.cpp index 8bc61ef..6657eb4 100644 --- a/ehci.cpp +++ b/ehci.cpp @@ -979,8 +979,31 @@ void USBHost::delete_Pipe(Pipe_t *pipe) // hopefully we found everything... free_Pipe(pipe); } else { - // TODO: how to remove from the periodic schedule - + // remove from the periodic schedule + for (uint32_t i=0; i < PERIODIC_LIST_SIZE; i++) { + uint32_t num = periodictable[i]; + if (num & 1) continue; + Pipe_t *node = (Pipe_t *)(num & 0xFFFFFFE0); + if (node == pipe) { + periodictable[i] = pipe->qh.horizontal_link; + continue; + } + Pipe_t *prev = node; + while (1) { + num = node->qh.horizontal_link; + if (num & 1) break; + node = (Pipe_t *)(num & 0xFFFFFFE0); + if (node == pipe) { + prev->qh.horizontal_link = node->qh.horizontal_link; + break; + } + prev = node; + } + } + // TODO: find & free all the transfers which completed + // TODO: do we need to look at pipe->qh.current ?? + // TODO: free all the transfers still attached to the QH + // TODO: free_Pipe(pipe); return; }