X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fdrivers%2Fbus%2Fpcix%2Ffdo.c;h=785dfca3c5290ebcdbe33d8810147850e6fbe9d6;hp=256df1a3f4d68ee681faa4f99fbf42aac526dde6;hb=022f4b2ce569305456ad2588a78ba88fe7694e1b;hpb=24480b9b7ddbaabc1384904c7baa605cf533dcf5 diff --git a/reactos/drivers/bus/pcix/fdo.c b/reactos/drivers/bus/pcix/fdo.c index 256df1a3f4d..785dfca3c52 100644 --- a/reactos/drivers/bus/pcix/fdo.c +++ b/reactos/drivers/bus/pcix/fdo.c @@ -89,7 +89,6 @@ PciFdoIrpStartDevice(IN PIRP Irp, /* Check for any boot-provided resources */ Resources = IoStackLocation->Parameters.StartDevice.AllocatedResources; - DPRINT1("Resources: %p\n", Resources); if ((Resources) && !(PCI_IS_ROOT_FDO(DeviceExtension))) { /* These resources would only be for non-root FDOs, unhandled for now */ @@ -128,7 +127,6 @@ PciFdoIrpQueryRemoveDevice(IN PIRP Irp, IN PPCI_FDO_EXTENSION DeviceExtension) { UNIMPLEMENTED; - while (TRUE); return STATUS_NOT_SUPPORTED; } @@ -227,7 +225,7 @@ PciFdoIrpQueryInterface(IN PIRP Irp, /* Deleted extensions don't respond to IRPs */ if (DeviceExtension->DeviceState == PciDeleted) { - /* Hand it bacO try to deal with it */ + /* Hand it back to try to deal with it */ return PciPassIrpFromFdoToPdo(DeviceExtension, Irp); } @@ -295,9 +293,23 @@ PciFdoIrpQueryCapabilities(IN PIRP Irp, IN PIO_STACK_LOCATION IoStackLocation, IN PPCI_FDO_EXTENSION DeviceExtension) { - UNIMPLEMENTED; - while (TRUE); - return STATUS_NOT_SUPPORTED; + PDEVICE_CAPABILITIES Capabilities; + PAGED_CODE(); + ASSERT_FDO(DeviceExtension); + + /* Get the capabilities */ + Capabilities = IoStackLocation->Parameters.DeviceCapabilities.Capabilities; + + /* Inherit wake levels and power mappings from the higher-up capabilities */ + DeviceExtension->PowerState.SystemWakeLevel = Capabilities->SystemWake; + DeviceExtension->PowerState.DeviceWakeLevel = Capabilities->DeviceWake; + RtlCopyMemory(DeviceExtension->PowerState.SystemStateMapping, + Capabilities->DeviceState, + sizeof(DeviceExtension->PowerState.SystemStateMapping)); + + /* Dump the capabilities and return success */ + PciDebugDumpQueryCapabilities(Capabilities); + return STATUS_SUCCESS; } NTSTATUS @@ -422,6 +434,7 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT AttachedTo; PPCI_FDO_EXTENSION FdoExtension; PPCI_FDO_EXTENSION ParentExtension; + PPCI_PDO_EXTENSION PdoExtension; PDEVICE_OBJECT DeviceObject; UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)]; PKEY_VALUE_PARTIAL_INFORMATION ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)Buffer; @@ -435,6 +448,8 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, /* Zero out variables so failure path knows what to do */ AttachedTo = NULL; + FdoExtension = NULL; + PdoExtension = NULL; do { /* Check if there's already a device extension for this bus */ @@ -442,9 +457,44 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, &PciGlobalLock); if (ParentExtension) { - /* More than one PCI bus, this is not expected yet */ - UNIMPLEMENTED; - while (TRUE); + /* Make sure we find a real PDO */ + PdoExtension = PhysicalDeviceObject->DeviceExtension; + ASSERT_PDO(PdoExtension); + + /* Make sure it's a PCI-to-PCI bridge */ + if ((PdoExtension->BaseClass != PCI_CLASS_BRIDGE_DEV) || + (PdoExtension->SubClass != PCI_SUBCLASS_BR_PCI_TO_PCI)) + { + /* This should never happen */ + DPRINT1("PCI - PciAddDevice for Non-Root/Non-PCI-PCI bridge,\n" + " Class %02x, SubClass %02x, will not add.\n", + PdoExtension->BaseClass, + PdoExtension->SubClass); + ASSERT((PdoExtension->BaseClass == PCI_CLASS_BRIDGE_DEV) && + (PdoExtension->SubClass == PCI_SUBCLASS_BR_PCI_TO_PCI)); + + /* Enter the failure path */ + Status = STATUS_INVALID_DEVICE_REQUEST; + break; + } + + /* Subordinate bus on the bridge */ + DPRINT1("PCI - AddDevice (new bus is child of bus 0x%x).\n", + ParentExtension->BaseBus); + + /* Make sure PCI bus numbers are configured */ + if (!PciAreBusNumbersConfigured(PdoExtension)) + { + /* This is a critical failure */ + DPRINT1("PCI - Bus numbers not configured for bridge (0x%x.0x%x.0x%x)\n", + ParentExtension->BaseBus, + PdoExtension->Slot.u.bits.DeviceNumber, + PdoExtension->Slot.u.bits.FunctionNumber); + + /* Enter the failure path */ + Status = STATUS_INVALID_DEVICE_REQUEST; + break; + } } /* Create the FDO for the bus */ @@ -470,11 +520,15 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, ASSERT(AttachedTo != NULL); if (!AttachedTo) break; FdoExtension->AttachedDeviceObject = AttachedTo; + + /* Check if this is a child bus, or the root */ if (ParentExtension) { - /* More than one PCI bus, this is not expected yet */ - UNIMPLEMENTED; - while (TRUE); + /* The child inherits root data */ + FdoExtension->BaseBus = PdoExtension->Dependent.type1.SecondaryBus; + FdoExtension->BusRootFdoExtension = ParentExtension->BusRootFdoExtension; + PdoExtension->BridgeFdoExtension = FdoExtension; + FdoExtension->ParentFdoExtension = ParentExtension; } else { @@ -491,7 +545,9 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, { /* Root PDO in ReactOS does not assign boot resources */ UNIMPLEMENTED; - while (TRUE); +// while (TRUE); + DPRINT1("Encountered during setup\n"); + Descriptor = NULL; } if (Descriptor) @@ -506,15 +562,11 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, if (PciBreakOnDefault) { /* If a second bus is found and there's still no data, crash */ - #if 0 // ros bug? KeBugCheckEx(PCI_BUS_DRIVER_INTERNAL, 0xDEAD0010u, (ULONG_PTR)DeviceObject, 0, 0); - #else - DPRINT1("Windows would crash!\n"); - #endif } /* Warn that a default configuration will be used, and set bus 0 */ @@ -572,12 +624,16 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, /* The Bus FDO is now initialized */ DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; - DPRINT1("PCI Root FDO Added: %p %p\n", DeviceObject, FdoExtension); return STATUS_SUCCESS; } while (FALSE); /* This is the failure path */ ASSERT(!NT_SUCCESS(Status)); + + /* Check if the FDO extension exists */ + if (FdoExtension) DPRINT1("Should destroy secondaries\n"); + + /* Delete device objects */ if (AttachedTo) IoDetachDevice(AttachedTo); if (DeviceObject) IoDeleteDevice(DeviceObject); return Status;