|
|
@@ -722,26 +722,37 @@ end: |
|
|
|
|
|
|
|
static void run_callbacks(endpoint_t *ep) |
|
|
|
{ |
|
|
|
transfer_t *t, *next; |
|
|
|
|
|
|
|
//printf("run_callbacks\n"); |
|
|
|
t = ep->first_transfer; |
|
|
|
while (t && (uint32_t)t != 1) { |
|
|
|
if (!(t->status & (1<<7))) { |
|
|
|
// transfer not active anymore |
|
|
|
next = (transfer_t *)t->next; |
|
|
|
ep->callback_function(t); |
|
|
|
} else { |
|
|
|
// transfer still active |
|
|
|
transfer_t *first = ep->first_transfer; |
|
|
|
if (first == NULL) return; |
|
|
|
|
|
|
|
// count how many transfers are completed, then remove them from the endpoint's list |
|
|
|
uint32_t count = 0; |
|
|
|
transfer_t *t = first; |
|
|
|
while (1) { |
|
|
|
if (t->status & (1<<7)) { |
|
|
|
// found a still-active transfer, new list begins here |
|
|
|
//printf(" still active\n"); |
|
|
|
ep->first_transfer = t; |
|
|
|
return; |
|
|
|
break; |
|
|
|
} |
|
|
|
count++; |
|
|
|
t = (transfer_t *)t->next; |
|
|
|
if ((uint32_t)t == 1) { |
|
|
|
// reached end of list, all need callbacks, new list is empty |
|
|
|
//printf(" end of list\n"); |
|
|
|
ep->first_transfer = NULL; |
|
|
|
ep->last_transfer = NULL; |
|
|
|
break; |
|
|
|
} |
|
|
|
if (next == ep->last_transfer) break; |
|
|
|
t = next; |
|
|
|
} |
|
|
|
// all transfers completed |
|
|
|
ep->first_transfer = NULL; |
|
|
|
ep->last_transfer = NULL; |
|
|
|
// do all the callbacks |
|
|
|
while (count) { |
|
|
|
transfer_t *next = (transfer_t *)first->next; |
|
|
|
ep->callback_function(first); |
|
|
|
first = next; |
|
|
|
count--; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void usb_transmit(int endpoint_number, transfer_t *transfer) |