Author: janderwald
Date: Mon May 30 06:55:32 2011
New Revision: 52004
URL:
http://svn.reactos.org/svn/reactos?rev=52004&view=rev
Log:
[USBOHCI]
- More traces to fix isochronous problem
- Fix broken assert found by mjmartin
Modified:
branches/usb-bringup/drivers/usb/usbohci/hardware.cpp
branches/usb-bringup/drivers/usb/usbohci/hardware.h
branches/usb-bringup/drivers/usb/usbohci/usb_queue.cpp
branches/usb-bringup/drivers/usb/usbohci/usb_request.cpp
Modified: branches/usb-bringup/drivers/usb/usbohci/hardware.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbohci…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbohci/hardware.cpp [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbohci/hardware.cpp [iso-8859-1] Mon May 30 06:55:32
2011
@@ -545,12 +545,15 @@
//
ASSERT((Control & OHCI_HC_FUNCTIONAL_STATE_MASK) ==
OHCI_HC_FUNCTIONAL_STATE_OPERATIONAL);
ASSERT((Control & OHCI_ENABLE_LIST) == OHCI_ENABLE_LIST);
+ DPRINT1("Control %x\n", Control);
//
// get frame interval
//
- FrameInterval = (READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base +
OHCI_FRAME_INTERVAL_OFFSET)) & OHCI_FRAME_INTERVAL_TOGGLE) ^
OHCI_FRAME_INTERVAL_TOGGLE;
+ FrameInterval = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base +
OHCI_FRAME_INTERVAL_OFFSET));
+ DPRINT1("FrameInterval %x IntervalValue %x\n", FrameInterval,
m_IntervalValue);
FrameInterval |= OHCI_FSMPS(m_IntervalValue) | m_IntervalValue;
+ DPRINT1("FrameInterval %x\n", FrameInterval);
//
// write frame interval
@@ -562,7 +565,7 @@
//
Periodic = OHCI_PERIODIC(m_IntervalValue);
WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_PERIODIC_START_OFFSET),
Periodic);
-
+ DPRINT1("Periodic Start %x\n", Periodic);
//
// read descriptor
@@ -918,6 +921,8 @@
// store interval value for later
//
m_IntervalValue = OHCI_GET_INTERVAL_VALUE(FrameInterval);
+
+ DPRINT1("FrameInterval %x Interval %x\n", FrameInterval, m_IntervalValue);
//
// now reset controller
@@ -1206,10 +1211,30 @@
CUSBHardwareDevice::GetCurrentFrameNumber(
PULONG FrameNumber)
{
+ ULONG Control;
+ ULONG Number;
+
+
+ Number = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base +
OHCI_FRAME_INTERVAL_NUMBER_OFFSET));
+ DPRINT1("FrameNumberInterval %x Frame %x\n", Number,
m_HCCA->CurrentFrameNumber);
+
+ //
+ // remove reserved bits
+ //
+ Number &= 0xFFFF;
+
//
// store frame number
//
- *FrameNumber = m_HCCA->CurrentFrameNumber;
+ *FrameNumber = Number;
+
+ //
+ // is the controller started
+ //
+ Control = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET));
+ ASSERT((Control & OHCI_ENABLE_LIST) == OHCI_ENABLE_LIST);
+
+
}
VOID
@@ -1339,7 +1364,7 @@
//
// defer processing
//
- DPRINT("Status %x Acknowledge %x\n", Status, Acknowledge);
+ DPRINT1("Status %x Acknowledge %x FrameNumber %x\n", Status, Acknowledge,
This->m_HCCA->CurrentFrameNumber);
KeInsertQueueDpc(&This->m_IntDpcObject, (PVOID)Status, (PVOID)(DoneHead &
~1));
//
Modified: branches/usb-bringup/drivers/usb/usbohci/hardware.h
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbohci…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbohci/hardware.h [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbohci/hardware.h [iso-8859-1] Mon May 30 06:55:32
2011
@@ -99,6 +99,11 @@
#define OHCI_FRAME_INTERVAL_TOGGLE 0x80000000
//
+// frame interval
+//
+#define OHCI_FRAME_INTERVAL_NUMBER_OFFSET 0x3C
+
+//
// periodic start register
//
#define OHCI_PERIODIC_START_OFFSET 0x40
Modified: branches/usb-bringup/drivers/usb/usbohci/usb_queue.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbohci…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbohci/usb_queue.cpp [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbohci/usb_queue.cpp [iso-8859-1] Mon May 30
06:55:32 2011
@@ -278,6 +278,16 @@
//
CurrentDescriptor = CurrentDescriptor->NextLogicalDescriptor;
}
+
+ //
+ // get current frame number
+ //
+ m_Hardware->GetCurrentFrameNumber(&FrameNumber);
+
+ DPRINT1("Hardware 1ms %p Iso %p\n",m_InterruptEndpoints[0],
m_IsoHeadEndpointDescriptor);
+ ASSERT(m_InterruptEndpoints[0]->NextPhysicalEndpoint ==
m_IsoHeadEndpointDescriptor->PhysicalAddress.LowPart);
+
+ PrintEndpointList(m_IsoHeadEndpointDescriptor);
}
//
@@ -699,7 +709,7 @@
//
// sanity check
//
- ASSERT(InterruptInterval < OHCI_BIGGEST_INTERVAL);
+ ASSERT(InterruptInterval <= OHCI_BIGGEST_INTERVAL);
//
// find interrupt index
Modified: branches/usb-bringup/drivers/usb/usbohci/usb_request.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbohci…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbohci/usb_request.cpp [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbohci/usb_request.cpp [iso-8859-1] Mon May 30
06:55:32 2011
@@ -628,7 +628,7 @@
//
// initialize descriptor, hardware part
//
- Descriptor->Flags = OHCI_ITD_SET_FRAME_COUNT(FrameCount) |
OHCI_ITD_SET_DELAY_INTERRUPT(OHCI_TD_INTERRUPT_NONE) |
OHCI_TD_SET_CONDITION_CODE(OHCI_TD_CONDITION_NOT_ACCESSED);
+ Descriptor->Flags = OHCI_ITD_SET_FRAME_COUNT(FrameCount) |
OHCI_ITD_SET_DELAY_INTERRUPT(OHCI_TD_INTERRUPT_NONE);// |
OHCI_TD_SET_CONDITION_CODE(OHCI_TD_CONDITION_NOT_ACCESSED);
Descriptor->BufferPhysical = 0;
Descriptor->NextPhysicalDescriptor = 0;
Descriptor->LastPhysicalByteAddress = 0;
@@ -661,6 +661,7 @@
PVOID Buffer;
PIO_STACK_LOCATION IoStack;
PURB Urb;
+ PHYSICAL_ADDRESS Address;
//
// get current irp stack location
@@ -704,6 +705,10 @@
//
ASSERT(ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(m_TransferBufferMDL),
MmGetMdlByteCount(m_TransferBufferMDL)) <= 2);
+ Status = m_DmaManager->Allocate(m_TransferBufferLength, &Buffer,
&Address);
+ ASSERT(Status == STATUS_SUCCESS);
+
+
while(Index < Urb->UrbIsochronousTransfer.NumberOfPackets)
{
//
@@ -732,7 +737,7 @@
//
// get page offset
//
- PageOffset = MmGetMdlByteOffset(m_TransferBufferMDL);
+ PageOffset = BYTE_OFFSET(Page);
//
// initialize descriptor
@@ -935,6 +940,8 @@
Descriptor->Flags |= OHCI_ENDPOINT_SET_DEVICE_ADDRESS(GetDeviceAddress());
Descriptor->Flags |= OHCI_ENDPOINT_SET_ENDPOINT_NUMBER(GetEndpointAddress());
Descriptor->Flags |= OHCI_ENDPOINT_SET_MAX_PACKET_SIZE(GetMaxPacketSize());
+
+ DPRINT1("Flags %x DeviceAddress %x EndpointAddress %x PacketSize %x\n",
Descriptor->Flags, GetDeviceAddress(), GetEndpointAddress(), GetMaxPacketSize());
//
// is there an endpoint descriptor