Browse Source

Remove to-be-deleted pipes from periodic schedule

main
PaulStoffregen 7 years ago
parent
commit
fe5cf3e4cd
1 changed files with 25 additions and 2 deletions
  1. +25
    -2
      ehci.cpp

+ 25
- 2
ehci.cpp 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;
}


Loading…
Cancel
Save