[PORTCLS] Don't unnecessarily wait for lower drivers to complete power IRPs. CORE...
authorThomas Faber <thomas.faber@reactos.org>
Sat, 1 Feb 2020 12:03:37 +0000 (13:03 +0100)
committerThomas Faber <thomas.faber@reactos.org>
Sat, 8 Feb 2020 12:07:34 +0000 (13:07 +0100)
Also use PoCallDriver to forward power IRPs.

drivers/wdm/audio/backpln/portcls/irp.cpp

index aab59ca..c1708c4 100644 (file)
@@ -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);
         }
     }
 }