From 4b3d0fcfda9e442ef8c4c8b6c44f8dc581d3ccbb Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sun, 6 May 2007 15:55:26 +0000 Subject: [PATCH] Implemented transfer cancelling for EHCI by reworking the previously unused CancelPendingTransfer() into CancelQueuedTransfers() with the pipe based semantic. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21044 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/busses/usb/ehci.cpp | 9 ++++----- src/add-ons/kernel/busses/usb/ehci.h | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/add-ons/kernel/busses/usb/ehci.cpp b/src/add-ons/kernel/busses/usb/ehci.cpp index 05b505b8e3..62a27b2425 100644 --- a/src/add-ons/kernel/busses/usb/ehci.cpp +++ b/src/add-ons/kernel/busses/usb/ehci.cpp @@ -903,7 +903,7 @@ EHCI::AddPendingTransfer(Transfer *transfer, ehci_qh *queueHead, status_t -EHCI::CancelPendingTransfer(Transfer *transfer) +EHCI::CancelQueuedTransfers(Pipe *pipe) { if (!Lock()) return B_ERROR; @@ -911,7 +911,8 @@ EHCI::CancelPendingTransfer(Transfer *transfer) transfer_data *last = NULL; transfer_data *current = fFirstTransfer; while (current) { - if (current->transfer == transfer) { + if (current->transfer->TransferPipe() == pipe) { + UnlinkQueueHead(current->queue_head, &fFreeListHead); current->transfer->Finished(B_CANCELED, 0); delete current->transfer; @@ -924,8 +925,6 @@ EHCI::CancelPendingTransfer(Transfer *transfer) fLastTransfer = last; delete current; - Unlock(); - return B_OK; } last = current; @@ -933,7 +932,7 @@ EHCI::CancelPendingTransfer(Transfer *transfer) } Unlock(); - return B_BAD_VALUE; + return B_OK; } diff --git a/src/add-ons/kernel/busses/usb/ehci.h b/src/add-ons/kernel/busses/usb/ehci.h index 7c5f3c63fe..b4a789c788 100644 --- a/src/add-ons/kernel/busses/usb/ehci.h +++ b/src/add-ons/kernel/busses/usb/ehci.h @@ -37,6 +37,7 @@ public: virtual status_t SubmitTransfer(Transfer *transfer); status_t SubmitPeriodicTransfer(Transfer *transfer); status_t SubmitAsyncTransfer(Transfer *transfer); +virtual status_t CancelQueuedTransfers(Pipe *pipe); virtual status_t NotifyPipeChange(Pipe *pipe, usb_change change); @@ -66,7 +67,6 @@ static int32 InterruptHandler(void *data); ehci_qh *queueHead, ehci_qtd *dataDescriptor, bool directionIn); - status_t CancelPendingTransfer(Transfer *transfer); status_t CancelAllPendingTransfers(); static int32 FinishThread(void *data);