+ Log_Warning("EHCI", "%P IOC - TODO: Call registered callbacks and reclaim",
+ Cont->PhysBase);
+ // Scan active TDs
+ Mutex_Acquire(&Cont->ActiveTDsLock);
+ tEHCI_qTD *prev = NULL;
+ for(tEHCI_qTD *td = Cont->ActiveTDHead; td; td = td->Next)
+ {
+ LOG("td(%p)->Token = %x", td, td->Token);
+ // If active, continue
+ if( td->Token & QTD_TOKEN_STS_ACTIVE ) {
+ prev = td;
+ continue ;
+ }
+
+ // Inactive
+ LOG("%p Complete", td);
+ // - call the callback
+ if( td->Callback )
+ {
+ void *ptr = NULL;
+ if( td->Pages[0] ) {
+ Log_Warning("EHCI", "TODO: Map %x,%x+%i for callback",
+ td->Pages[0], td->Pages[1], td->Size);
+ }
+ td->Callback(td->CallbackData, ptr, td->Size);
+ }
+
+ // Remove and release
+ *(prev ? &prev->Next : &Cont->ActiveTDHead) = td->Next;
+ td->Token = 0;
+ }
+ Cont->ActiveTDTail = prev;
+ Mutex_Release(&Cont->ActiveTDsLock);