https://git.reactos.org/?p=reactos.git;a=commitdiff;h=606c912aa45b84e346de1…
commit 606c912aa45b84e346de14181e7fdd433d9db667
Author: Thomas Faber <thomas.faber(a)reactos.org>
AuthorDate: Sat Feb 1 13:03:37 2020 +0100
Commit: Thomas Faber <thomas.faber(a)reactos.org>
CommitDate: Sat Feb 8 13:07:34 2020 +0100
[PORTCLS] Don't unnecessarily wait for lower drivers to complete power IRPs.
CORE-16611
Also use PoCallDriver to forward power IRPs.
---
drivers/wdm/audio/backpln/portcls/irp.cpp | 51 +++++++++----------------------
1 file changed, 14 insertions(+), 37 deletions(-)
diff --git a/drivers/wdm/audio/backpln/portcls/irp.cpp
b/drivers/wdm/audio/backpln/portcls/irp.cpp
index aab59ca31fc..c1708c416c6 100644
--- a/drivers/wdm/audio/backpln/portcls/irp.cpp
+++ b/drivers/wdm/audio/backpln/portcls/irp.cpp
@@ -221,26 +221,17 @@ PortClsPower(
// get currrent stack location
IoStack = IoGetCurrentIrpStackLocation(Irp);
+ // get device extension
+ DeviceExtension = (PPCLASS_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
if (IoStack->MinorFunction != IRP_MN_SET_POWER &&
IoStack->MinorFunction != IRP_MN_QUERY_POWER)
{
- // just forward the request
- Status = PcForwardIrpSynchronous(DeviceObject, Irp);
-
- // start next power irp
+ // forward unknown requests down the stack and forget
PoStartNextPowerIrp(Irp);
-
- // complete request
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- // done
- return Status;
+ IoSkipCurrentIrpStackLocation(Irp);
+ return PoCallDriver(DeviceExtension->PrevDeviceObject, Irp);
}
-
- // get device extension
- DeviceExtension = (PPCLASS_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
-
// get current request type
if (IoStack->Parameters.Power.Type == DevicePowerState)
{
@@ -250,8 +241,10 @@ PortClsPower(
// nothing has changed
if (IoStack->MinorFunction == IRP_MN_QUERY_POWER)
{
- // only forward query requests
- Status = PcForwardIrpSynchronous(DeviceObject, Irp);
+ // only forward query requests; we can forget about them
+ PoStartNextPowerIrp(Irp);
+ IoSkipCurrentIrpStackLocation(Irp);
+ return PoCallDriver(DeviceExtension->PrevDeviceObject, Irp);
}
// start next power irp
@@ -279,17 +272,9 @@ PortClsPower(
}
// only forward query requests
- PcForwardIrpSynchronous(DeviceObject, Irp);
-
- // start next power irp
PoStartNextPowerIrp(Irp);
-
- // complete request
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- // done
- return Status;
+ IoSkipCurrentIrpStackLocation(Irp);
+ return PoCallDriver(DeviceExtension->PrevDeviceObject, Irp);
}
else
{
@@ -371,17 +356,9 @@ PortClsPower(
DeviceExtension->SystemPowerState =
IoStack->Parameters.Power.State.SystemState;
// only forward query requests
- Status = PcForwardIrpSynchronous(DeviceObject, Irp);
-
- // start next power irp
PoStartNextPowerIrp(Irp);
-
- // complete request
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- // done
- return Status;
+ IoSkipCurrentIrpStackLocation(Irp);
+ return PoCallDriver(DeviceExtension->PrevDeviceObject, Irp);
}
}
}