diff --git a/src/add-ons/kernel/busses/usb/uhci.cpp b/src/add-ons/kernel/busses/usb/uhci.cpp index 8f3a3bf3fb..9756a0224b 100644 --- a/src/add-ons/kernel/busses/usb/uhci.cpp +++ b/src/add-ons/kernel/busses/usb/uhci.cpp @@ -538,6 +538,45 @@ UHCI::SubmitTransfer(Transfer *transfer) } +status_t +UHCI::CancelQueuedTransfers(Pipe *pipe) +{ + if (!Lock()) + return B_ERROR; + + transfer_data *last = NULL; + transfer_data *current = fFirstTransfer; + while (current) { + if (current->transfer->TransferPipe() == pipe) { + current->queue->RemoveTransfer(current->transfer_queue); + FreeDescriptorChain(current->first_descriptor); + FreeTransferQueue(current->transfer_queue); + current->transfer->Finished(B_CANCELED, 0); + delete current->transfer; + + transfer_data *next = current->link; + if (last) + last->link = next; + else + fFirstTransfer = next; + + if (fLastTransfer == current) + fLastTransfer = last; + + delete current; + current = next; + } else { + last = current; + current = current->link; + } + } + + Unlock(); + + return B_OK; +} + + status_t UHCI::SubmitRequest(Transfer *transfer) { diff --git a/src/add-ons/kernel/busses/usb/uhci.h b/src/add-ons/kernel/busses/usb/uhci.h index 03353f23a7..2f22db92e4 100644 --- a/src/add-ons/kernel/busses/usb/uhci.h +++ b/src/add-ons/kernel/busses/usb/uhci.h @@ -68,6 +68,7 @@ public: status_t Start(); virtual status_t SubmitTransfer(Transfer *transfer); +virtual status_t CancelQueuedTransfers(Pipe *pipe); status_t SubmitRequest(Transfer *transfer); static status_t AddTo(Stack *stack);