From 11c95e90a72d88d3fed99f58226c4f77fe089407 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 25 Feb 2012 06:23:12 +0000 Subject: [PATCH] [USBEHCI] - Create a macro for properly checking for low speed devices - Check again for a low speed device after the EHCI reset completes - Don't ignore status changes on ports that we have released (revert part of r55851) svn path=/trunk/; revision=55853 --- reactos/drivers/usb/usbehci/hardware.cpp | 21 +++++++++------------ reactos/drivers/usb/usbehci/hardware.h | 5 ++++- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/reactos/drivers/usb/usbehci/hardware.cpp b/reactos/drivers/usb/usbehci/hardware.cpp index 1ee311398ea..13ea57bcdcc 100644 --- a/reactos/drivers/usb/usbehci/hardware.cpp +++ b/reactos/drivers/usb/usbehci/hardware.cpp @@ -958,7 +958,7 @@ CUSBHardwareDevice::ResetPort( PortStatus = EHCI_READ_REGISTER_ULONG(EHCI_PORTSC + (4 * PortIndex)); - ASSERT(!(PortStatus & EHCI_PRT_SLOWSPEEDLINE)); + ASSERT(!EHCI_IS_LOW_SPEED(PortStatus)); ASSERT(PortStatus & EHCI_PRT_CONNECTED); // @@ -1112,7 +1112,7 @@ CUSBHardwareDevice::ClearPortStatus( KeDelayExecutionThread(KernelMode, FALSE, &Timeout); // - // check the enabled bit after reset + // check the port status after reset // Value = EHCI_READ_REGISTER_ULONG(EHCI_PORTSC + (4 * PortId)); if (!(Value & EHCI_PRT_CONNECTED)) @@ -1120,9 +1120,14 @@ CUSBHardwareDevice::ClearPortStatus( DPRINT1("No device is here after reset. Bad controller/device?\n"); return STATUS_UNSUCCESSFUL; } + else if (EHCI_IS_LOW_SPEED(Value)) + { + DPRINT1("Low speed device connected. Releasing ownership\n"); + EHCI_WRITE_REGISTER_ULONG(EHCI_PORTSC + (4 * PortId), Value | EHCI_PRT_RELEASEOWNERSHIP); + return STATUS_DEVICE_NOT_CONNECTED; + } else if (!(Value & EHCI_PRT_ENABLED)) { - // release ownership DPRINT1("Full speed device connected. Releasing ownership\n"); EHCI_WRITE_REGISTER_ULONG(EHCI_PORTSC + (4 * PortId), Value | EHCI_PRT_RELEASEOWNERSHIP); return STATUS_DEVICE_NOT_CONNECTED; @@ -1447,14 +1452,6 @@ EhciDefferedRoutine( { PortStatus = This->EHCI_READ_REGISTER_ULONG(EHCI_PORTSC + (4 * i)); - // Check if we actually own the port - if (PortStatus & EHCI_PRT_RELEASEOWNERSHIP) - { - //Discard anything on this port but ack any status changes - This->EHCI_WRITE_REGISTER_ULONG(EHCI_PORTSC + (4 * i), PortStatus); - continue; - } - // // Device connected or removed // @@ -1471,7 +1468,7 @@ EhciDefferedRoutine( DPRINT1("Misbeaving controller. Port should be disabled at this point\n"); } - if (PortStatus & EHCI_PRT_SLOWSPEEDLINE) + if (EHCI_IS_LOW_SPEED(PortStatus)) { DPRINT1("Low speed device connected. Releasing ownership\n"); This->EHCI_WRITE_REGISTER_ULONG(EHCI_PORTSC + (4 * i), PortStatus | EHCI_PRT_RELEASEOWNERSHIP); diff --git a/reactos/drivers/usb/usbehci/hardware.h b/reactos/drivers/usb/usbehci/hardware.h index 18702f189ab..a093c96dc12 100644 --- a/reactos/drivers/usb/usbehci/hardware.h +++ b/reactos/drivers/usb/usbehci/hardware.h @@ -76,11 +76,14 @@ #define EHCI_PRT_FORCERESUME 0x40 #define EHCI_PRT_SUSPEND 0x80 #define EHCI_PRT_RESET 0x100 -#define EHCI_PRT_SLOWSPEEDLINE 0x400 +#define EHCI_PRT_LINESTATUSA 0x400 +#define EHCI_PRT_LINESTATUSB 0x800 #define EHCI_PRT_POWER 0x1000 #define EHCI_PRT_RELEASEOWNERSHIP 0x2000 #define EHCI_PORTSC_DATAMASK 0xffffffd1 + +#define EHCI_IS_LOW_SPEED(x) (((x) & EHCI_PRT_LINESTATUSA) && !((x) & EHCI_PRT_LINESTATUSB)) // // Terminate Pointer used for QueueHeads and Element Transfer Descriptors to mark Pointers as the end //