ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

power.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.