Author: cgutman Date: Sun May 18 08:54:32 2014 New Revision: 63349
URL: http://svn.reactos.org/svn/reactos?rev=63349&view=rev Log: [ACPI] - Handle IRP_MN_CANCEL_REMOVE_DEVICE, IRP_MN_QUERY_REMOVE_DEVICE, and IRP_MN_REMOVE_DEVICE for child devices - Fixes issues loading new drivers for ACPI-enumerated devices
Modified: trunk/reactos/drivers/bus/acpi/buspdo.c trunk/reactos/drivers/bus/acpi/include/acpisys.h
Modified: trunk/reactos/drivers/bus/acpi/buspdo.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/buspdo.c?r... ============================================================================== --- trunk/reactos/drivers/bus/acpi/buspdo.c [iso-8859-1] (original) +++ trunk/reactos/drivers/bus/acpi/buspdo.c [iso-8859-1] Sun May 18 08:54:32 2014 @@ -165,6 +165,42 @@ } status = STATUS_SUCCESS;// We must not fail this IRP. break; + + case IRP_MN_REMOVE_DEVICE: + // + // We handle REMOVE_DEVICE just like STOP_DEVICE. This is because + // the device is still physically present (or at least we don't know any better) + // so we have to retain the PDO after stopping and removing power from it. + // + if (DeviceData->InterfaceName.Length != 0) + IoSetDeviceInterfaceState(&DeviceData->InterfaceName, FALSE); + + if (DeviceData->AcpiHandle && acpi_bus_power_manageable(DeviceData->AcpiHandle) && + !ACPI_SUCCESS(acpi_bus_set_power(DeviceData->AcpiHandle, ACPI_STATE_D3))) + { + DPRINT1("Device %x failed to enter D3!\n", DeviceData->AcpiHandle); + state.DeviceState = PowerDeviceD3; + PoSetPowerState(DeviceData->Common.Self, DevicePowerState, state); + DeviceData->Common.DevicePowerState = PowerDeviceD3; + } + + SET_NEW_PNP_STATE(DeviceData->Common, Stopped); + status = STATUS_SUCCESS; + break; + + case IRP_MN_QUERY_REMOVE_DEVICE: + SET_NEW_PNP_STATE(DeviceData->Common, RemovalPending); + status = STATUS_SUCCESS; + break; + + case IRP_MN_CANCEL_REMOVE_DEVICE: + if (RemovalPending == DeviceData->Common.DevicePnPState) + { + RESTORE_PREVIOUS_PNP_STATE(DeviceData->Common); + } + status = STATUS_SUCCESS; + break; + case IRP_MN_QUERY_CAPABILITIES:
//
Modified: trunk/reactos/drivers/bus/acpi/include/acpisys.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/include/ac... ============================================================================== --- trunk/reactos/drivers/bus/acpi/include/acpisys.h [iso-8859-1] (original) +++ trunk/reactos/drivers/bus/acpi/include/acpisys.h [iso-8859-1] Sun May 18 08:54:32 2014 @@ -13,6 +13,7 @@ Started, // Device has received the START_DEVICE IRP StopPending, // Device has received the QUERY_STOP IRP Stopped, // Device has received the STOP_DEVICE IRP + RemovalPending, // Device has received the QUERY_REMOVE IRP UnKnown // Unknown state
} DEVICE_PNP_STATE;