From 0913187636abfbc97a2e9b72267de4f600be7bc5 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Wed, 8 Feb 2012 01:10:36 +0000 Subject: [PATCH] [USBEHCI] - Fix a few bulk transfer bugs - Enable interrupt completion on last interrupt - Increment transferred offset - Mass storage device now gets further (passing SRB_FUNCTION_CLAIM_DEVICE) svn path=/branches/usb-bringup-trunk/; revision=55491 --- drivers/usb/usbehci_new/usb_request.cpp | 29 +++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/drivers/usb/usbehci_new/usb_request.cpp b/drivers/usb/usbehci_new/usb_request.cpp index 5ae84c989bf..1aa5c9ba1d0 100644 --- a/drivers/usb/usbehci_new/usb_request.cpp +++ b/drivers/usb/usbehci_new/usb_request.cpp @@ -594,6 +594,7 @@ CUSBRequest::InternalGetTransferType() // initialized with setup packet, must be a control transfer // TransferType = USB_ENDPOINT_TYPE_CONTROL; + ASSERT(m_EndpointDescriptor == FALSE); } // @@ -1048,7 +1049,7 @@ CUSBRequest::BuildBulkTransferQueueHead( PQUEUE_HEAD QueueHead; PVOID Base; ULONG ChainDescriptorLength; - PQUEUE_TRANSFER_DESCRIPTOR FirstDescriptor; + PQUEUE_TRANSFER_DESCRIPTOR FirstDescriptor, LastDescriptor; // // Allocate the queue head @@ -1096,7 +1097,7 @@ CUSBRequest::BuildBulkTransferQueueHead( InternalGetPidDirection(), m_EndpointDescriptor->DataToggle, &FirstDescriptor, - NULL, + &LastDescriptor, &m_EndpointDescriptor->DataToggle, &ChainDescriptorLength); @@ -1104,6 +1105,13 @@ CUSBRequest::BuildBulkTransferQueueHead( // FIXME: handle errors // ASSERT(ChainDescriptorLength == m_TransferBufferLength); + + // + // move to next offset + // + m_TransferBufferLengthCompleted += ChainDescriptorLength; + + ASSERT(Status == STATUS_SUCCESS); // @@ -1114,11 +1122,28 @@ CUSBRequest::BuildBulkTransferQueueHead( QueueHead->EndPointCharacteristics.MaximumPacketLength = m_EndpointDescriptor->EndPointDescriptor.wMaxPacketSize; QueueHead->NextPointer = FirstDescriptor->PhysicalAddr; + + ASSERT(QueueHead->EndPointCharacteristics.DeviceAddress); + ASSERT(QueueHead->EndPointCharacteristics.EndPointNumber); + ASSERT(QueueHead->EndPointCharacteristics.MaximumPacketLength); + ASSERT(QueueHead->NextPointer); + + // + // interrupt on last descriptor + // + LastDescriptor->Token.Bits.InterruptOnComplete = TRUE; + // // store result // *OutHead = QueueHead; + // + // dump status + // + //DPRINT1("bEndpoint %x\n", m_EndpointDescriptor->EndPointDescriptor.bEndpointAddress); + //DumpQueueHead(QueueHead); + // // done //