diff --git a/drivers/usb/usbehci_new/interfaces.h b/drivers/usb/usbehci_new/interfaces.h index 295f11eb12a..242ffb16611 100644 --- a/drivers/usb/usbehci_new/interfaces.h +++ b/drivers/usb/usbehci_new/interfaces.h @@ -301,6 +301,15 @@ DECLARE_INTERFACE_(IUSBHardwareDevice, IUnknown) // Description: releases the device lock virtual void ReleaseDeviceLock(KIRQL OldLevel) = 0; + + // set command + virtual void SetCommandRegister(struct _EHCI_USBCMD_CONTENT *UsbCmd) = 0; + + // get command + virtual void GetCommandRegister(struct _EHCI_USBCMD_CONTENT *UsbCmd) = 0; + + + }; typedef IUSBHardwareDevice *PUSBHARDWAREDEVICE; diff --git a/drivers/usb/usbehci_new/usb_queue.cpp b/drivers/usb/usbehci_new/usb_queue.cpp index a0a8b729e15..6b83f7d7402 100644 --- a/drivers/usb/usbehci_new/usb_queue.cpp +++ b/drivers/usb/usbehci_new/usb_queue.cpp @@ -141,6 +141,11 @@ CUSBQueue::Initialize( // Status = InitializeSyncSchedule(Hardware, MemManager); + // + // store hardware object + // + m_Hardware = Hardware; + return Status; } @@ -358,6 +363,13 @@ CUSBQueue::AddUSBRequest( KeAcquireSpinLock(m_Lock, &OldLevel); LinkQueueHead(AsyncListQueueHead, QueueHead); KeReleaseSpinLock(m_Lock, OldLevel); + + EHCI_USBCMD_CONTENT UsbCmd; + m_Hardware->GetCommandRegister(&UsbCmd); + ASSERT(UsbCmd.AsyncEnable == TRUE); + + m_Hardware->SetAsyncListRegister(QueueHead->PhysicalAddr); + } @@ -419,6 +431,7 @@ CUSBQueue::LinkQueueHead( // // Link the LIST_ENTRYs // + ASSERT(IsListEmpty(&HeadQueueHead->LinkedQueueHeads)); InsertTailList(&HeadQueueHead->LinkedQueueHeads, &NewQueueHead->LinkedQueueHeads); // @@ -426,6 +439,7 @@ CUSBQueue::LinkQueueHead( // Entry = NewQueueHead->LinkedQueueHeads.Blink; LastQueueHead = CONTAINING_RECORD(Entry, QUEUE_HEAD, LinkedQueueHeads); + ASSERT(LastQueueHead == HeadQueueHead); LastQueueHead->HorizontalLinkPointer = (NewQueueHead->PhysicalAddr | QH_TYPE_QH); // @@ -435,6 +449,11 @@ CUSBQueue::LinkQueueHead( NextQueueHead = CONTAINING_RECORD(Entry, QUEUE_HEAD, LinkedQueueHeads); ASSERT(NextQueueHead == HeadQueueHead); NewQueueHead->HorizontalLinkPointer = (NextQueueHead->PhysicalAddr | QH_TYPE_QH); + + // + // head queue head must be halted + // + PC_ASSERT(HeadQueueHead->Token.Bits.Halted == TRUE); } // diff --git a/drivers/usb/usbehci_new/usb_request.cpp b/drivers/usb/usbehci_new/usb_request.cpp index 38618d257fc..aff29cbd55e 100644 --- a/drivers/usb/usbehci_new/usb_request.cpp +++ b/drivers/usb/usbehci_new/usb_request.cpp @@ -767,7 +767,14 @@ CUSBRequest::BuildControlTransferQueueHead( // 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; +*/ // // store result //