7 #include <acpi_drivers.h>
15 PDEVICE_OBJECT DeviceObject
,
19 PIO_STACK_LOCATION irpStack
;
21 PCOMMON_DEVICE_DATA commonData
;
23 status
= STATUS_SUCCESS
;
24 irpStack
= IoGetCurrentIrpStackLocation (Irp
);
25 ASSERT (IRP_MJ_POWER
== irpStack
->MajorFunction
);
27 commonData
= (PCOMMON_DEVICE_DATA
) DeviceObject
->DeviceExtension
;
29 if (commonData
->IsFDO
) {
31 DPRINT("FDO %s IRP:0x%p %s %s\n",
32 PowerMinorFunctionString(irpStack
->MinorFunction
), Irp
,
33 DbgSystemPowerString(commonData
->SystemPowerState
),
34 DbgDevicePowerString(commonData
->DevicePowerState
));
37 status
= Bus_FDO_Power ((PFDO_DEVICE_DATA
)DeviceObject
->DeviceExtension
,
41 DPRINT("PDO %s IRP:0x%p %s %s\n",
42 PowerMinorFunctionString(irpStack
->MinorFunction
), Irp
,
43 DbgSystemPowerString(commonData
->SystemPowerState
),
44 DbgDevicePowerString(commonData
->DevicePowerState
));
46 status
= Bus_PDO_Power ((PPDO_DEVICE_DATA
)DeviceObject
->DeviceExtension
,
56 PFDO_DEVICE_DATA Data
,
60 NTSTATUS status
= STATUS_SUCCESS
;
61 POWER_STATE powerState
;
62 POWER_STATE_TYPE powerType
;
63 PIO_STACK_LOCATION stack
;
65 ACPI_STATUS AcpiStatus
;
66 SYSTEM_POWER_STATE oldPowerState
;
68 stack
= IoGetCurrentIrpStackLocation (Irp
);
69 powerType
= stack
->Parameters
.Power
.Type
;
70 powerState
= stack
->Parameters
.Power
.State
;
73 if (stack
->MinorFunction
== IRP_MN_SET_POWER
) {
74 DPRINT("\tRequest to set %s state to %s\n",
75 ((powerType
== SystemPowerState
) ? "System" : "Device"),
76 ((powerType
== SystemPowerState
) ? \
77 DbgSystemPowerString(powerState
.SystemState
) :\
78 DbgDevicePowerString(powerState
.DeviceState
)));
81 if (powerType
== SystemPowerState
)
83 switch (powerState
.SystemState
) {
84 case PowerSystemSleeping1
:
85 AcpiState
= ACPI_STATE_S1
;
87 case PowerSystemSleeping2
:
88 AcpiState
= ACPI_STATE_S2
;
90 case PowerSystemSleeping3
:
91 AcpiState
= ACPI_STATE_S3
;
93 case PowerSystemHibernate
:
94 AcpiState
= ACPI_STATE_S4
;
96 case PowerSystemShutdown
:
97 AcpiState
= ACPI_STATE_S5
;
100 AcpiState
= ACPI_STATE_UNKNOWN
;
104 oldPowerState
= Data
->Common
.SystemPowerState
;
105 Data
->Common
.SystemPowerState
= powerState
.SystemState
;
106 AcpiStatus
= acpi_suspend(AcpiState
);
107 if (!ACPI_SUCCESS(AcpiStatus
)) {
108 DPRINT1("Failed to enter sleep state %d (Status 0x%X)\n",
109 AcpiState
, AcpiStatus
);
110 Data
->Common
.SystemPowerState
= oldPowerState
;
111 status
= STATUS_UNSUCCESSFUL
;
114 PoStartNextPowerIrp (Irp
);
115 IoSkipCurrentIrpStackLocation(Irp
);
116 status
= PoCallDriver (Data
->NextLowerDriver
, Irp
);
123 PPDO_DEVICE_DATA PdoData
,
128 PIO_STACK_LOCATION stack
;
129 POWER_STATE powerState
;
130 POWER_STATE_TYPE powerType
;
133 stack
= IoGetCurrentIrpStackLocation (Irp
);
134 powerType
= stack
->Parameters
.Power
.Type
;
135 powerState
= stack
->Parameters
.Power
.State
;
137 switch (stack
->MinorFunction
) {
138 case IRP_MN_SET_POWER
:
140 DPRINT("\tSetting %s power state to %s\n",
141 ((powerType
== SystemPowerState
) ? "System" : "Device"),
142 ((powerType
== SystemPowerState
) ? \
143 DbgSystemPowerString(powerState
.SystemState
) : \
144 DbgDevicePowerString(powerState
.DeviceState
)));
147 case DevicePowerState
:
148 if (!PdoData
->AcpiHandle
|| !acpi_bus_power_manageable(PdoData
->AcpiHandle
))
150 PoSetPowerState(PdoData
->Common
.Self
, DevicePowerState
, powerState
);
151 PdoData
->Common
.DevicePowerState
= powerState
.DeviceState
;
152 status
= STATUS_SUCCESS
;
156 switch (powerState
.DeviceState
)
159 error
= acpi_bus_set_power(PdoData
->AcpiHandle
, ACPI_STATE_D0
);
163 error
= acpi_bus_set_power(PdoData
->AcpiHandle
, ACPI_STATE_D1
);
167 error
= acpi_bus_set_power(PdoData
->AcpiHandle
, ACPI_STATE_D2
);
171 error
= acpi_bus_set_power(PdoData
->AcpiHandle
, ACPI_STATE_D3
);
179 if (ACPI_SUCCESS(error
))
181 PoSetPowerState(PdoData
->Common
.Self
, DevicePowerState
, powerState
);
182 PdoData
->Common
.DevicePowerState
= powerState
.DeviceState
;
183 status
= STATUS_SUCCESS
;
186 status
= STATUS_UNSUCCESSFUL
;
189 case SystemPowerState
:
190 PdoData
->Common
.SystemPowerState
= powerState
.SystemState
;
191 status
= STATUS_SUCCESS
;
195 status
= STATUS_NOT_SUPPORTED
;
200 case IRP_MN_QUERY_POWER
:
201 status
= STATUS_SUCCESS
;
204 case IRP_MN_WAIT_WAKE
:
206 // We cannot support wait-wake because we are root-enumerated
207 // driver, and our parent, the PnP manager, doesn't support wait-wake.
209 case IRP_MN_POWER_SEQUENCE
:
211 status
= STATUS_NOT_SUPPORTED
;
215 if (status
!= STATUS_NOT_SUPPORTED
) {
217 Irp
->IoStatus
.Status
= status
;
220 PoStartNextPowerIrp(Irp
);
221 status
= Irp
->IoStatus
.Status
;
222 IoCompleteRequest (Irp
, IO_NO_INCREMENT
);
230 PowerMinorFunctionString (
234 switch (MinorFunction
)
236 case IRP_MN_SET_POWER
:
237 return "IRP_MN_SET_POWER";
238 case IRP_MN_QUERY_POWER
:
239 return "IRP_MN_QUERY_POWER";
240 case IRP_MN_POWER_SEQUENCE
:
241 return "IRP_MN_POWER_SEQUENCE";
242 case IRP_MN_WAIT_WAKE
:
243 return "IRP_MN_WAIT_WAKE";
246 return "unknown_power_irp";
251 DbgSystemPowerString(
252 SYSTEM_POWER_STATE Type
257 case PowerSystemUnspecified
:
258 return "PowerSystemUnspecified";
259 case PowerSystemWorking
:
260 return "PowerSystemWorking";
261 case PowerSystemSleeping1
:
262 return "PowerSystemSleeping1";
263 case PowerSystemSleeping2
:
264 return "PowerSystemSleeping2";
265 case PowerSystemSleeping3
:
266 return "PowerSystemSleeping3";
267 case PowerSystemHibernate
:
268 return "PowerSystemHibernate";
269 case PowerSystemShutdown
:
270 return "PowerSystemShutdown";
271 case PowerSystemMaximum
:
272 return "PowerSystemMaximum";
274 return "UnKnown System Power State";
279 DbgDevicePowerString(
280 DEVICE_POWER_STATE Type
285 case PowerDeviceUnspecified
:
286 return "PowerDeviceUnspecified";
288 return "PowerDeviceD0";
290 return "PowerDeviceD1";
292 return "PowerDeviceD2";
294 return "PowerDeviceD3";
295 case PowerDeviceMaximum
:
296 return "PowerDeviceMaximum";
298 return "UnKnown Device Power State";