[USBEHCI]
authorCameron Gutman <aicommander@gmail.com>
Sat, 25 Feb 2012 06:23:12 +0000 (06:23 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sat, 25 Feb 2012 06:23:12 +0000 (06:23 +0000)
- 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
reactos/drivers/usb/usbehci/hardware.h

index 1ee3113..13ea57b 100644 (file)
@@ -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);
index 18702f1..a093c96 100644 (file)
 #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
 //