From 40fd2328176d31eda2e778f189ef94eb41163f1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 7 May 2007 14:08:30 +0000 Subject: [PATCH] implemented CancelQueuedTransfers for uhci git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21057 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/busses/usb/uhci.cpp | 39 ++++++++++++++++++++++++++ src/add-ons/kernel/busses/usb/uhci.h | 1 + 2 files changed, 40 insertions(+) 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);