Author: janderwald Date: Tue Feb 7 16:18:56 2012 New Revision: 55483
URL: http://svn.reactos.org/svn/reactos?rev=55483&view=rev Log: [USBEHCI] - Don't set NumberOfTransaction 0x3 for the async queue head(Haiku doesnt do it too) - Also don't set maximum packet length or interrupt on complete - Stop the async / periodic schedules after acquiring ownership from os (ported from the Pedigree OS) - Remove unused structs from header - Allocate device descriptor from start of a page to prevent alignment issues - Clear halted bit in the queue overlay transaction layer (usb_queue.cpp:507) - Always set the alternative and next pointers in BuildControlTransferQueueHead - Use data the toggle in the transfer requests - Start using toggle in bulk requests, invert data toggle after each descriptor - EHCI controller still reports error 0xA / 0xB which is USB Error Interrupt + Frame List Rollover + [USB Interrupt] - Errors need to be researched more, though the control transfers results appear o.k. - Tested in real hw + ros stack with USB Mass Storage Device - Currently hangs after first completed CDB/Data/CSW block
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.cpp branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.h branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_device.cpp branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_queue.cpp branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_request.cpp
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.cpp URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/us... ============================================================================== --- branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.cpp [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.cpp [iso-8859-1] Tue Feb 7 16:18:56 2012 @@ -467,18 +467,15 @@ // m_MemoryManager->Allocate(sizeof(QUEUE_HEAD), (PVOID*)&AsyncQueueHead, &AsyncPhysicalAddress);
- AsyncQueueHead->AlternateNextPointer = TERMINATE_POINTER; - AsyncQueueHead->NextPointer = TERMINATE_POINTER; AsyncQueueHead->PhysicalAddr = AsyncPhysicalAddress.LowPart; AsyncQueueHead->HorizontalLinkPointer = AsyncQueueHead->PhysicalAddr | QH_TYPE_QH; - AsyncQueueHead->EndPointCharacteristics.QEDTDataToggleControl = FALSE; - AsyncQueueHead->Token.Bits.InterruptOnComplete = FALSE; AsyncQueueHead->EndPointCharacteristics.HeadOfReclamation = TRUE; + AsyncQueueHead->EndPointCharacteristics.EndPointSpeed = QH_ENDPOINT_HIGHSPEED; AsyncQueueHead->Token.Bits.Halted = TRUE; - AsyncQueueHead->EndPointCharacteristics.MaximumPacketLength = 64; - AsyncQueueHead->EndPointCharacteristics.NakCountReload = 0; - AsyncQueueHead->EndPointCharacteristics.EndPointSpeed = QH_ENDPOINT_HIGHSPEED; - AsyncQueueHead->EndPointCapabilities.NumberOfTransactionPerFrame = 0x03; + + AsyncQueueHead->EndPointCapabilities.NumberOfTransactionPerFrame = 0x01; + AsyncQueueHead->NextPointer = TERMINATE_POINTER; + AsyncQueueHead->CurrentLinkPointer = TERMINATE_POINTER;
InitializeListHead(&AsyncQueueHead->LinkedQueueHeads);
@@ -655,6 +652,39 @@ }
// + // get command register + // + GetCommandRegister(&UsbCmd); + + // + // disable running schedules + // + UsbCmd.PeriodicEnable = FALSE; + UsbCmd.AsyncEnable = FALSE; + SetCommandRegister(&UsbCmd); + + // + // Wait for execution to start + // + for (FailSafe = 100; FailSafe > 1; FailSafe--) + { + KeStallExecutionProcessor(100); + UsbSts = EHCI_READ_REGISTER_ULONG(EHCI_USBSTS); + + if (!(UsbSts & EHCI_STS_PSS) && (UsbSts & EHCI_STS_ASS)) + { + break; + } + } + + if ((UsbSts & (EHCI_STS_PSS | EHCI_STS_ASS))) + { + DPRINT1("Failed to stop running schedules %x\n", UsbSts); + ASSERT(FALSE); + } + + + // // Stop the controller if its running // UsbSts = EHCI_READ_REGISTER_ULONG(EHCI_USBSTS); @@ -1240,6 +1270,8 @@ CStatus = This->EHCI_READ_REGISTER_ULONG(EHCI_USBSTS);
CStatus &= (EHCI_ERROR_INT | EHCI_STS_INT | EHCI_STS_IAA | EHCI_STS_PCD | EHCI_STS_FLR); + DPRINT1("CStatus %x\n", CStatus); + // // Check that it belongs to EHCI // @@ -1307,9 +1339,6 @@ // controller reported error // DPRINT1("CStatus %x\n", CStatus); - Status = STATUS_UNSUCCESSFUL; - PC_ASSERT(FALSE); - return; }
//
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.h URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/us... ============================================================================== --- branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.h [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.h [iso-8859-1] Tue Feb 7 16:18:56 2012 @@ -152,6 +152,8 @@ ULONG TotalBytesToTransfer; } QUEUE_TRANSFER_DESCRIPTOR, *PQUEUE_TRANSFER_DESCRIPTOR;
+C_ASSERT(FIELD_OFFSET(QUEUE_TRANSFER_DESCRIPTOR, PhysicalAddr) == 0x20); + // // EndPointSpeeds Flags and END_POINT_CHARACTERISTICS // @@ -216,6 +218,9 @@ LIST_ENTRY LinkedQueueHeads; PVOID Request; } QUEUE_HEAD, *PQUEUE_HEAD; + +C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, PhysicalAddr) == 0x30); +
// // Command register content @@ -281,30 +286,6 @@ UCHAR PortRoute [15]; } EHCI_CAPS, *PEHCI_CAPS;
- -typedef struct -{ - PKSPIN_LOCK Lock; - RTL_BITMAP Bitmap; - PULONG BitmapBuffer; - ULONG BlockSize; - PVOID VirtualBase; - PHYSICAL_ADDRESS PhysicalBase; - ULONG Length; -}DMA_MEMORY_ALLOCATOR, *LPDMA_MEMORY_ALLOCATOR; - -typedef struct _EHCI_HOST_CONTROLLER -{ - ULONG OpRegisters; - EHCI_CAPS ECHICaps; - PVOID CommonBufferVA; - PHYSICAL_ADDRESS CommonBufferPA; - ULONG CommonBufferSize; - PQUEUE_HEAD AsyncListQueue; - KSPIN_LOCK Lock; - LPDMA_MEMORY_ALLOCATOR DmaMemAllocator; -} EHCI_HOST_CONTROLLER, *PEHCI_HOST_CONTROLLER; - typedef struct { ULONG PortStatus;
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_device.cpp URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/us... ============================================================================== --- branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_device.cpp [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_device.cpp [iso-8859-1] Tue Feb 7 16:18:56 2012 @@ -617,6 +617,7 @@ USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; PMDL Mdl; NTSTATUS Status; + PVOID Buffer;
// // zero descriptor @@ -633,9 +634,26 @@ CtrlSetup.bmRequestType.B = 0x80;
// + // allocate buffer + // + Buffer = ExAllocatePool(NonPagedPool, PAGE_SIZE); + if (!Buffer) + { + // + // failed to allocate + // + return STATUS_INSUFFICIENT_RESOURCES; + } + + // + // zero buffer + // + RtlZeroMemory(Buffer, PAGE_SIZE); + + // // allocate mdl describing the device descriptor // - Mdl = IoAllocateMdl(&m_DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR), FALSE, FALSE, 0); + Mdl = IoAllocateMdl(Buffer, sizeof(USB_DEVICE_DESCRIPTOR), FALSE, FALSE, 0); if (!Mdl) { // @@ -664,8 +682,14 @@ // // informal dbg print // + RtlCopyMemory(&m_DeviceDescriptor, Buffer, sizeof(USB_DEVICE_DESCRIPTOR)); DumpDeviceDescriptor(&m_DeviceDescriptor); } + + // + // free buffer + // + ExFreePool(Buffer);
// // done
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_queue.cpp URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/us... ============================================================================== --- branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_queue.cpp [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_queue.cpp [iso-8859-1] Tue Feb 7 16:18:56 2012 @@ -447,7 +447,7 @@ // // head queue head must be halted // - PC_ASSERT(HeadQueueHead->Token.Bits.Halted == TRUE); + //PC_ASSERT(HeadQueueHead->Token.Bits.Halted == TRUE); }
// @@ -463,7 +463,7 @@ // // sanity check: there must be at least one queue head with halted bit set // - PC_ASSERT(QueueHead->Token.Bits.Halted == 0); + //PC_ASSERT(QueueHead->Token.Bits.Halted == 0);
// // get previous link @@ -499,6 +499,11 @@ // remove software link // RemoveEntryList(&QueueHead->LinkedQueueHeads); + + // + // FIXME: clear failure + // + QueueHead->Token.Bits.Halted = FALSE; }
// @@ -653,7 +658,7 @@ // IsQueueHeadComplete = Request->IsQueueHeadComplete(QueueHead);
- DPRINT("Request %p QueueHead %p Complete %d\n", Request, QueueHead, IsQueueHeadComplete); + DPRINT1("Request %p QueueHead %p Complete %d\n", Request, QueueHead, IsQueueHeadComplete);
// // check if queue head is complete
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/us... ============================================================================== --- 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] Tue Feb 7 16:18:56 2012 @@ -128,7 +128,7 @@ // // DMA transfer descriptors linked to the queue head // - PQUEUE_TRANSFER_DESCRIPTOR m_TransferDescriptors[3]; + PQUEUE_TRANSFER_DESCRIPTOR m_TransferDescriptors[4];
// // allocated setup packet from the DMA pool @@ -690,14 +690,15 @@ QueueHead->EndPointCharacteristics.MaximumPacketLength = m_EndpointDescriptor->wMaxPacketSize; }
- QueueHead->Token.Bits.DataToggle = TRUE; - // // setup descriptors // m_TransferDescriptors[0]->Token.Bits.PIDCode = PID_CODE_SETUP_TOKEN; m_TransferDescriptors[0]->Token.Bits.TotalBytesToTransfer = sizeof(USB_DEFAULT_PIPE_SETUP_PACKET); m_TransferDescriptors[0]->Token.Bits.DataToggle = FALSE; + m_TransferDescriptors[0]->BufferPointer[0] = (ULONG)PtrToUlong(m_DescriptorSetupPacket.LowPart); + m_TransferDescriptors[0]->NextPointer = m_TransferDescriptors[1]->PhysicalAddr; + m_TransferDescriptors[0]->AlternateNextPointer = m_TransferDescriptors[1]->PhysicalAddr;
if (m_TransferBufferMDL) { @@ -706,6 +707,9 @@ // m_TransferDescriptors[1]->Token.Bits.PIDCode = PID_CODE_IN_TOKEN; m_TransferDescriptors[1]->Token.Bits.TotalBytesToTransfer = m_TransferBufferLength; + m_TransferDescriptors[1]->NextPointer = m_TransferDescriptors[2]->PhysicalAddr; + m_TransferDescriptors[1]->Token.Bits.DataToggle = TRUE; + m_TransferDescriptors[1]->AlternateNextPointer = m_TransferDescriptors[2]->PhysicalAddr;
// // FIXME: check if the request spawns over a page -> fill other members @@ -718,63 +722,69 @@ // m_TransferDescriptors[2]->Token.Bits.PIDCode = PID_CODE_OUT_TOKEN; m_TransferDescriptors[2]->Token.Bits.TotalBytesToTransfer = 0; - - // - // link descriptors - // - m_TransferDescriptors[0]->NextPointer = m_TransferDescriptors[1]->PhysicalAddr; + m_TransferDescriptors[2]->Token.Bits.DataToggle = FALSE;
// // special case, setup alternative next descriptor in case of error // HAIKU links to dead descriptor // - m_TransferDescriptors[0]->AlternateNextPointer = m_TransferDescriptors[2]->PhysicalAddr; - m_TransferDescriptors[1]->NextPointer = m_TransferDescriptors[2]->PhysicalAddr; - m_TransferDescriptors[1]->AlternateNextPointer = m_TransferDescriptors[2]->PhysicalAddr;
// // interrupt on completion // m_TransferDescriptors[2]->Token.Bits.InterruptOnComplete = TRUE;
+ _TransferDescriptors[3]->Token.Bits.Halted = TRUE; + } else { // // no buffer, setup in descriptor // - m_TransferDescriptors[1]->Token.Bits.PIDCode = PID_CODE_OUT_TOKEN; + m_TransferDescriptors[1]->Token.Bits.PIDCode = PID_CODE_IN_TOKEN; m_TransferDescriptors[1]->Token.Bits.TotalBytesToTransfer = 0;
// - // link descriptors - // - m_TransferDescriptors[0]->NextPointer = m_TransferDescriptors[1]->PhysicalAddr; - m_TransferDescriptors[0]->AlternateNextPointer = m_TransferDescriptors[1]->PhysicalAddr; - - // // interrupt on completion // m_TransferDescriptors[1]->Token.Bits.InterruptOnComplete = TRUE; }
// - // link setup packet into buffer - Physical Address!!! - // - m_TransferDescriptors[0]->BufferPointer[0] = (ULONG)PtrToUlong(m_DescriptorSetupPacket.LowPart); - - // // link transfer descriptors to queue head // QueueHead->NextPointer = m_TransferDescriptors[0]->PhysicalAddr; -/* - if (m_TransferBufferMDL) - QueueHead->AlternateNextPointer = m_TransferDescriptors[2]->PhysicalAddr; - else - QueueHead->AlternateNextPointer = m_TransferDescriptors[1]->PhysicalAddr; - - QueueHead->EndPointCapabilities.InterruptScheduleMask = 0x0; -*/ + + DPRINT("QueueHead %p Addr %x\n", QueueHead, QueueHead->PhysicalAddr); + DPRINT("NumDescriptors %lu\n", NumTransferDescriptors); + DPRINT("QueueHead AlternateNextPointer %x\n", QueueHead->AlternateNextPointer); + DPRINT("QueueHead NextPointer %x\n", QueueHead->NextPointer); + DPRINT("m_DescriptorSetupPacket HiPart %x LoPart %x\n", m_DescriptorSetupPacket.HighPart, m_DescriptorSetupPacket.LowPart); + + + DPRINT("TransferDescriptor 0 Addr %x\n", m_TransferDescriptors[0]->PhysicalAddr); + DPRINT("TransferDescriptor 0 Next %x\n", m_TransferDescriptors[0]->NextPointer); + DPRINT("TransferDescriptor 0 AlternativeNext %x\n", m_TransferDescriptors[0]->AlternateNextPointer); + DPRINT("TransferDescriptor 0 Buffer Pointer %x\n", m_TransferDescriptors[0]->BufferPointer[0]); + DPRINT("TransferDescriptor 0 TotalBytesToTransfer 0x%x\n", m_TransferDescriptors[0]->Token.Bits.TotalBytesToTransfer); + + DPRINT("TransferDescriptor 1 Addr %x\n", m_TransferDescriptors[1]->PhysicalAddr); + DPRINT("TransferDescriptor 1 Next %x\n", m_TransferDescriptors[1]->NextPointer); + DPRINT("TransferDescriptor 1 AlternativeNext %x\n", m_TransferDescriptors[1]->AlternateNextPointer); + DPRINT("TransferDescriptor 1 Buffer Pointer %x\n", m_TransferDescriptors[1]->BufferPointer[0]); + DPRINT("TransferDescriptor 1 TotalBytesToTransfer 0x%x\n", m_TransferDescriptors[1]->Token.Bits.TotalBytesToTransfer); + + if (NumTransferDescriptors == 3) + { + DPRINT("TransferDescriptor 2 Addr %x\n", m_TransferDescriptors[2]->PhysicalAddr); + DPRINT("TransferDescriptor 2 Next %x\n", m_TransferDescriptors[2]->NextPointer); + DPRINT("TransferDescriptor 2 AlternativeNext %x\n", m_TransferDescriptors[2]->AlternateNextPointer); + DPRINT("TransferDescriptor 2 Buffer Pointer %x\n", m_TransferDescriptors[2]->BufferPointer[0]); + DPRINT("TransferDescriptor 2 TotalBytesToTransfer 0x%x\n", m_TransferDescriptors[2]->Token.Bits.TotalBytesToTransfer); + } + + // // store result // @@ -797,6 +807,7 @@ ULONG BytesAvailable, BufferIndex; PVOID Base; ULONG PageOffset, CurrentTransferBufferLength; + UCHAR DataToggle;
// // Allocate the queue head @@ -867,6 +878,8 @@ // m_TransferBufferLengthCompleted += CurrentTransferBufferLength; BytesAvailable = CurrentTransferBufferLength; + + DPRINT1("BuildBulkTransferQueueHead\n"); DPRINT("CurrentTransferBufferLength %x, m_TransferBufferLengthCompleted %x\n", CurrentTransferBufferLength, m_TransferBufferLengthCompleted);
DPRINT("EndPointAddress %x\n", m_EndpointDescriptor->bEndpointAddress); @@ -877,6 +890,11 @@ DPRINT("Irp %p QueueHead %p\n", m_Irp, QueueHead);
//PC_ASSERT(InternalGetPidDirection() == USB_ENDPOINT_DIRECTION_IN(m_EndpointDescriptor->bEndpointAddress)); + + // + // DataToggle + // + DataToggle = FALSE;
// // Allocated transfer descriptors @@ -940,7 +958,7 @@ // BytesAvailable -= m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer;
- DPRINT("TransferDescriptor %p BufferPointer %p BufferIndex %lu TotalBytes %lu Remaining %lu\n", m_TransferDescriptors[Index], m_TransferDescriptors[Index]->BufferPointer[BufferIndex], + DPRINT1("TransferDescriptor %p Index %lu BufferPointer %p BufferIndex %lu TotalBytes %lu Remaining %lu\n", m_TransferDescriptors[Index], Index, m_TransferDescriptors[Index]->BufferPointer[BufferIndex], BufferIndex, m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer, BytesAvailable); } else @@ -972,32 +990,35 @@ // BytesAvailable -= PAGE_SIZE;
- DPRINT("TransferDescriptor %p BufferPointer %p BufferIndex %lu TotalBytes %lu Remaining %lu\n", m_TransferDescriptors[Index], m_TransferDescriptors[Index]->BufferPointer[BufferIndex], + DPRINT1("TransferDescriptor %p Index %lu BufferPointer %p BufferIndex %lu TotalBytes %lu Remaining %lu\n", m_TransferDescriptors[Index], Index, m_TransferDescriptors[Index]->BufferPointer[BufferIndex], BufferIndex, m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer, BytesAvailable); } else { PC_ASSERT(BytesAvailable);
- // - // store address - // - m_TransferDescriptors[Index]->BufferPointer[BufferIndex] = MmGetPhysicalAddress(Base).LowPart; - - // - // increment transfer descriptor bytes - // - m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer += BytesAvailable; - - // - // decrement available byte count - // - BytesAvailable -= BytesAvailable; - - // - // done as this is the last partial or full page - // - DPRINT("TransferDescriptor %p BufferPointer %p BufferIndex %lu TotalBytes %lu Remaining %lu\n", m_TransferDescriptors[Index], m_TransferDescriptors[Index]->BufferPointer[BufferIndex], + if (BytesAvailable) + { + // + // store address + // + m_TransferDescriptors[Index]->BufferPointer[BufferIndex] = MmGetPhysicalAddress(Base).LowPart; + + // + // increment transfer descriptor bytes + // + m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer += BytesAvailable; + + // + // decrement available byte count + // + BytesAvailable -= BytesAvailable; + + // + // done as this is the last partial or full page + // + } + DPRINT1("TransferDescriptor %p Index %lu BufferPointer %p BufferIndex %lu TotalBytes %lu Remaining %lu\n", m_TransferDescriptors[Index], Index, m_TransferDescriptors[Index]->BufferPointer[BufferIndex], BufferIndex, m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer, BytesAvailable);
break; @@ -1010,11 +1031,6 @@ if (BytesAvailable == 0) break; } - - // - // store transfer bytes of descriptor - // - m_TransferDescriptors[Index]->TotalBytesToTransfer = m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer;
// // Go ahead and link descriptors @@ -1024,19 +1040,26 @@ m_TransferDescriptors[Index - 1]->NextPointer = m_TransferDescriptors[Index]->PhysicalAddr; }
+ + // + // status descriptor + // + m_TransferDescriptors[Index]->Token.Bits.InterruptOnComplete = TRUE; + + // + // FIXME: need status descriptor? + // + // // setup direction // m_TransferDescriptors[Index]->Token.Bits.PIDCode = InternalGetPidDirection();
// - // FIXME: performance penality? - // - m_TransferDescriptors[Index]->Token.Bits.InterruptOnComplete = TRUE; - - // - // FIXME need dead queue transfer descriptor? - // + // set data toggle + // + m_TransferDescriptors[Index]->Token.Bits.DataToggle = DataToggle; + DataToggle = !DataToggle;
// // Check if all bytes have been consumed @@ -1064,7 +1087,10 @@ QueueHead->EndPointCharacteristics.MaximumPacketLength = m_EndpointDescriptor->wMaxPacketSize; }
- QueueHead->Token.Bits.DataToggle = TRUE; + // + // store number of transactions + // + QueueHead->EndPointCapabilities.NumberOfTransactionPerFrame = min(Index, 1);
// // link descriptor with queue head @@ -1168,7 +1194,7 @@ // // Get the Initial Data Toggle from the QEDT // - QueueHead->EndPointCharacteristics.QEDTDataToggleControl = FALSE; + QueueHead->EndPointCharacteristics.QEDTDataToggleControl = TRUE;
// // FIXME: check if High Speed Device @@ -1593,7 +1619,8 @@ // // queue head is active (currently processed) // - return FALSE; + ASSERT(QueueHead->Token.Bits.Halted == FALSE); + //return FALSE; }
// @@ -1609,7 +1636,13 @@ // // check for serious error // - //PC_ASSERT(m_TransferDescriptors[Index]->Token.Bits.Halted == 0); + DPRINT("Descriptor Addr %x\n", m_TransferDescriptors[Index]->PhysicalAddr); + DPRINT("Descriptor BabbleDetected %x\n", m_TransferDescriptors[Index]->Token.Bits.BabbleDetected); + DPRINT("Descriptor DataBufferError %x\n", m_TransferDescriptors[Index]->Token.Bits.DataBufferError); + DPRINT("Descriptor DataToggle %x\n", m_TransferDescriptors[Index]->Token.Bits.DataToggle); + DPRINT("Descriptor ErrorCounter %x\n", m_TransferDescriptors[Index]->Token.Bits.ErrorCounter); + DPRINT("Descriptor TransactionError %x\n", m_TransferDescriptors[Index]->Token.Bits.TransactionError); +
// // the transfer descriptor should be in the same state as the queue head @@ -1617,6 +1650,7 @@ //PC_ASSERT(m_TransferDescriptors[Index]->Token.Bits.Active == 0); } } + //ASSERT(FALSE);
return TRUE; }