[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:
Johannes Anderwald 2012-01-29 17:30:31 +00:00
parent 99c0842bcb
commit 2b13dd5132
3 changed files with 35 additions and 0 deletions

View file

@ -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;

View file

@ -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);
}
//

View file

@ -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
//