Revert the sync.
[reactos.git] / drivers / bus / pci / fdo.c
index b6753e1..35fd125 100644 (file)
 
 /*** PRIVATE *****************************************************************/
 
-static IO_COMPLETION_ROUTINE ForwardIrpAndWaitCompletion;
-
-static NTSTATUS NTAPI
-ForwardIrpAndWaitCompletion(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp,
-       IN PVOID Context)
-{
-       UNREFERENCED_PARAMETER(DeviceObject);
-       if (Irp->PendingReturned)
-               KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
-       return STATUS_MORE_PROCESSING_REQUIRED;
-}
-
-NTSTATUS NTAPI
-ForwardIrpAndWait(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp)
-{
-       KEVENT Event;
-       NTSTATUS Status;
-       PDEVICE_OBJECT LowerDevice = ((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Ldo;
-       ASSERT(LowerDevice);
-
-       KeInitializeEvent(&Event, NotificationEvent, FALSE);
-       IoCopyCurrentIrpStackLocationToNext(Irp);
-
-       IoSetCompletionRoutine(Irp, ForwardIrpAndWaitCompletion, &Event, TRUE, TRUE, TRUE);
-
-       Status = IoCallDriver(LowerDevice, Irp);
-       if (Status == STATUS_PENDING)
-       {
-               Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
-               if (NT_SUCCESS(Status))
-                       Status = Irp->IoStatus.Status;
-       }
-
-       return Status;
-}
-
 static NTSTATUS
 FdoLocateChildDevice(
   PPCI_DEVICE *Device,
@@ -279,6 +239,8 @@ FdoQueryBusRelations(
         break;
       }
 
+      Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
+
       Device->Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
 
       //Device->Pdo->Flags |= DO_POWER_PAGABLE;
@@ -506,7 +468,7 @@ FdoPnpControl(
 {
   PFDO_DEVICE_EXTENSION DeviceExtension;
   PIO_STACK_LOCATION IrpSp;
-  NTSTATUS Status = Irp->IoStatus.Status;
+  NTSTATUS Status;
 
   DPRINT("Called\n");
 
@@ -532,13 +494,8 @@ FdoPnpControl(
     break;
 #endif
   case IRP_MN_QUERY_DEVICE_RELATIONS:
-    if (IrpSp->Parameters.QueryDeviceRelations.Type != BusRelations)
-        break;
-
     Status = FdoQueryBusRelations(DeviceObject, Irp, IrpSp);
-    Irp->IoStatus.Status = Status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-    return Status;
+    break;
 #if 0
   case IRP_MN_QUERY_PNP_DEVICE_STATE:
     Status = STATUS_NOT_IMPLEMENTED;
@@ -558,37 +515,38 @@ FdoPnpControl(
 #endif
   case IRP_MN_START_DEVICE:
     DPRINT("IRP_MN_START_DEVICE received\n");
-    Status = ForwardIrpAndWait(DeviceObject, Irp);
-    if (NT_SUCCESS(Status))
-       Status = FdoStartDevice(DeviceObject, Irp);
-
-    Irp->IoStatus.Status = Status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-    return Status;
+    Status = FdoStartDevice(DeviceObject, Irp);
+    break;
   case IRP_MN_STOP_DEVICE:
     /* Currently not supported */
     Status = STATUS_UNSUCCESSFUL;
-    Irp->IoStatus.Status = Status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-    return Status;
+    break;
 #if 0
   case IRP_MN_SURPRISE_REMOVAL:
     Status = STATUS_NOT_IMPLEMENTED;
     break;
 #endif
-  case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
-    break;
-  case IRP_MN_REMOVE_DEVICE:
-    DPRINT1("IRP_MN_REMOVE_DEVICE is UNIMPLEMENTED!\n");
-    break;
   default:
     DPRINT1("Unknown IOCTL 0x%lx\n", IrpSp->MinorFunction);
+    /* fall through */
+
+  case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
+    /*
+     * Do NOT complete the IRP as it will be processed by the lower
+     * device object, which will complete the IRP
+     */
+    IoSkipCurrentIrpStackLocation(Irp);
+    Status = IoCallDriver(DeviceExtension->Ldo, Irp);
+    return Status;
     break;
   }
 
-  Irp->IoStatus.Status = Status;
-  IoSkipCurrentIrpStackLocation(Irp);
-  Status = IoCallDriver(DeviceExtension->Ldo, Irp);
+
+  if (Status != STATUS_PENDING) {
+    if (Status != STATUS_NOT_IMPLEMENTED)
+      Irp->IoStatus.Status = Status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+  }
 
   DPRINT("Leaving. Status 0x%X\n", Status);