Author: cgutman Date: Sat Feb 25 02:20:15 2012 New Revision: 55848
URL: http://svn.reactos.org/svn/reactos?rev=55848&view=rev Log: [USBOHCI] - Implement per-port power control
Modified: trunk/reactos/drivers/usb/usbohci/hardware.cpp trunk/reactos/drivers/usb/usbohci/hardware.h
Modified: trunk/reactos/drivers/usb/usbohci/hardware.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbohci/hardwar... ============================================================================== --- trunk/reactos/drivers/usb/usbohci/hardware.cpp [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbohci/hardware.cpp [iso-8859-1] Sat Feb 25 02:20:15 2012 @@ -517,7 +517,7 @@ NTSTATUS CUSBHardwareDevice::StartController(void) { - ULONG Control, Descriptor, FrameInterval, Periodic; + ULONG Control, Descriptor, FrameInterval, Periodic, Port;
// // lets write physical address of dummy control endpoint descriptor @@ -530,7 +530,7 @@ WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_BULK_HEAD_ED_OFFSET), m_BulkEndpointDescriptor->PhysicalAddress.LowPart);
// - // read descriptor + // read descriptor A // Descriptor = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_DESCRIPTOR_A_OFFSET));
@@ -552,18 +552,34 @@ Descriptor &= ~OHCI_RH_NO_POWER_SWITCHING;
// - // control each port power independently (disabled until it's supported correctly) - // -#if 0 + // control each port power independently + // Descriptor |= OHCI_RH_POWER_SWITCHING_MODE; -#else - Descriptor &= ~OHCI_RH_POWER_SWITCHING_MODE; -#endif
// // write the configuration back // + DPRINT1("Descriptor A: %x\n", Descriptor); WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_DESCRIPTOR_A_OFFSET), Descriptor); + + // + // read descriptor B + // + Descriptor = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_DESCRIPTOR_B_OFFSET)); + + // + // set power power control for each port to use PPS + // + for (Port = 1; Port <= m_NumberOfPorts; Port++) + { + Descriptor |= (1 << (16 + Port)); + } + + // + // write the configuration back + // + DPRINT1("Descriptor B: %x\n", Descriptor); + WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_DESCRIPTOR_B_OFFSET), Descriptor);
// // get frame interval @@ -634,11 +650,6 @@ 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); - - // - // enable power on all ports - // - WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_STATUS_OFFSET), OHCI_RH_LOCAL_POWER_STATUS_CHANGE);
// // done
Modified: trunk/reactos/drivers/usb/usbohci/hardware.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbohci/hardwar... ============================================================================== --- trunk/reactos/drivers/usb/usbohci/hardware.h [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbohci/hardware.h [iso-8859-1] Sat Feb 25 02:20:15 2012 @@ -113,7 +113,7 @@ // Root Hub Descriptor B register (section 7.4.2) //
-#define OHCI_RH_DESCRIPTOR_B 0x4c +#define OHCI_RH_DESCRIPTOR_B_OFFSET 0x4c
// // Root Hub status register (section 7.4.3)