mirror of
https://github.com/reactos/reactos.git
synced 2024-10-04 16:36:11 +00:00
[USBEHCI]
- Update async address everytime a new queue head is added as specified in EHCI spec section 3.2 - Add more checks - Vmware EHCI not yet working svn path=/branches/usb-bringup-trunk/; revision=55293
This commit is contained in:
parent
99c0842bcb
commit
2b13dd5132
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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
|
||||
//
|
||||
|
|
Loading…
Reference in a new issue