Author: janderwald
Date: Wed Feb 8 01:10:36 2012
New Revision: 55491
URL:
http://svn.reactos.org/svn/reactos?rev=55491&view=rev
Log:
[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)
Modified:
branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_request.cpp
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_request.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_request.cpp [iso-8859-1]
(original)
+++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_request.cpp [iso-8859-1] Wed
Feb 8 01:10:36 2012
@@ -594,6 +594,7 @@
// initialized with setup packet, must be a control transfer
//
TransferType = USB_ENDPOINT_TYPE_CONTROL;
+ ASSERT(m_EndpointDescriptor == FALSE);
}
//
@@ -1048,7 +1049,7 @@
PQUEUE_HEAD QueueHead;
PVOID Base;
ULONG ChainDescriptorLength;
- PQUEUE_TRANSFER_DESCRIPTOR FirstDescriptor;
+ PQUEUE_TRANSFER_DESCRIPTOR FirstDescriptor, LastDescriptor;
//
// Allocate the queue head
@@ -1096,7 +1097,7 @@
InternalGetPidDirection(),
m_EndpointDescriptor->DataToggle,
&FirstDescriptor,
- NULL,
+ &LastDescriptor,
&m_EndpointDescriptor->DataToggle,
&ChainDescriptorLength);
@@ -1104,6 +1105,13 @@
// FIXME: handle errors
//
ASSERT(ChainDescriptorLength == m_TransferBufferLength);
+
+ //
+ // move to next offset
+ //
+ m_TransferBufferLengthCompleted += ChainDescriptorLength;
+
+
ASSERT(Status == STATUS_SUCCESS);
//
@@ -1114,10 +1122,27 @@
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