- Properly dismiss the enable status changed interrupt to avoid an interrupt storm after a device is disconnected
svn path=/branches/usb-bringup-trunk/; revision=55189
if (Value & OHCI_RH_PORTSTATUS_PES)
*PortStatus |= USB_PORT_STATUS_ENABLE;
if (Value & OHCI_RH_PORTSTATUS_PES)
*PortStatus |= USB_PORT_STATUS_ENABLE;
+ // port disconnect or hardware error
if (Value & OHCI_RH_PORTSTATUS_PESC)
if (Value & OHCI_RH_PORTSTATUS_PESC)
- *PortChange |= USB_PORT_STATUS_ENABLE;
+ *PortChange |= USB_PORT_STATUS_CONNECT;
// port suspend
if (Value & OHCI_RH_PORTSTATUS_PSS)
// port suspend
if (Value & OHCI_RH_PORTSTATUS_PSS)
- ASSERT((Value & OHCI_RH_PORTSTATUS_PRS) == 0);
ASSERT((Value & OHCI_RH_PORTSTATUS_PRSC));
//
ASSERT((Value & OHCI_RH_PORTSTATUS_PRSC));
//
//
WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_PORT_STATUS(PortId)), OHCI_RH_PORTSTATUS_PRSC);
//
WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_PORT_STATUS(PortId)), OHCI_RH_PORTSTATUS_PRSC);
//
// sanity check
//
ASSERT((Value & OHCI_RH_PORTSTATUS_PES));
//
// sanity check
//
ASSERT((Value & OHCI_RH_PORTSTATUS_PES));
-
- //
- // re-enable root hub change
- //
- Value = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_ENABLE_OFFSET));
- WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_ENABLE_OFFSET), Value | OHCI_ROOT_HUB_STATUS_CHANGE);
-
- if (Status == C_PORT_CONNECTION)
+ if (Status == C_PORT_CONNECTION || Status == C_PORT_ENABLE)
- WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_PORT_STATUS(PortId)), OHCI_RH_PORTSTATUS_CSC);
+ WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_PORT_STATUS(PortId)), OHCI_RH_PORTSTATUS_CSC | OHCI_RH_PORTSTATUS_PESC);
+ //
+ // re-enable root hub change
+ //
+ WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_ENABLE_OFFSET), OHCI_ROOT_HUB_STATUS_CHANGE);
+
if (Status & OHCI_ROOT_HUB_STATUS_CHANGE)
{
if (Status & OHCI_ROOT_HUB_STATUS_CHANGE)
{
- //
- // new device has arrived
- //
-
//
// disable interrupt as it will fire untill the port has been reset
//
//
// disable interrupt as it will fire untill the port has been reset
//