9 PDEVICE_OBJECT DeviceObject
,
13 PIO_STACK_LOCATION irpStack
;
15 PCOMMON_DEVICE_DATA commonData
;
17 status
= STATUS_SUCCESS
;
18 irpStack
= IoGetCurrentIrpStackLocation (Irp
);
19 ASSERT (IRP_MJ_POWER
== irpStack
->MajorFunction
);
21 commonData
= (PCOMMON_DEVICE_DATA
) DeviceObject
->DeviceExtension
;
23 if (commonData
->IsFDO
) {
25 DPRINT("FDO %s IRP:0x%p %s %s\n",
26 PowerMinorFunctionString(irpStack
->MinorFunction
), Irp
,
27 DbgSystemPowerString(commonData
->SystemPowerState
),
28 DbgDevicePowerString(commonData
->DevicePowerState
));
31 status
= Bus_FDO_Power ((PFDO_DEVICE_DATA
)DeviceObject
->DeviceExtension
,
35 DPRINT("PDO %s IRP:0x%p %s %s\n",
36 PowerMinorFunctionString(irpStack
->MinorFunction
), Irp
,
37 DbgSystemPowerString(commonData
->SystemPowerState
),
38 DbgDevicePowerString(commonData
->DevicePowerState
));
40 status
= Bus_PDO_Power ((PPDO_DEVICE_DATA
)DeviceObject
->DeviceExtension
,
50 PFDO_DEVICE_DATA Data
,
54 NTSTATUS status
= STATUS_SUCCESS
;
55 POWER_STATE powerState
;
56 POWER_STATE_TYPE powerType
;
57 PIO_STACK_LOCATION stack
;
59 ACPI_STATUS AcpiStatus
;
60 SYSTEM_POWER_STATE oldPowerState
;
62 stack
= IoGetCurrentIrpStackLocation (Irp
);
63 powerType
= stack
->Parameters
.Power
.Type
;
64 powerState
= stack
->Parameters
.Power
.State
;
67 if (stack
->MinorFunction
== IRP_MN_SET_POWER
) {
68 DPRINT("\tRequest to set %s state to %s\n",
69 ((powerType
== SystemPowerState
) ? "System" : "Device"),
70 ((powerType
== SystemPowerState
) ? \
71 DbgSystemPowerString(powerState
.SystemState
) :\
72 DbgDevicePowerString(powerState
.DeviceState
)));
74 if (powerType
== SystemPowerState
)
76 switch (powerState
.SystemState
) {
77 case PowerSystemSleeping1
:
78 AcpiState
= ACPI_STATE_S1
;
80 case PowerSystemSleeping2
:
81 AcpiState
= ACPI_STATE_S2
;
83 case PowerSystemSleeping3
:
84 AcpiState
= ACPI_STATE_S3
;
86 case PowerSystemHibernate
:
87 AcpiState
= ACPI_STATE_S4
;
89 case PowerSystemShutdown
:
90 AcpiState
= ACPI_STATE_S5
;
93 AcpiState
= ACPI_STATE_UNKNOWN
;
97 oldPowerState
= Data
->Common
.SystemPowerState
;
98 Data
->Common
.SystemPowerState
= powerState
.SystemState
;
99 AcpiStatus
= acpi_suspend(AcpiState
);
100 if (!ACPI_SUCCESS(AcpiStatus
)) {
101 DPRINT1("Failed to enter sleep state %d (Status 0x%X)\n",
102 AcpiState
, AcpiStatus
);
103 Data
->Common
.SystemPowerState
= oldPowerState
;
104 status
= STATUS_UNSUCCESSFUL
;
108 PoStartNextPowerIrp (Irp
);
109 IoSkipCurrentIrpStackLocation(Irp
);
110 status
= PoCallDriver (Data
->NextLowerDriver
, Irp
);
117 PPDO_DEVICE_DATA PdoData
,
122 PIO_STACK_LOCATION stack
;
123 POWER_STATE powerState
;
124 POWER_STATE_TYPE powerType
;
127 stack
= IoGetCurrentIrpStackLocation (Irp
);
128 powerType
= stack
->Parameters
.Power
.Type
;
129 powerState
= stack
->Parameters
.Power
.State
;
131 switch (stack
->MinorFunction
) {
132 case IRP_MN_SET_POWER
:
134 DPRINT("\tSetting %s power state to %s\n",
135 ((powerType
== SystemPowerState
) ? "System" : "Device"),
136 ((powerType
== SystemPowerState
) ? \
137 DbgSystemPowerString(powerState
.SystemState
) : \
138 DbgDevicePowerString(powerState
.DeviceState
)));
141 case DevicePowerState
:
142 if (!PdoData
->AcpiHandle
|| !acpi_bus_power_manageable(PdoData
->AcpiHandle
))
144 PoSetPowerState(PdoData
->Common
.Self
, DevicePowerState
, powerState
);
145 PdoData
->Common
.DevicePowerState
= powerState
.DeviceState
;
146 status
= STATUS_SUCCESS
;
150 switch (powerState
.DeviceState
)
153 error
= acpi_bus_set_power(PdoData
->AcpiHandle
, ACPI_STATE_D0
);
157 error
= acpi_bus_set_power(PdoData
->AcpiHandle
, ACPI_STATE_D1
);
161 error
= acpi_bus_set_power(PdoData
->AcpiHandle
, ACPI_STATE_D2
);
165 error
= acpi_bus_set_power(PdoData
->AcpiHandle
, ACPI_STATE_D3
);
173 if (ACPI_SUCCESS(error
))
175 PoSetPowerState(PdoData
->Common
.Self
, DevicePowerState
, powerState
);
176 PdoData
->Common
.DevicePowerState
= powerState
.DeviceState
;
177 status
= STATUS_SUCCESS
;
180 status
= STATUS_UNSUCCESSFUL
;
183 case SystemPowerState
:
184 PdoData
->Common
.SystemPowerState
= powerState
.SystemState
;
185 status
= STATUS_SUCCESS
;
189 status
= STATUS_NOT_SUPPORTED
;
194 case IRP_MN_QUERY_POWER
:
195 status
= STATUS_SUCCESS
;
198 case IRP_MN_WAIT_WAKE
:
200 // We cannot support wait-wake because we are root-enumerated
201 // driver, and our parent, the PnP manager, doesn't support wait-wake.
203 case IRP_MN_POWER_SEQUENCE
:
205 status
= STATUS_NOT_SUPPORTED
;
209 if (status
!= STATUS_NOT_SUPPORTED
) {
211 Irp
->IoStatus
.Status
= status
;
214 PoStartNextPowerIrp(Irp
);
215 status
= Irp
->IoStatus
.Status
;
216 IoCompleteRequest (Irp
, IO_NO_INCREMENT
);
221 #if !defined(NDEBUG) || defined(_MSC_VER)
224 PowerMinorFunctionString (
228 switch (MinorFunction
)
230 case IRP_MN_SET_POWER
:
231 return "IRP_MN_SET_POWER";
232 case IRP_MN_QUERY_POWER
:
233 return "IRP_MN_QUERY_POWER";
234 case IRP_MN_POWER_SEQUENCE
:
235 return "IRP_MN_POWER_SEQUENCE";
236 case IRP_MN_WAIT_WAKE
:
237 return "IRP_MN_WAIT_WAKE";
240 return "unknown_power_irp";
245 DbgSystemPowerString(
246 SYSTEM_POWER_STATE Type
251 case PowerSystemUnspecified
:
252 return "PowerSystemUnspecified";
253 case PowerSystemWorking
:
254 return "PowerSystemWorking";
255 case PowerSystemSleeping1
:
256 return "PowerSystemSleeping1";
257 case PowerSystemSleeping2
:
258 return "PowerSystemSleeping2";
259 case PowerSystemSleeping3
:
260 return "PowerSystemSleeping3";
261 case PowerSystemHibernate
:
262 return "PowerSystemHibernate";
263 case PowerSystemShutdown
:
264 return "PowerSystemShutdown";
265 case PowerSystemMaximum
:
266 return "PowerSystemMaximum";
268 return "UnKnown System Power State";
273 DbgDevicePowerString(
274 DEVICE_POWER_STATE Type
279 case PowerDeviceUnspecified
:
280 return "PowerDeviceUnspecified";
282 return "PowerDeviceD0";
284 return "PowerDeviceD1";
286 return "PowerDeviceD2";
288 return "PowerDeviceD3";
289 case PowerDeviceMaximum
:
290 return "PowerDeviceMaximum";
292 return "UnKnown Device Power State";