mirror of
https://github.com/reactos/reactos.git
synced 2025-08-07 10:03:07 +00:00
[USBEHCI_NEW]
- When clearing feature port reset, remove the flag from Change and if the port is hardware enabled set the enable flag in Status. - When checking port status, if Change has any flags set an SCE request most be completed. Verified while writing usbhub driver in xp. - Probably fixes a case where an endless loop of completing SCE requests. svn path=/branches/usb-bringup/; revision=51642
This commit is contained in:
parent
3063e3bf5e
commit
741b7ea0aa
2 changed files with 30 additions and 24 deletions
|
@ -799,12 +799,18 @@ CUSBHardwareDevice::ClearPortStatus(
|
||||||
Value &= ~EHCI_PRT_RESET;
|
Value &= ~EHCI_PRT_RESET;
|
||||||
EHCI_WRITE_REGISTER_ULONG(EHCI_PORTSC + (4 * PortId), Value);
|
EHCI_WRITE_REGISTER_ULONG(EHCI_PORTSC + (4 * PortId), Value);
|
||||||
KeStallExecutionProcessor(100);
|
KeStallExecutionProcessor(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
Value = EHCI_READ_REGISTER_ULONG(EHCI_PORTSC + (4 * PortId));
|
||||||
//
|
//
|
||||||
// update port status
|
// update port status
|
||||||
//
|
//
|
||||||
m_PortStatus[PortId].PortChange &= ~USB_PORT_STATUS_RESET;
|
m_PortStatus[PortId].PortChange &= ~USB_PORT_STATUS_RESET;
|
||||||
|
if (Value & EHCI_PRT_ENABLED)
|
||||||
m_PortStatus[PortId].PortStatus |= USB_PORT_STATUS_ENABLE;
|
m_PortStatus[PortId].PortStatus |= USB_PORT_STATUS_ENABLE;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DPRINT1("Port is not enabled.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -305,31 +305,30 @@ CHubController::QueryStatusChageEndpoint(
|
||||||
DPRINT1("SCE Request %p TransferBufferLength %lu Flags %x MDL %p\n", Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength, Urb->UrbBulkOrInterruptTransfer.TransferFlags, Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL);
|
DPRINT1("SCE Request %p TransferBufferLength %lu Flags %x MDL %p\n", Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength, Urb->UrbBulkOrInterruptTransfer.TransferFlags, Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL);
|
||||||
|
|
||||||
TransferBuffer = (PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer;
|
TransferBuffer = (PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Loop the ports
|
||||||
|
//
|
||||||
for (PortId = 0; PortId < PortCount; PortId++)
|
for (PortId = 0; PortId < PortCount; PortId++)
|
||||||
{
|
{
|
||||||
m_Hardware->GetPortStatus(PortId, &PortStatus, &PortChange);
|
m_Hardware->GetPortStatus(PortId, &PortStatus, &PortChange);
|
||||||
|
|
||||||
DPRINT1("Port %d: Status %x, Change %x\n", PortId, PortStatus, PortChange);
|
DPRINT1("Port %d: Status %x, Change %x\n", PortId, PortStatus, PortChange);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Loop the ports
|
// If theres a flag in PortChange return TRUE so the SCE Irp will be completed
|
||||||
//
|
//
|
||||||
if ((PortStatus & USB_PORT_STATUS_CONNECT) && (PortChange & USB_PORT_STATUS_CONNECT))
|
if (PortChange != 0)
|
||||||
{
|
{
|
||||||
DPRINT1("Device is connected on port %d\n", PortId);
|
DPRINT1("Change state on port %d\n", PortId);
|
||||||
// Set the value for the port number
|
// Set the value for the port number
|
||||||
*TransferBuffer = 1 << ((PortId + 1) & 7);
|
*TransferBuffer = 1 << ((PortId + 1) & 7);
|
||||||
Changed = TRUE;
|
Changed = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
return Changed;
|
||||||
// If there were changes then return TRUE
|
|
||||||
//
|
|
||||||
if (Changed != 0)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------
|
||||||
|
@ -777,6 +776,7 @@ CHubController::HandleBulkOrInterruptTransfer(
|
||||||
ASSERT(m_PendingSCEIrp == NULL);
|
ASSERT(m_PendingSCEIrp == NULL);
|
||||||
if (QueryStatusChageEndpoint(Irp))
|
if (QueryStatusChageEndpoint(Irp))
|
||||||
{
|
{
|
||||||
|
StatusChangeEndpointCallBack(this);
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2705,11 +2705,6 @@ USBHI_SetDeviceHandleData(
|
||||||
//
|
//
|
||||||
DPRINT1("USBHI_SetDeviceHandleData %p\n", UsbDevicePdo);
|
DPRINT1("USBHI_SetDeviceHandleData %p\n", UsbDevicePdo);
|
||||||
|
|
||||||
//
|
|
||||||
// fixup device stack voodoo part #1
|
|
||||||
//
|
|
||||||
UsbDevicePdo->StackSize++;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// sanity check
|
// sanity check
|
||||||
//
|
//
|
||||||
|
@ -3152,6 +3147,11 @@ CHubController::CreatePDO(
|
||||||
|
|
||||||
DPRINT1("CHubController::CreatePDO: DeviceName %wZ\n", &DeviceName);
|
DPRINT1("CHubController::CreatePDO: DeviceName %wZ\n", &DeviceName);
|
||||||
|
|
||||||
|
//
|
||||||
|
// fixup device stack voodoo part #1
|
||||||
|
//
|
||||||
|
(*OutDeviceObject)->StackSize++;
|
||||||
|
|
||||||
/* done */
|
/* done */
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue