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