Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenpower.c
Go to the documentation of this file.
00001 #include <ntddk.h> 00002 00003 #include <acpi.h> 00004 #include <acpisys.h> 00005 00006 #include <acpi_bus.h> 00007 #include <acpi_drivers.h> 00008 00009 #define NDEBUG 00010 #include <debug.h> 00011 00012 NTSTATUS 00013 NTAPI 00014 Bus_Power ( 00015 PDEVICE_OBJECT DeviceObject, 00016 PIRP Irp 00017 ) 00018 { 00019 PIO_STACK_LOCATION irpStack; 00020 NTSTATUS status; 00021 PCOMMON_DEVICE_DATA commonData; 00022 00023 status = STATUS_SUCCESS; 00024 irpStack = IoGetCurrentIrpStackLocation (Irp); 00025 ASSERT (IRP_MJ_POWER == irpStack->MajorFunction); 00026 00027 commonData = (PCOMMON_DEVICE_DATA) DeviceObject->DeviceExtension; 00028 00029 if (commonData->IsFDO) { 00030 00031 DPRINT("FDO %s IRP:0x%p %s %s\n", 00032 PowerMinorFunctionString(irpStack->MinorFunction), Irp, 00033 DbgSystemPowerString(commonData->SystemPowerState), 00034 DbgDevicePowerString(commonData->DevicePowerState)); 00035 00036 00037 status = Bus_FDO_Power ((PFDO_DEVICE_DATA)DeviceObject->DeviceExtension, 00038 Irp); 00039 } else { 00040 00041 DPRINT("PDO %s IRP:0x%p %s %s\n", 00042 PowerMinorFunctionString(irpStack->MinorFunction), Irp, 00043 DbgSystemPowerString(commonData->SystemPowerState), 00044 DbgDevicePowerString(commonData->DevicePowerState)); 00045 00046 status = Bus_PDO_Power ((PPDO_DEVICE_DATA)DeviceObject->DeviceExtension, 00047 Irp); 00048 } 00049 00050 return status; 00051 } 00052 00053 00054 NTSTATUS 00055 Bus_FDO_Power ( 00056 PFDO_DEVICE_DATA Data, 00057 PIRP Irp 00058 ) 00059 { 00060 NTSTATUS status = STATUS_SUCCESS; 00061 POWER_STATE powerState; 00062 POWER_STATE_TYPE powerType; 00063 PIO_STACK_LOCATION stack; 00064 ULONG AcpiState; 00065 ACPI_STATUS AcpiStatus; 00066 SYSTEM_POWER_STATE oldPowerState; 00067 00068 stack = IoGetCurrentIrpStackLocation (Irp); 00069 powerType = stack->Parameters.Power.Type; 00070 powerState = stack->Parameters.Power.State; 00071 00072 00073 if (stack->MinorFunction == IRP_MN_SET_POWER) { 00074 DPRINT("\tRequest to set %s state to %s\n", 00075 ((powerType == SystemPowerState) ? "System" : "Device"), 00076 ((powerType == SystemPowerState) ? \ 00077 DbgSystemPowerString(powerState.SystemState) :\ 00078 DbgDevicePowerString(powerState.DeviceState))); 00079 } 00080 00081 if (powerType == SystemPowerState) 00082 { 00083 switch (powerState.SystemState) { 00084 case PowerSystemSleeping1: 00085 AcpiState = ACPI_STATE_S1; 00086 break; 00087 case PowerSystemSleeping2: 00088 AcpiState = ACPI_STATE_S2; 00089 break; 00090 case PowerSystemSleeping3: 00091 AcpiState = ACPI_STATE_S3; 00092 break; 00093 case PowerSystemHibernate: 00094 AcpiState = ACPI_STATE_S4; 00095 break; 00096 case PowerSystemShutdown: 00097 AcpiState = ACPI_STATE_S5; 00098 break; 00099 default: 00100 AcpiState = ACPI_STATE_UNKNOWN; 00101 ASSERT(FALSE); 00102 break; 00103 } 00104 oldPowerState = Data->Common.SystemPowerState; 00105 Data->Common.SystemPowerState = powerState.SystemState; 00106 AcpiStatus = acpi_suspend(AcpiState); 00107 if (!ACPI_SUCCESS(AcpiStatus)) { 00108 DPRINT1("Failed to enter sleep state %d (Status 0x%X)\n", 00109 AcpiState, AcpiStatus); 00110 Data->Common.SystemPowerState = oldPowerState; 00111 status = STATUS_UNSUCCESSFUL; 00112 } 00113 } 00114 PoStartNextPowerIrp (Irp); 00115 IoSkipCurrentIrpStackLocation(Irp); 00116 status = PoCallDriver (Data->NextLowerDriver, Irp); 00117 return status; 00118 } 00119 00120 00121 NTSTATUS 00122 Bus_PDO_Power ( 00123 PPDO_DEVICE_DATA PdoData, 00124 PIRP Irp 00125 ) 00126 { 00127 NTSTATUS status; 00128 PIO_STACK_LOCATION stack; 00129 POWER_STATE powerState; 00130 POWER_STATE_TYPE powerType; 00131 ULONG error; 00132 00133 stack = IoGetCurrentIrpStackLocation (Irp); 00134 powerType = stack->Parameters.Power.Type; 00135 powerState = stack->Parameters.Power.State; 00136 00137 switch (stack->MinorFunction) { 00138 case IRP_MN_SET_POWER: 00139 00140 DPRINT("\tSetting %s power state to %s\n", 00141 ((powerType == SystemPowerState) ? "System" : "Device"), 00142 ((powerType == SystemPowerState) ? \ 00143 DbgSystemPowerString(powerState.SystemState) : \ 00144 DbgDevicePowerString(powerState.DeviceState))); 00145 00146 switch (powerType) { 00147 case DevicePowerState: 00148 if (!PdoData->AcpiHandle || !acpi_bus_power_manageable(PdoData->AcpiHandle)) 00149 { 00150 PoSetPowerState(PdoData->Common.Self, DevicePowerState, powerState); 00151 PdoData->Common.DevicePowerState = powerState.DeviceState; 00152 status = STATUS_SUCCESS; 00153 break; 00154 } 00155 00156 switch (powerState.DeviceState) 00157 { 00158 case PowerDeviceD0: 00159 error = acpi_bus_set_power(PdoData->AcpiHandle, ACPI_STATE_D0); 00160 break; 00161 00162 case PowerDeviceD1: 00163 error = acpi_bus_set_power(PdoData->AcpiHandle, ACPI_STATE_D1); 00164 break; 00165 00166 case PowerDeviceD2: 00167 error = acpi_bus_set_power(PdoData->AcpiHandle, ACPI_STATE_D2); 00168 break; 00169 00170 case PowerDeviceD3: 00171 error = acpi_bus_set_power(PdoData->AcpiHandle, ACPI_STATE_D3); 00172 break; 00173 00174 default: 00175 error = 0; 00176 break; 00177 } 00178 00179 if (ACPI_SUCCESS(error)) 00180 { 00181 PoSetPowerState(PdoData->Common.Self, DevicePowerState, powerState); 00182 PdoData->Common.DevicePowerState = powerState.DeviceState; 00183 status = STATUS_SUCCESS; 00184 } 00185 else 00186 status = STATUS_UNSUCCESSFUL; 00187 break; 00188 00189 case SystemPowerState: 00190 PdoData->Common.SystemPowerState = powerState.SystemState; 00191 status = STATUS_SUCCESS; 00192 break; 00193 00194 default: 00195 status = STATUS_NOT_SUPPORTED; 00196 break; 00197 } 00198 break; 00199 00200 case IRP_MN_QUERY_POWER: 00201 status = STATUS_SUCCESS; 00202 break; 00203 00204 case IRP_MN_WAIT_WAKE: 00205 // 00206 // We cannot support wait-wake because we are root-enumerated 00207 // driver, and our parent, the PnP manager, doesn't support wait-wake. 00208 // 00209 case IRP_MN_POWER_SEQUENCE: 00210 default: 00211 status = STATUS_NOT_SUPPORTED; 00212 break; 00213 } 00214 00215 if (status != STATUS_NOT_SUPPORTED) { 00216 00217 Irp->IoStatus.Status = status; 00218 } 00219 00220 PoStartNextPowerIrp(Irp); 00221 status = Irp->IoStatus.Status; 00222 IoCompleteRequest (Irp, IO_NO_INCREMENT); 00223 00224 return status; 00225 } 00226 00227 #if !defined(NDEBUG) || defined(_MSC_VER) 00228 00229 PCHAR 00230 PowerMinorFunctionString ( 00231 UCHAR MinorFunction 00232 ) 00233 { 00234 switch (MinorFunction) 00235 { 00236 case IRP_MN_SET_POWER: 00237 return "IRP_MN_SET_POWER"; 00238 case IRP_MN_QUERY_POWER: 00239 return "IRP_MN_QUERY_POWER"; 00240 case IRP_MN_POWER_SEQUENCE: 00241 return "IRP_MN_POWER_SEQUENCE"; 00242 case IRP_MN_WAIT_WAKE: 00243 return "IRP_MN_WAIT_WAKE"; 00244 00245 default: 00246 return "unknown_power_irp"; 00247 } 00248 } 00249 00250 PCHAR 00251 DbgSystemPowerString( 00252 SYSTEM_POWER_STATE Type 00253 ) 00254 { 00255 switch (Type) 00256 { 00257 case PowerSystemUnspecified: 00258 return "PowerSystemUnspecified"; 00259 case PowerSystemWorking: 00260 return "PowerSystemWorking"; 00261 case PowerSystemSleeping1: 00262 return "PowerSystemSleeping1"; 00263 case PowerSystemSleeping2: 00264 return "PowerSystemSleeping2"; 00265 case PowerSystemSleeping3: 00266 return "PowerSystemSleeping3"; 00267 case PowerSystemHibernate: 00268 return "PowerSystemHibernate"; 00269 case PowerSystemShutdown: 00270 return "PowerSystemShutdown"; 00271 case PowerSystemMaximum: 00272 return "PowerSystemMaximum"; 00273 default: 00274 return "UnKnown System Power State"; 00275 } 00276 } 00277 00278 PCHAR 00279 DbgDevicePowerString( 00280 DEVICE_POWER_STATE Type 00281 ) 00282 { 00283 switch (Type) 00284 { 00285 case PowerDeviceUnspecified: 00286 return "PowerDeviceUnspecified"; 00287 case PowerDeviceD0: 00288 return "PowerDeviceD0"; 00289 case PowerDeviceD1: 00290 return "PowerDeviceD1"; 00291 case PowerDeviceD2: 00292 return "PowerDeviceD2"; 00293 case PowerDeviceD3: 00294 return "PowerDeviceD3"; 00295 case PowerDeviceMaximum: 00296 return "PowerDeviceMaximum"; 00297 default: 00298 return "UnKnown Device Power State"; 00299 } 00300 } 00301 00302 #endif Generated on Sun May 27 2012 04:24:29 for ReactOS by
1.7.6.1
|