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

state.c
Go to the documentation of this file.
00001 /*
00002  * PROJECT:         ReactOS PCI Bus Driver
00003  * LICENSE:         BSD - See COPYING.ARM in the top level directory
00004  * FILE:            drivers/bus/pci/pci/state.c
00005  * PURPOSE:         Bus/Device State Support
00006  * PROGRAMMERS:     ReactOS Portable Systems Group
00007  */
00008 
00009 /* INCLUDES *******************************************************************/
00010 
00011 #include <pci.h>
00012 #define NDEBUG
00013 #include <debug.h>
00014 
00015 /* GLOBALS ********************************************************************/
00016 
00017 PCHAR PciTransitionText[PciMaxObjectState + 1] =
00018 {
00019     "PciNotStarted",
00020     "PciStarted",
00021     "PciDeleted",
00022     "PciStopped",
00023     "PciSurpriseRemoved",
00024     "PciSynchronizedOperation",
00025     "PciMaxObjectState"
00026 };
00027 
00028 NTSTATUS PnpStateCancelArray[PciMaxObjectState] =
00029 {
00030     STATUS_INVALID_DEVICE_REQUEST,
00031     STATUS_FAIL_CHECK,
00032     STATUS_INVALID_DEVICE_STATE,
00033     STATUS_INVALID_DEVICE_STATE,
00034     STATUS_FAIL_CHECK,
00035     STATUS_FAIL_CHECK
00036 };
00037 
00038 NTSTATUS PnpStateTransitionArray[PciMaxObjectState * PciMaxObjectState] =
00039 {
00040     STATUS_SUCCESS,                 // Not Started -> Not Started
00041     STATUS_SUCCESS,                 // Started -> Not Started
00042     STATUS_FAIL_CHECK,              // Deleted -> Not Started
00043     STATUS_SUCCESS,                 // Stopped -> Not Started
00044     STATUS_FAIL_CHECK,              // Surprise Removed -> Not Started
00045     STATUS_FAIL_CHECK,              // Synchronized Operation -> Not Started
00046 
00047     STATUS_SUCCESS,                 // Not Started -> Started
00048     STATUS_FAIL_CHECK,              // Started -> Started
00049     STATUS_FAIL_CHECK,              // Deleted -> Started
00050     STATUS_SUCCESS,                 // Stopped -> Started
00051     STATUS_FAIL_CHECK,              // Surprise Removed -> Started
00052     STATUS_FAIL_CHECK,              // Synchronized Operation -> Started
00053 
00054     STATUS_SUCCESS,                 // Not Started -> Deleted
00055     STATUS_SUCCESS,                 // Started -> Deleted
00056     STATUS_FAIL_CHECK,              // Deleted -> Deleted
00057     STATUS_FAIL_CHECK,              // Stopped -> Deleted
00058     STATUS_SUCCESS,                 // Surprise Removed -> Deleted
00059     STATUS_FAIL_CHECK,              // Synchronized Operation -> Deleted
00060 
00061     STATUS_INVALID_DEVICE_REQUEST,  // Not Started -> Stopped
00062     STATUS_SUCCESS,                 // Started -> Stopped
00063     STATUS_FAIL_CHECK,              // Deleted -> Stopped
00064     STATUS_FAIL_CHECK,              // Stopped -> Stopped
00065     STATUS_FAIL_CHECK,              // Surprise Removed -> Stopped
00066     STATUS_FAIL_CHECK,              // Synchronized Operation -> Stopped
00067 
00068     STATUS_SUCCESS,                 // Not Started -> Surprise Removed
00069     STATUS_SUCCESS,                 // Started -> Surprise Removed
00070     STATUS_FAIL_CHECK,              // Deleted -> Surprise Removed
00071     STATUS_SUCCESS,                 // Stopped -> Surprise Removed
00072     STATUS_FAIL_CHECK,              // Surprise Removed -> Surprise Removed
00073     STATUS_FAIL_CHECK,              // Synchronized Operation -> Surprise Removed
00074 
00075     STATUS_SUCCESS,                 // Not Started -> Synchronized Operation
00076     STATUS_SUCCESS,                 // Started -> Synchronized Operation
00077     STATUS_INVALID_DEVICE_STATE,    // Deleted -> Synchronized Operation
00078     STATUS_SUCCESS,                 // Stopped -> Synchronized Operation
00079     STATUS_INVALID_DEVICE_STATE,    // Surprise Removed -> Synchronized Operation
00080     STATUS_FAIL_CHECK               // Synchronized Operation -> Synchronized Operation
00081 };
00082 
00083 /* FUNCTIONS ******************************************************************/
00084 
00085 VOID
00086 NTAPI
00087 PciInitializeState(IN PPCI_FDO_EXTENSION DeviceExtension)
00088 {
00089     /* Set the initial state */
00090     DeviceExtension->DeviceState = PciNotStarted;
00091     DeviceExtension->TentativeNextState = PciNotStarted;
00092 }
00093 
00094 NTSTATUS
00095 NTAPI
00096 PciBeginStateTransition(IN PPCI_FDO_EXTENSION DeviceExtension,
00097                         IN PCI_STATE NewState)
00098 {
00099     PCI_STATE CurrentState;
00100     NTSTATUS Status;
00101     DPRINT1("PCI Request to begin transition of Extension %p to %s ->",
00102             DeviceExtension,
00103             PciTransitionText[NewState]);
00104 
00105     /* Assert the device isn't already in a pending transition */
00106     ASSERT(DeviceExtension->TentativeNextState == DeviceExtension->DeviceState);
00107 
00108     /* Assert this is a valid state */
00109     CurrentState = DeviceExtension->DeviceState;
00110     ASSERT(CurrentState < PciMaxObjectState);
00111     ASSERT(NewState < PciMaxObjectState);
00112 
00113     /* Lookup if this state transition is valid */
00114     Status = PnpStateTransitionArray[CurrentState + 6 * NewState];
00115     if (Status == STATUS_FAIL_CHECK)
00116     {
00117         /* Invalid transition (logical fault) */
00118         DPRINT1("ERROR\nPCI: Error trying to enter state \"%s\" "
00119                 "from state \"%s\"\n",
00120                 PciTransitionText[NewState],
00121                 PciTransitionText[CurrentState]);
00122         DbgBreakPoint();
00123     }
00124     else if (Status == STATUS_INVALID_DEVICE_REQUEST)
00125     {
00126         /* Invalid transition (illegal request) */
00127         DPRINT1("ERROR\nPCI: Illegal request to try to enter state \"%s\" "
00128                 "from state \"%s\", rejecting",
00129                 PciTransitionText[NewState],
00130                 PciTransitionText[CurrentState]);
00131     }
00132 
00133     /* New state must be different from current, unless request is at fault */
00134     ASSERT((NewState != DeviceExtension->DeviceState) || (!NT_SUCCESS(Status)));
00135 
00136     /* Enter the new state if successful, and return state status */
00137     if (NT_SUCCESS(Status)) DeviceExtension->TentativeNextState = NewState;
00138     DbgPrint("%x\n", Status);
00139     return Status;
00140 }
00141 
00142 NTSTATUS
00143 NTAPI
00144 PciCancelStateTransition(IN PPCI_FDO_EXTENSION DeviceExtension,
00145                          IN PCI_STATE StateNotEntered)
00146 {
00147     NTSTATUS Status;
00148     DPRINT1("PCI Request to cancel transition of Extension %p to %s ->",
00149             DeviceExtension,
00150             PciTransitionText[StateNotEntered]);
00151 
00152     /* The next state can't be the state the device is already in */
00153     if (DeviceExtension->TentativeNextState == DeviceExtension->DeviceState)
00154     {
00155         /* It's too late since the state was already committed */
00156         ASSERT(StateNotEntered < PciMaxObjectState);
00157         ASSERT(PnpStateCancelArray[StateNotEntered] != STATUS_FAIL_CHECK);
00158 
00159         /* Return failure */
00160         Status = STATUS_INVALID_DEVICE_STATE;
00161         DbgPrint("%x\n", Status);
00162     }
00163     else
00164     {
00165         /* The device hasn't yet entered the state, so it's still possible to cancel */
00166         ASSERT(DeviceExtension->TentativeNextState == StateNotEntered);
00167         DeviceExtension->TentativeNextState = DeviceExtension->DeviceState;
00168 
00169         /* Return success */
00170         Status = STATUS_SUCCESS;
00171         DbgPrint("%x\n", Status);
00172     }
00173 
00174     /* Return the cancel state */
00175     return Status;
00176 }
00177 
00178 VOID
00179 NTAPI
00180 PciCommitStateTransition(IN PPCI_FDO_EXTENSION DeviceExtension,
00181                          IN PCI_STATE NewState)
00182 {
00183     DPRINT1("PCI Commit transition of Extension %p to %s\n",
00184             DeviceExtension, PciTransitionText[NewState]);
00185 
00186     /* Make sure this is a valid commit */
00187     ASSERT(NewState != PciSynchronizedOperation);
00188     ASSERT(DeviceExtension->TentativeNextState == NewState);
00189 
00190     /* Enter the new state */
00191     DeviceExtension->DeviceState = NewState;
00192 }
00193 
00194 /* EOF */

Generated on Sat May 26 2012 04:19:12 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.