Remove to-be-deleted pipes from periodic schedule

This commit is contained in:
PaulStoffregen 2017-02-26 09:56:37 -08:00
parent 80225dfe22
commit fe5cf3e4cd
1 changed files with 25 additions and 2 deletions

View File

@ -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;
}