[ros-diffs] [cgutman] 55181: [USBOHCI] - Fix StartController() to perform initialization according to OHCI spec - Fixes the infamous OHCI initialization hang on real hardware

cgutman at svn.reactos.org cgutman at svn.reactos.org
Wed Jan 25 19:46:46 UTC 2012


Author: cgutman
Date: Wed Jan 25 19:46:44 2012
New Revision: 55181

URL: http://svn.reactos.org/svn/reactos?rev=55181&view=rev
Log:
[USBOHCI]
- Fix StartController() to perform initialization according to OHCI spec
- Fixes the infamous OHCI initialization hang on real hardware

Modified:
    branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.cpp
    branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.h

Modified: branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.cpp
URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.cpp?rev=55181&r1=55180&r2=55181&view=diff
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.cpp [iso-8859-1] (original)
+++ branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.cpp [iso-8859-1] Wed Jan 25 19:46:44 2012
@@ -496,11 +496,6 @@
     ULONG Control, NumberOfPorts, Index, Descriptor, FrameInterval, Periodic;
 
     //
-    // first write address of HCCA
-    //
-    WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_HCCA_OFFSET), m_HCCAPhysicalAddress.LowPart);
-
-    //
     // lets write physical address of dummy control endpoint descriptor
     //
     WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_HEAD_ED_OFFSET), m_ControlEndpointDescriptor->PhysicalAddress.LowPart);
@@ -509,43 +504,6 @@
     // lets write physical address of dummy bulk endpoint descriptor
     //
     WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_BULK_HEAD_ED_OFFSET), m_BulkEndpointDescriptor->PhysicalAddress.LowPart);
-
-    //
-    // read control register
-    //
-    Control = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET));
-
-    //
-    // remove flags
-    // 
-    Control &= ~(OHCI_CONTROL_BULK_SERVICE_RATIO_MASK | OHCI_ENABLE_LIST | OHCI_HC_FUNCTIONAL_STATE_MASK | OHCI_INTERRUPT_ROUTING);
-
-    //
-    // set command status flags
-    //
-    Control |= OHCI_ENABLE_LIST | OHCI_CONTROL_BULK_RATIO_1_4 | OHCI_HC_FUNCTIONAL_STATE_OPERATIONAL;
-
-    //
-    // now start the controller
-    //
-    WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET), Control);
-
-    //
-    // wait a bit
-    //
-    KeStallExecutionProcessor(100);
-
-    //
-    // is the controller started
-    //
-    Control = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET));
-
-    //
-    // assert that the controller has been started
-    //
-    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
@@ -562,6 +520,21 @@
     WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_FRAME_INTERVAL_OFFSET), FrameInterval);
 
     //
+    // write address of HCCA
+    //
+    WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_HCCA_OFFSET), m_HCCAPhysicalAddress.LowPart);
+
+    //
+    // now enable the interrupts
+    //
+    WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_ENABLE_OFFSET), OHCI_NORMAL_INTERRUPTS | OHCI_MASTER_INTERRUPT_ENABLE);
+
+    //
+    // enable all queues
+    //
+    WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET), OHCI_ENABLE_LIST);
+
+    //
     // 90 % periodic
     //
     Periodic = OHCI_PERIODIC(m_IntervalValue);
@@ -569,6 +542,28 @@
     DPRINT1("Periodic Start %x\n", Periodic);
 
     //
+    // start the controller
+    //
+    WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET), OHCI_ENABLE_LIST | OHCI_CONTROL_BULK_RATIO_1_4 | OHCI_HC_FUNCTIONAL_STATE_OPERATIONAL);
+
+    //
+    // wait a bit
+    //
+    KeStallExecutionProcessor(100);
+
+    //
+    // is the controller started
+    //
+    Control = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET));
+
+    //
+    // assert that the controller has been started
+    //
+    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);
+
+    //
     // read descriptor
     //
     Descriptor = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_DESCRIPTOR_A_OFFSET));
@@ -592,8 +587,6 @@
     // write descriptor
     //
     WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_DESCRIPTOR_A_OFFSET), Descriptor);
-
-
 
     //
     // retrieve number of ports
@@ -637,11 +630,6 @@
     //
     DPRINT1("NumberOfPorts %lu\n", m_NumberOfPorts);
 
-
-    //
-    // now enable the interrupts
-    //
-    WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_ENABLE_OFFSET), OHCI_NORMAL_INTERRUPTS | OHCI_MASTER_INTERRUPT_ENABLE);
 
     //
     // done

Modified: branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.h
URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.h?rev=55181&r1=55180&r2=55181&view=diff
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.h [iso-8859-1] (original)
+++ branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.h [iso-8859-1] Wed Jan 25 19:46:44 2012
@@ -171,7 +171,8 @@
                                     | OHCI_WRITEBACK_DONE_HEAD \
                                     | OHCI_RESUME_DETECTED \
                                     | OHCI_UNRECOVERABLE_ERROR \
-                                    | OHCI_ROOT_HUB_STATUS_CHANGE)
+                                    | OHCI_ROOT_HUB_STATUS_CHANGE \
+									| OHCI_OWNERSHIP_CHANGE)
 
 //
 // FSMPS




More information about the Ros-diffs mailing list