mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 07:46:29 +00:00
[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
This commit is contained in:
parent
266e31d825
commit
11c95e90a7
2 changed files with 13 additions and 13 deletions
|
@ -958,7 +958,7 @@ CUSBHardwareDevice::ResetPort(
|
||||||
|
|
||||||
PortStatus = EHCI_READ_REGISTER_ULONG(EHCI_PORTSC + (4 * PortIndex));
|
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);
|
ASSERT(PortStatus & EHCI_PRT_CONNECTED);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -1112,7 +1112,7 @@ CUSBHardwareDevice::ClearPortStatus(
|
||||||
KeDelayExecutionThread(KernelMode, FALSE, &Timeout);
|
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));
|
Value = EHCI_READ_REGISTER_ULONG(EHCI_PORTSC + (4 * PortId));
|
||||||
if (!(Value & EHCI_PRT_CONNECTED))
|
if (!(Value & EHCI_PRT_CONNECTED))
|
||||||
|
@ -1120,9 +1120,14 @@ CUSBHardwareDevice::ClearPortStatus(
|
||||||
DPRINT1("No device is here after reset. Bad controller/device?\n");
|
DPRINT1("No device is here after reset. Bad controller/device?\n");
|
||||||
return STATUS_UNSUCCESSFUL;
|
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))
|
else if (!(Value & EHCI_PRT_ENABLED))
|
||||||
{
|
{
|
||||||
// release ownership
|
|
||||||
DPRINT1("Full speed device connected. Releasing ownership\n");
|
DPRINT1("Full speed device connected. Releasing ownership\n");
|
||||||
EHCI_WRITE_REGISTER_ULONG(EHCI_PORTSC + (4 * PortId), Value | EHCI_PRT_RELEASEOWNERSHIP);
|
EHCI_WRITE_REGISTER_ULONG(EHCI_PORTSC + (4 * PortId), Value | EHCI_PRT_RELEASEOWNERSHIP);
|
||||||
return STATUS_DEVICE_NOT_CONNECTED;
|
return STATUS_DEVICE_NOT_CONNECTED;
|
||||||
|
@ -1447,14 +1452,6 @@ EhciDefferedRoutine(
|
||||||
{
|
{
|
||||||
PortStatus = This->EHCI_READ_REGISTER_ULONG(EHCI_PORTSC + (4 * i));
|
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
|
// Device connected or removed
|
||||||
//
|
//
|
||||||
|
@ -1471,7 +1468,7 @@ EhciDefferedRoutine(
|
||||||
DPRINT1("Misbeaving controller. Port should be disabled at this point\n");
|
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");
|
DPRINT1("Low speed device connected. Releasing ownership\n");
|
||||||
This->EHCI_WRITE_REGISTER_ULONG(EHCI_PORTSC + (4 * i), PortStatus | EHCI_PRT_RELEASEOWNERSHIP);
|
This->EHCI_WRITE_REGISTER_ULONG(EHCI_PORTSC + (4 * i), PortStatus | EHCI_PRT_RELEASEOWNERSHIP);
|
||||||
|
|
|
@ -76,11 +76,14 @@
|
||||||
#define EHCI_PRT_FORCERESUME 0x40
|
#define EHCI_PRT_FORCERESUME 0x40
|
||||||
#define EHCI_PRT_SUSPEND 0x80
|
#define EHCI_PRT_SUSPEND 0x80
|
||||||
#define EHCI_PRT_RESET 0x100
|
#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_POWER 0x1000
|
||||||
#define EHCI_PRT_RELEASEOWNERSHIP 0x2000
|
#define EHCI_PRT_RELEASEOWNERSHIP 0x2000
|
||||||
|
|
||||||
#define EHCI_PORTSC_DATAMASK 0xffffffd1
|
#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
|
// Terminate Pointer used for QueueHeads and Element Transfer Descriptors to mark Pointers as the end
|
||||||
//
|
//
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue