Beispiel #1
0
NTSTATUS
Bus_FDO_Power (
    PFDO_DEVICE_DATA    Data,
    PIRP                Irp
)
{
    NTSTATUS            status = STATUS_SUCCESS;
    POWER_STATE         powerState;
    POWER_STATE_TYPE    powerType;
    PIO_STACK_LOCATION  stack;
    ULONG AcpiState;
    ACPI_STATUS AcpiStatus;
    SYSTEM_POWER_STATE  oldPowerState;

    stack = IoGetCurrentIrpStackLocation (Irp);
    powerType = stack->Parameters.Power.Type;
    powerState = stack->Parameters.Power.State;


    if (stack->MinorFunction == IRP_MN_SET_POWER) {
        DPRINT("\tRequest to set %s state to %s\n",
               ((powerType == SystemPowerState) ?  "System" : "Device"),
               ((powerType == SystemPowerState) ? \
                DbgSystemPowerString(powerState.SystemState) :\
                DbgDevicePowerString(powerState.DeviceState)));
    }

    if (powerType == SystemPowerState)
    {
        switch (powerState.SystemState) {
        case PowerSystemSleeping1:
            AcpiState = ACPI_STATE_S1;
            break;
        case PowerSystemSleeping2:
            AcpiState = ACPI_STATE_S2;
            break;
        case PowerSystemSleeping3:
            AcpiState = ACPI_STATE_S3;
            break;
        case PowerSystemHibernate:
            AcpiState = ACPI_STATE_S4;
            break;
        case PowerSystemShutdown:
            AcpiState = ACPI_STATE_S5;
            break;
        default:
            AcpiState = ACPI_STATE_UNKNOWN;
            ASSERT(FALSE);
            break;
        }
        oldPowerState = Data->Common.SystemPowerState;
        Data->Common.SystemPowerState = powerState.SystemState;
        AcpiStatus = acpi_suspend(AcpiState);
        if (!ACPI_SUCCESS(AcpiStatus)) {
            DPRINT1("Failed to enter sleep state %d (Status 0x%X)\n",
                    AcpiState, AcpiStatus);
            Data->Common.SystemPowerState = oldPowerState;
            status = STATUS_UNSUCCESSFUL;
        }
    }
    PoStartNextPowerIrp (Irp);
    IoSkipCurrentIrpStackLocation(Irp);
    status =  PoCallDriver (Data->NextLowerDriver, Irp);
    return status;
}