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
This commit is contained in:
Michael Lotz
2007-05-06 15:55:26 +00:00
parent 3dc77d1dc9
commit 4b3d0fcfda
2 changed files with 5 additions and 6 deletions
+4 -5
View File
@@ -903,7 +903,7 @@ EHCI::AddPendingTransfer(Transfer *transfer, ehci_qh *queueHead,
status_t status_t
EHCI::CancelPendingTransfer(Transfer *transfer) EHCI::CancelQueuedTransfers(Pipe *pipe)
{ {
if (!Lock()) if (!Lock())
return B_ERROR; return B_ERROR;
@@ -911,7 +911,8 @@ EHCI::CancelPendingTransfer(Transfer *transfer)
transfer_data *last = NULL; transfer_data *last = NULL;
transfer_data *current = fFirstTransfer; transfer_data *current = fFirstTransfer;
while (current) { while (current) {
if (current->transfer == transfer) { if (current->transfer->TransferPipe() == pipe) {
UnlinkQueueHead(current->queue_head, &fFreeListHead);
current->transfer->Finished(B_CANCELED, 0); current->transfer->Finished(B_CANCELED, 0);
delete current->transfer; delete current->transfer;
@@ -924,8 +925,6 @@ EHCI::CancelPendingTransfer(Transfer *transfer)
fLastTransfer = last; fLastTransfer = last;
delete current; delete current;
Unlock();
return B_OK;
} }
last = current; last = current;
@@ -933,7 +932,7 @@ EHCI::CancelPendingTransfer(Transfer *transfer)
} }
Unlock(); Unlock();
return B_BAD_VALUE; return B_OK;
} }
+1 -1
View File
@@ -37,6 +37,7 @@ public:
virtual status_t SubmitTransfer(Transfer *transfer); virtual status_t SubmitTransfer(Transfer *transfer);
status_t SubmitPeriodicTransfer(Transfer *transfer); status_t SubmitPeriodicTransfer(Transfer *transfer);
status_t SubmitAsyncTransfer(Transfer *transfer); status_t SubmitAsyncTransfer(Transfer *transfer);
virtual status_t CancelQueuedTransfers(Pipe *pipe);
virtual status_t NotifyPipeChange(Pipe *pipe, virtual status_t NotifyPipeChange(Pipe *pipe,
usb_change change); usb_change change);
@@ -66,7 +67,6 @@ static int32 InterruptHandler(void *data);
ehci_qh *queueHead, ehci_qh *queueHead,
ehci_qtd *dataDescriptor, ehci_qtd *dataDescriptor,
bool directionIn); bool directionIn);
status_t CancelPendingTransfer(Transfer *transfer);
status_t CancelAllPendingTransfers(); status_t CancelAllPendingTransfers();
static int32 FinishThread(void *data); static int32 FinishThread(void *data);