mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 11:31:40 +00:00
[USBHUB_NEW] Support NULL HubExtension in USBH_PdoRemoveDevice.
Device removal can happen multiple times for PDOs.
This commit is contained in:
parent
477cf902e4
commit
a7634b8e1d
1 changed files with 13 additions and 7 deletions
|
@ -2193,9 +2193,8 @@ USBH_PdoRemoveDevice(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension,
|
||||||
Port = PortExtension->PortNumber;
|
Port = PortExtension->PortNumber;
|
||||||
ASSERT(Port > 0);
|
ASSERT(Port > 0);
|
||||||
|
|
||||||
ASSERT(HubExtension);
|
if (HubExtension &&
|
||||||
|
HubExtension->CurrentPowerState.DeviceState != PowerDeviceD0 &&
|
||||||
if (HubExtension->CurrentPowerState.DeviceState != PowerDeviceD0 &&
|
|
||||||
(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED) != 0)
|
(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED) != 0)
|
||||||
{
|
{
|
||||||
USBH_HubSetD0(HubExtension);
|
USBH_HubSetD0(HubExtension);
|
||||||
|
@ -2231,6 +2230,7 @@ USBH_PdoRemoveDevice(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension,
|
||||||
{
|
{
|
||||||
WakeIrp = NULL;
|
WakeIrp = NULL;
|
||||||
|
|
||||||
|
ASSERT(HubExtension);
|
||||||
if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
|
if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
|
||||||
{
|
{
|
||||||
KeSetEvent(&HubExtension->PendingRequestEvent,
|
KeSetEvent(&HubExtension->PendingRequestEvent,
|
||||||
|
@ -2250,6 +2250,7 @@ USBH_PdoRemoveDevice(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension,
|
||||||
|
|
||||||
if (WakeIrp)
|
if (WakeIrp)
|
||||||
{
|
{
|
||||||
|
ASSERT(HubExtension);
|
||||||
USBH_CompletePowerIrp(HubExtension, WakeIrp, STATUS_CANCELLED);
|
USBH_CompletePowerIrp(HubExtension, WakeIrp, STATUS_CANCELLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2270,6 +2271,7 @@ USBH_PdoRemoveDevice(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension,
|
||||||
|
|
||||||
if (DeviceHandle)
|
if (DeviceHandle)
|
||||||
{
|
{
|
||||||
|
ASSERT(HubExtension);
|
||||||
Status = USBD_RemoveDeviceEx(HubExtension, DeviceHandle, 0);
|
Status = USBD_RemoveDeviceEx(HubExtension, DeviceHandle, 0);
|
||||||
|
|
||||||
if (HubExtension->PortData &&
|
if (HubExtension->PortData &&
|
||||||
|
@ -2283,7 +2285,7 @@ USBH_PdoRemoveDevice(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension,
|
||||||
{
|
{
|
||||||
PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_DEVICE_STARTED;
|
PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_DEVICE_STARTED;
|
||||||
|
|
||||||
if (HubExtension->PortData)
|
if (HubExtension && HubExtension->PortData)
|
||||||
{
|
{
|
||||||
PortData = &HubExtension->PortData[Port - 1];
|
PortData = &HubExtension->PortData[Port - 1];
|
||||||
|
|
||||||
|
@ -2322,14 +2324,18 @@ USBH_PdoRemoveDevice(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension,
|
||||||
|
|
||||||
DPRINT1("USBH_PdoRemoveDevice: call IoWMIRegistrationControl UNIMPLEMENTED. FIXME\n");
|
DPRINT1("USBH_PdoRemoveDevice: call IoWMIRegistrationControl UNIMPLEMENTED. FIXME\n");
|
||||||
|
|
||||||
|
if (HubExtension)
|
||||||
USBHUB_FlushAllTransfers(HubExtension);
|
USBHUB_FlushAllTransfers(HubExtension);
|
||||||
|
|
||||||
IoDeleteDevice(PortDevice);
|
IoDeleteDevice(PortDevice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (HubExtension)
|
||||||
|
{
|
||||||
DPRINT("USBH_PdoRemoveDevice: call USBH_CheckIdleDeferred()\n");
|
DPRINT("USBH_PdoRemoveDevice: call USBH_CheckIdleDeferred()\n");
|
||||||
USBH_CheckIdleDeferred(HubExtension);
|
USBH_CheckIdleDeferred(HubExtension);
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue