MdeModulePkg: Enable reconnect request from action request or question flag.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17516 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -1884,6 +1884,30 @@ FindNextMenu (
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
Reconnect the controller.
|
||||
|
||||
@param DriverHandle The controller handle which need to be reconnect.
|
||||
|
||||
@retval TRUE do the reconnect behavior success.
|
||||
@retval FALSE do the reconnect behavior failed.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
ReconnectController (
|
||||
IN EFI_HANDLE DriverHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = gBS->DisconnectController(DriverHandle, NULL, NULL);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = gBS->ConnectController(DriverHandle, NULL, NULL, TRUE);
|
||||
}
|
||||
|
||||
return Status == EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Call the call back function for the question and process the return action.
|
||||
|
||||
@@ -2055,6 +2079,10 @@ ProcessCallBackFunction (
|
||||
SettingLevel = FormLevel;
|
||||
break;
|
||||
|
||||
case EFI_BROWSER_ACTION_REQUEST_RECONNECT:
|
||||
gCallbackReconnect = TRUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -2155,6 +2183,28 @@ ProcessCallBackFunction (
|
||||
}
|
||||
}
|
||||
|
||||
if (gCallbackReconnect && (EFI_BROWSER_ACTION_CHANGED == Action)) {
|
||||
//
|
||||
// Confirm changes with user first.
|
||||
//
|
||||
if (IsNvUpdateRequiredForFormSet(FormSet)) {
|
||||
if (BROWSER_ACTION_DISCARD == PopupErrorMessage(BROWSER_RECONNECT_SAVE_CHANGES, NULL, NULL, NULL)) {
|
||||
gCallbackReconnect = FALSE;
|
||||
DiscardFormIsRequired = TRUE;
|
||||
} else {
|
||||
SubmitFormIsRequired = TRUE;
|
||||
}
|
||||
} else {
|
||||
PopupErrorMessage(BROWSER_RECONNECT_REQUIRED, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
//
|
||||
// Exit current formset before do the reconnect.
|
||||
//
|
||||
NeedExit = TRUE;
|
||||
SettingLevel = FormSetLevel;
|
||||
}
|
||||
|
||||
if (SubmitFormIsRequired && !SkipSaveOrDiscard) {
|
||||
SubmitForm (FormSet, Form, SettingLevel);
|
||||
}
|
||||
@@ -2476,13 +2526,18 @@ SetupBrowser (
|
||||
}
|
||||
|
||||
//
|
||||
// If question has EFI_IFR_FLAG_RESET_REQUIRED flag and without storage and process question success till here,
|
||||
// trig the gResetFlag.
|
||||
// If question has EFI_IFR_FLAG_RESET_REQUIRED/EFI_IFR_FLAG_RECONNECT_REQUIRED flag and without storage
|
||||
// and process question success till here, trig the gResetFlag/gFlagReconnect.
|
||||
//
|
||||
if ((Status == EFI_SUCCESS) &&
|
||||
(Statement->Storage == NULL) &&
|
||||
((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0)) {
|
||||
gResetRequired = TRUE;
|
||||
(Statement->Storage == NULL)) {
|
||||
if ((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0) {
|
||||
gResetRequired = TRUE;
|
||||
}
|
||||
|
||||
if ((Statement->QuestionFlags & EFI_IFR_FLAG_RECONNECT_REQUIRED) != 0) {
|
||||
gFlagReconnect = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -55,6 +55,8 @@ LIST_ENTRY gBrowserSaveFailFormSetList = INITIALIZE_LIST_HEAD_VARIABLE (gBr
|
||||
BOOLEAN mSystemSubmit = FALSE;
|
||||
BOOLEAN gResetRequired;
|
||||
BOOLEAN gExitRequired;
|
||||
BOOLEAN gFlagReconnect;
|
||||
BOOLEAN gCallbackReconnect;
|
||||
BROWSER_SETTING_SCOPE gBrowserSettingScope = FormSetLevel;
|
||||
BOOLEAN mBrowserScopeFirstSet = TRUE;
|
||||
EXIT_HANDLER ExitHandlerFunction = NULL;
|
||||
@@ -483,6 +485,7 @@ SendForm (
|
||||
UINTN Index;
|
||||
FORM_BROWSER_FORMSET *FormSet;
|
||||
FORM_ENTRY_INFO *MenuList;
|
||||
BOOLEAN RetVal;
|
||||
|
||||
//
|
||||
// If EDKII_FORM_DISPLAY_ENGINE_PROTOCOL not found, return EFI_UNSUPPORTED.
|
||||
@@ -496,8 +499,10 @@ SendForm (
|
||||
//
|
||||
SaveBrowserContext ();
|
||||
|
||||
gFlagReconnect = FALSE;
|
||||
gResetRequired = FALSE;
|
||||
gExitRequired = FALSE;
|
||||
gCallbackReconnect = FALSE;
|
||||
Status = EFI_SUCCESS;
|
||||
gEmptyString = L"";
|
||||
gDisplayFormData.ScreenDimensions = (EFI_SCREEN_DESCRIPTOR *) ScreenDimensions;
|
||||
@@ -547,6 +552,15 @@ SendForm (
|
||||
gCurrentSelection = NULL;
|
||||
mSystemLevelFormSet = NULL;
|
||||
|
||||
if (gFlagReconnect || gCallbackReconnect) {
|
||||
RetVal = ReconnectController (FormSet->DriverHandle);
|
||||
if (!RetVal) {
|
||||
PopupErrorMessage(BROWSER_RECONNECT_FAIL, NULL, NULL, NULL);
|
||||
}
|
||||
gFlagReconnect = FALSE;
|
||||
gCallbackReconnect = FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// If no data is changed, don't need to save current FormSet into the maintain list.
|
||||
//
|
||||
@@ -2523,8 +2537,14 @@ UpdateFlagForForm (
|
||||
//
|
||||
// Only the changed data has been saved, then need to set the reset flag.
|
||||
//
|
||||
if (SetFlag && OldValue && !Question->ValueChanged && ((Question->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0)) {
|
||||
gResetRequired = TRUE;
|
||||
if (SetFlag && OldValue && !Question->ValueChanged) {
|
||||
if ((Question->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0) {
|
||||
gResetRequired = TRUE;
|
||||
}
|
||||
|
||||
if ((Question->QuestionFlags & EFI_IFR_FLAG_RECONNECT_REQUIRED) != 0) {
|
||||
gFlagReconnect = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5524,6 +5544,8 @@ SaveBrowserContext (
|
||||
//
|
||||
Context->Selection = gCurrentSelection;
|
||||
Context->ResetRequired = gResetRequired;
|
||||
Context->FlagReconnect = gFlagReconnect;
|
||||
Context->CallbackReconnect = gCallbackReconnect;
|
||||
Context->ExitRequired = gExitRequired;
|
||||
Context->HiiHandle = mCurrentHiiHandle;
|
||||
Context->FormId = mCurrentFormId;
|
||||
@@ -5579,6 +5601,8 @@ RestoreBrowserContext (
|
||||
//
|
||||
gCurrentSelection = Context->Selection;
|
||||
gResetRequired = Context->ResetRequired;
|
||||
gFlagReconnect = Context->FlagReconnect;
|
||||
gCallbackReconnect = Context->CallbackReconnect;
|
||||
gExitRequired = Context->ExitRequired;
|
||||
mCurrentHiiHandle = Context->HiiHandle;
|
||||
mCurrentFormId = Context->FormId;
|
||||
|
@@ -528,6 +528,8 @@ typedef struct {
|
||||
//
|
||||
// Globals defined in Setup.c
|
||||
//
|
||||
BOOLEAN FlagReconnect;
|
||||
BOOLEAN CallbackReconnect;
|
||||
BOOLEAN ResetRequired;
|
||||
BOOLEAN ExitRequired;
|
||||
EFI_HII_HANDLE HiiHandle;
|
||||
@@ -566,6 +568,8 @@ extern EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting;
|
||||
extern EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *mPathFromText;
|
||||
extern EDKII_FORM_DISPLAY_ENGINE_PROTOCOL *mFormDisplay;
|
||||
|
||||
extern BOOLEAN gCallbackReconnect;
|
||||
extern BOOLEAN gFlagReconnect;
|
||||
extern BOOLEAN gResetRequired;
|
||||
extern BOOLEAN gExitRequired;
|
||||
extern LIST_ENTRY gBrowserFormSetList;
|
||||
@@ -1831,4 +1835,18 @@ GetFstStgFromBrsStg (
|
||||
IN BROWSER_STORAGE *Storage
|
||||
);
|
||||
|
||||
/**
|
||||
Reconnect the controller.
|
||||
|
||||
@param DriverHandle The controller handle which need to be reconnect.
|
||||
|
||||
@retval TRUE do the reconnect behavior success.
|
||||
@retval FALSE do the reconnect behavior failed.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
ReconnectController (
|
||||
IN EFI_HANDLE DriverHandle
|
||||
);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user