Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenstate.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
1.7.6.1
|