From ed6fad617e40c496e0b41fc759dfba5536aefe78 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 24 May 2011 18:29:57 +0000 Subject: [PATCH] [USBOHCI] - Don't allocate buffer twice - Cleanup endpoint / general transfer descriptors svn path=/branches/usb-bringup/; revision=51892 --- drivers/usb/usbohci/usb_queue.cpp | 4 ++- drivers/usb/usbohci/usb_request.cpp | 43 ++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/drivers/usb/usbohci/usb_queue.cpp b/drivers/usb/usbohci/usb_queue.cpp index 871a3b0d9f3..912da270fe7 100644 --- a/drivers/usb/usbohci/usb_queue.cpp +++ b/drivers/usb/usbohci/usb_queue.cpp @@ -167,6 +167,8 @@ CUSBQueue::AddUSBRequest( // // request not supported, please try later // + DPRINT1("Request Type %x not supported\n", Type); + ASSERT(FALSE); return Status; } @@ -389,7 +391,7 @@ CUSBQueue::TransferDescriptorCompletionCallback( // // FIXME: check if complete // - + ASSERT(Request->IsRequestComplete()); // // release request // diff --git a/drivers/usb/usbohci/usb_request.cpp b/drivers/usb/usbohci/usb_request.cpp index b4681b70019..38fdfd57101 100644 --- a/drivers/usb/usbohci/usb_request.cpp +++ b/drivers/usb/usbohci/usb_request.cpp @@ -706,7 +706,7 @@ CUSBRequest::BuildControlTransferDescriptor( // // now create the data descriptor // - Status = CreateGeneralTransferDescriptor(&DataDescriptor, m_TransferBufferLength); + Status = CreateGeneralTransferDescriptor(&DataDescriptor, 0); if (!NT_SUCCESS(Status)) { // @@ -924,6 +924,8 @@ VOID CUSBRequest::CompletionCallback( struct _OHCI_ENDPOINT_DESCRIPTOR * OutDescriptor) { + POHCI_GENERAL_TD TransferDescriptor, NextTransferDescriptor; + DPRINT1("CUSBRequest::CompletionCallback\n"); // @@ -938,6 +940,45 @@ CUSBRequest::CompletionCallback( // FIXME: cleanup descriptors // + // + // get first general transfer descriptor + // + TransferDescriptor = (POHCI_GENERAL_TD)OutDescriptor->HeadLogicalDescriptor; + + while(TransferDescriptor) + { + // + // get next + // + NextTransferDescriptor = (POHCI_GENERAL_TD)TransferDescriptor->NextLogicalDescriptor; + + // + // is there a buffer associated + // + if (TransferDescriptor->BufferSize) + { + // + // release buffer + // + m_DmaManager->Release(TransferDescriptor->BufferLogical, TransferDescriptor->BufferSize); + } + + // + // release descriptor + // + m_DmaManager->Release(TransferDescriptor, sizeof(OHCI_GENERAL_TD)); + + // + // move to next + // + TransferDescriptor = NextTransferDescriptor; + } + + // + // release endpoint descriptor + // + m_DmaManager->Release(OutDescriptor, sizeof(OHCI_ENDPOINT_DESCRIPTOR)); + // // signal completion event //